সি (বা সাধারণ পদ্ধতিতে প্রোগ্রামিং প্রোগ্রামিং) এর জন্য নীতিমালা, সেরা অনুশীলন এবং ডিজাইনের প্যাটার্নগুলি? [বন্ধ]


92

সি প্রকল্প ডিজাইন করার সময় এমন কোনও পরিচিত নকশার নীতি, সেরা-অনুশীলন এবং ডিজাইনের ধরণগুলি অনুসরণ করা যেতে পারে? বা সাধারণ পদ্ধতিগত (প্রয়োজনীয়) প্রোগ্রামিংয়ের জন্য দরকারী নকশার নীতিগুলি?

(আমি 'অবজেক্ট-ভিত্তিক প্রজন্মের' সন্তানের এবং প্রথমবারের জন্য একটি বৃহত সি প্রকল্প ডিজাইন করতে হবে)


4
: আপনি এই প্রশ্নের anwsers আগ্রহী হতে পারেন stackoverflow.com/questions/661307/...
mouviciel

7
আমি আমার প্রশ্ন পোস্ট করার আগে আমি কিছু ইন্টারনেট এবং বিশ্ববিদ্যালয় গ্রন্থাগার গবেষণা করেছি, এবং অবশ্যই সি এর জন্য সফ্টওয়্যার ডিজাইন সম্পর্কিত বইগুলি নিয়ে অভিভূত হইনি আমি আপনাকে আপনার প্রিয় (সাধারণ সি বইগুলির বিষয়ে কথা বলছি না, অর্থপূর্ণ পরিবর্তনশীলের মতো কোডিং কনভেনশন সম্পর্কে কথা বলছি না) নাম, তবে উচ্চতর বিমূর্ততা সম্পর্কে, সফ্টওয়্যার আর্কিটেকচার স্তর)। তদ্ব্যতীত, আমি আপনার 'অন্যান্য লোকের উপর নির্ভর "তিরস্কারের সাথে একমত নই। আপনার অর্থ হ'ল প্রতিটি প্রোগ্রামারকে নিজের দ্বারা সেরা অনুশীলন এবং ভাল ডিজাইনের ধরণ সম্পর্কে সন্ধান করা উচিত? এটি নিশ্চিতভাবেই এমন একটি প্রশ্ন যার উপর অন্যের অভিজ্ঞতা ব্যবহার করতে হবে।
দিমি

4
দুঃখিত, ডিমি, এটি আপনার সম্পর্কে বিশেষভাবে ছিল না এবং আমি খুব পরিষ্কার ছিলাম না। এই জিনিসগুলি মৌখিক traditionতিহ্য হিসাবে অন্য যে কোনও উপায়ে নষ্ট করা হত: অফিসিয়াল "প্যাটার্নস" এর নামমাত্র সেট ছিল না, জোনাথনের উত্তর ছিল যে বইগুলিতে আপনি কী খুঁজে পেয়েছেন, তবে সবাই তথ্য গোপনের বিষয়ে জানতেন। মনে হচ্ছে মৌখিক traditionতিহ্যটি নষ্ট হচ্ছে, এবং অনেক তরুণ প্রোগ্রামাররা মনে করেন যে ওওপি এনক্যাপসুলেশন এবং পৃথকীকরণ আবিষ্কার করেছিল। আমি দেখতে চাই না এই সম্প্রদায়ের নিজস্ব ইতিহাস সম্পর্কে কম ধারণা আছে বলে মনে হয়। এইভাবে আমার স্বীকৃতি যে আমি বুড়ো বয়সী লোকের অঞ্চলে আছি।
dmckee --- প্রাক্তন মডারেটর বিড়ালছানা

4
মাঠে আমার পা কেবল খুঁজে পাওয়ার পরে আমি আপনার পূর্ববর্তী অবস্থানটি ভাগ করতে পারি না, তবে আমি আপনার পরামর্শ গ্রহণ করি। নিজেকে আরও স্পষ্টভাবে প্রকাশ করার জন্য, অভিজ্ঞ ব্যক্তির দৃষ্টিভঙ্গি পড়ার জন্য সর্বদা দুর্দান্ত মূল্যবান বলে ধন্যবাদ। আমি সত্যিই আপনার অবদান প্রশংসা করি।
দিমি

এসইআই সিআরটি সি কোডিং স্ট্যান্ডার্ড ভাল নিয়ম এবং প্রচলিত ভাল অভ্যাসের পাশাপাশি আপনার ব্যবহারগুলি এড়াতে চেষ্টা করা উচিত এমন জিনিসগুলি সরবরাহ করে।
রামি 14

উত্তর:


65

তথ্য গোপন করা - যেমন পার্নাস ( সফ্টওয়্যার ফান্ডামেন্টালস ) দ্বারা সজ্জিত ।

শিরোনাম এবং দৃশ্যমানতার যত্ন সহকারে পরিচালনা:

  • বাইরের বিশ্ব থেকে লুকানো যায় এমন উত্স ফাইলে থাকা সমস্ত কিছু হওয়া উচিত; কেবল নথিভুক্ত বাহ্যিক ইন্টারফেস উন্মুক্ত করা উচিত।
  • প্রকাশিত সমস্ত কিছু শিরোনামে ঘোষণা করা হয়।
  • কার্যকরীতা যেখানে প্রয়োজন সেখানে হেডারটি ব্যবহৃত হয় (এবং যেখানে এটি সংজ্ঞায়িত হয়)।
  • শিরোনামটি স্বয়ংসম্পূর্ণ - যখন আপনার এটির প্রয়োজন হয়, আপনি এটি ব্যবহার করেন এবং আপনাকে 'অন্যান্য শিরোনামগুলিতে আমাকে কী অন্তর্ভুক্ত করতে হবে' তা নিয়ে বিড়ম্বনা করতে হবে না কারণ শিরোনাম এটির প্রয়োজনীয় যা কিছু অন্তর্ভুক্ত করে এটি কাজ করে তা নিশ্চিত করে কাজ।
  • শিরোনামটি স্ব-সুরক্ষিত - সুতরাং এটি একাধিকবার অন্তর্ভুক্ত করা হলেও তাতে কিছু আসে যায় না।

    #ifndef HEADER_H_INCLUDED
    #define HEADER_H_INCLUDED
    ...rest of header contents, including other #include lines if necessary
    #endif /* HEADER_H_INCLUDED */
    
  • 'অবজেক্টস' (সাধারণত স্ট্রাকচার) - এ কাজ করার জন্য ফাংশনগুলির সেটগুলি ডিজাইন করুন এবং কাঠামোর অভ্যন্তরের অভ্যন্তরে পোকার পরিবর্তে এটি ব্যবহার করছে এমন ফাংশনগুলি ব্যবহার করুন। এটিকে স্ব-চাপিত এনক্যাপসুলেশন হিসাবে ভাবেন।


ভাল কথা, আপনাকে ধন্যবাদ, জনাথন। অ্যাবস্ট্রাক্ট ডেটা ধরণের তথ্য এবং প্রয়োগের পরিষ্কার বিচ্ছিন্নতা (পরিচিত বাহ্যিক ইন্টারফেস এবং অজানা অভ্যন্তরীণ বাস্তবায়ন) সহ তথ্য গোপন করার আরও একটি ভাল উদাহরণ।
দিমি

23

আমার তিনটি পরামর্শ:

  • ইউনিট পরীক্ষা লিখুন। তারা আপনাকে এমন ডিজাইনে শূন্য করতে সহায়তা করবে যা আপনি এগিয়ে যাওয়ার সাথে সাথে আপনার সমস্যার সাথে স্যুট করে। প্রাক-ধ্যানমূলক চিন্তাধারার উপর নির্ভর করা (একমাত্র) থেকে অনেক ভাল।
  • মেমোরি ফাঁস সনাক্তকারী (সেখানে সমস্ত ধরণের গ্রন্থাগার রয়েছে) ইনস্টল করা আছে এবং প্রথম দিন থেকেই চলছে। প্রোগ্রাম / পরীক্ষাগুলি প্রস্থান করার সাথে সাথে এই লাইব্রেরিটি সমস্ত ফাঁস মুদ্রণ করতে দিন। এটি আপনাকে প্রবর্তন করার সাথে সাথেই আপনি একটি ফাঁস ধরতে পারবেন, যার ফলে এটি ঠিক করা খুব কম বেদনাদায়ক হয়ে উঠবে।
  • সি তে ওওপি কোড লিখুন ততটা কঠিন নয়। পদ্ধতিটি ওভাররাইডিং অনুকরণ করা সম্ভব হলেও, আমি আপনাকে সহজ জিনিসগুলির অনুকরণ দিয়ে শুরু করার পরামর্শ দিই। এমনকি এই সাধারণ প্রক্রিয়াটি আপনাকে দুর্দান্ত মাইলেজ দিতে পারে।

এখানে একটি উদাহরণ:

typedef struct Vector {
  int size;
  int limit;
  int* ints; 
} Vector;

Vector* Vector_new() {
  Vector* res = (Vector*) malloc(sizeof(Vector));
  res->limit = 10;
  res->size = 0;
  res->ints = (int*) malloc(sizeof(int) * res.limit);

  return res;
}


void Vector_destroy(Vector* v) {
  free(v->ints);
  free(v);
}

void Vector_add(Vector* v, int n) {
  if(v->size == v->limit) {
    v->limit = v->limit * 2 + 10;
    v->ints = realloc(v->ints, v->limit);     
  }

  v->ints[v->size] = n;
  ++v->size;
}

int Vector_get(Vector* v, int index) {
  if(index >= 0 && index < v->size)
    return v->ints[index];

  assert false;
}

আপনাকে ধন্যবাদ, Itay। আমি আপনার পরামর্শ অনুসরণ করব।
দিমি

4
৪. ফলাফলটি ফেলবেন না malloc
এসএস আন

22

এএনএসআই-সি-এর সাথে অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং নামে একটি ভাল, নিখরচায়, অনলাইন বই রয়েছে, যা সিতে অবজেক্ট-ওরিয়েন্টেড কোড লেখার বিষয়টিকে অন্তর্ভুক্ত করে "অবজেক্ট-ওরিয়েন্টেড সি" এর জন্য একটি গুগল অনুসন্ধান থেকেও আরও বেশ কিছু ভাল ফল পাওয়া যায় উদাহরণ এবং সংস্থান।

যদি আপনার প্রকল্পটি সুরক্ষা-সমালোচনা করে থাকে, তবে মিশ্র-সি একটি নিয়মের একটি ভাল সেট। এটি বেশিরভাগ এম্বেড থাকা সি এর জন্য উদ্দিষ্ট, তবে এটি অন্যান্য ক্ষেত্রেও কার্যকর হতে পারে।

আমি নিজেকে একটি ওও কোডার হিসাবে বিবেচনা করি এবং এম্বেড-সি দিয়ে আমি প্রচুর কাজ করি। আমি সবচেয়ে ভাল পরামর্শ দিতে পারি, বিশেষত বড় প্রকল্পগুলির জন্য, এটি অতিরিক্ত পরিমাণে না। এএনএসআই সি এর শীর্ষে একটি সম্পূর্ণ ওও কাঠামো তৈরি করা খুব লোভনীয় হতে পারে তবে এটি সঠিক হতে সময় এবং প্রচুর প্রচেষ্টা লাগে। আপনি যে ফ্যানসিয়ারটি পাবেন তত বেশি সময় আপনি বাস্তব প্রকল্পে কাজ না করে আপনার কাঠামো ডিবাগ করতে ব্যয় করবেন । একটি পরিষ্কার মাথা এবং YAGNI এর একটি ভাল, দৃ solid় উপলব্ধি সহ কার্যের দিকে এগিয়ে যান । ভাগ্য সুপ্রসন্ন হোক!


আপনাকে ধন্যবাদ, ই জেমস। আমি এএনএসআই সি এর শীর্ষে কোনও অবজেক্ট-ভিত্তিক কাঠামো তৈরি করতে চাই না, তবে বিশেষ এবং উপযুক্ত পদ্ধতিগত প্রোগ্রামিং প্রোগ্রামিং ডিজাইনের নীতিগুলির সন্ধান করুন। MISRA-C ইঙ্গিতটি খুব কার্যকর, বিশেষত কারণ এটি আসলে একটি এমবেডেড প্রকল্প। আমি এটি ঘনিষ্ঠভাবে দেখতে যাচ্ছি।
দিমি

আহ, এম্বেড করা সি এর আনন্দগুলি ভুলে যাবেন না যে আপনাকে আপনার ফাংশনের শীর্ষে (বা কোনও { }ব্লকের শীর্ষে ) আপনার ভেরিয়েবলগুলি ঘোষণা করতে হবে । সে আমাকে সর্বদা একবার বা দু'বার কামড়ায়:)
জেমস

6

ওওপি একটি প্রযুক্তি নয় প্রযুক্তি। সুতরাং আমার প্রথম পরামর্শটি হ'ল এটি প্রক্রিয়াজাতীয় প্রোগ্রামিং হিসাবে ভাবা বন্ধ করুন।

ই জেমস এর বক্তব্য, আপনি চেষ্টা করে আবার কোনও বস্তু-কেন্দ্রিক ভাষা তৈরি করতে চাইবেন না বা ভেবে দেখবেন যে এর সক্ষমতা রয়েছে। আপনি কয়েকটি সাধারণ নীতিকে আঁকড়ে ধরে এখনও সঠিক জিনিসগুলি করতে পারেন:

  1. টেস্ট ড্রাইভ সব।
  2. কি পরিবর্তিত হয় এবং এটি encapsulate করুন।
  3. ইন্টারফেস ডিজাইন।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.