সি প্রোগ্রামগুলির জন্য ওও সেরা অনুশীলন [বন্ধ]


19

"আপনি যদি সত্যিই ওও চিনি চান - তবে সি ++ ব্যবহার করুন" - এটি জিজ্ঞাসা করার পরে আমার এক বন্ধুর কাছ থেকে আমি পেয়েছিলাম তাত্ক্ষণিক প্রতিক্রিয়া। আমি জানি এখানে দুটি জিনিস মারা গেছে। প্রথম ওও 'চিনি' নয়, এবং দ্বিতীয়টি, সি ++ সি-কে শোষণ করে নি has

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

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

আপনার সিস্টেমে যে ও ও অ্যাস্ট্রাকশনগুলি প্রয়োজন তার জন্য আপনি কি একটি কাস্টম লাইব্রেরি তৈরি করেন? অবজেক্টস, এনক্যাপসুলেশন, উত্তরাধিকার, পলিমারফিজম, ব্যতিক্রম, পাব / সাব (ইভেন্টস / সিগন্যাল), নেমস্পেসস, ইন্ট্রোস্পেকশন ইত্যাদির মতো বিষয় (উদাহরণস্বরূপ গবজেক্ট বা সিওএস )।

বা, আপনি structঅ্যাড-হক উপায়ে আপনার সমস্ত বস্তুর শ্রেণি (এবং অন্যান্য বিমূর্ততা) আনুমানিক করতে কেবল সি সি কনস্ট্রাক্ট ( এবং ফাংশন) ব্যবহার করেন use (উদাহরণস্বরূপ, এসও-তে এই প্রশ্নের কয়েকটি উত্তর )

প্রথম পদ্ধতির আপনাকে সিতে আপনার পুরো মডেলটি বাস্তবায়নের জন্য একটি কাঠামোগত উপায় দেয় তবে এটি আপনাকে বজায় রাখা জটিলতার একটি স্তরও যুক্ত করে। (মনে রাখবেন, জটিলতা হ'ল আমরা প্রথমে বস্তু ব্যবহার করে হ্রাস করতে চেয়েছিলাম)।

দ্বিতীয় পদ্ধতির বিষয়ে আমি জানি না এবং আপনার যে সমস্ত বিমূর্ততা লাগতে পারে এটি প্রায় কার্যকর করতে এটি কতটা কার্যকর।

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

দ্রষ্টব্য: দয়া করে কেন সি ++ এর পক্ষে সি ব্যবহার করা উচিত তা পরামর্শ করবেন না। আমরা সেই পর্যায়ে পেরিয়ে গেছি।


3
আপনি সি ++ সার্ভারটি লিখতে পারেন যাতে এটি বাহ্যিক ইন্টারফেস হয় extern "C"এবং পাইথন থেকে ব্যবহার করা যায়। আপনি এটি ম্যানুয়ালি করতে পারেন বা SWIG আপনাকে এটিতে সহায়তা করতে পারে। সুতরাং পাইথন ফ্রন্ট্যান্ডের জন্য আকাঙ্ক্ষা সি ++ ব্যবহার না করার কোনও কারণ নয়। এটি তাই বলে না যে সি এর সাথে থাকার কোনও বৈধ কারণ নেই
জানু হুডেক

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

:) আমি আসল উদাহরণ (কোড বা অন্যথায়) জিজ্ঞাসা করছি যেখানে এটি হয়েছে - এবং এটি করার সময় তারা যে সমস্যার মুখোমুখি হয়েছিল।
বিশ্বাসঘাতক

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

আপনি "অবজেক্ট-ওরিয়েন্টেড মডেলিং এবং ডিজাইন" এ একবার নজর দিতে চাইতে পারেন। (রুম্বোফ এট আল।): সি এর মতো ভাষায় ওও ডিজাইন ম্যাপিংয়ের বিভাগ রয়েছে
জর্জিও

উত্তর:


16

আমার উত্তর থেকে কীভাবে আমার সিগুলিতে জটিল প্রকল্পগুলি গঠন করা উচিত (ওও নয় সি তে জটিলতা পরিচালনার বিষয়ে):

মূলটি হল পরিমিতি। এটি ডিজাইন, প্রয়োগ, সংকলন এবং রক্ষণাবেক্ষণ করা সহজ।

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

আমার উত্তর থেকে ওও সি পাবলিক এবং প্রাইভেট ফাংশনগুলির জন্য সাধারণত নামকরণের সম্মেলনগুলি কী কী (আমার কাছে এটি একটি সেরা অনুশীলন বলে মনে হয়):

আমি যে কনভেনশনটি ব্যবহার করি তা হ'ল:

  • পাবলিক ফাংশন (শিরোনামের ফাইলে):

    struct Classname;
    Classname_functionname(struct Classname * me, other args...);
  • ব্যক্তিগত ফাংশন (প্রয়োগের ফাইলে স্থির)

    static functionname(struct Classname * me, other args...)

তদুপরি, অনেকগুলি ইউএমএল সরঞ্জাম ইউএমএল ডায়াগ্রাম থেকে সি কোড তৈরি করতে সক্ষম হয়। একটি ওপেন সোর্স হ'ল টপকেসড


লিঙ্কের জন্য +1 কীভাবে আমার সি
তে

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

এবং কেন ঠিক রচনা উত্তরাধিকারের চেয়ে ভাল পদ্ধতির? যৌক্তিক এবং সমর্থনকারী উল্লেখগুলি স্বাগত। অথবা আপনি কেবল সি প্রোগ্রামগুলি উল্লেখ করছেন?
আলেকসান্দ্র ব্লেক 21

1
@ আলেকসান্দ্রব্লেখ - হ্যাঁ আমি কেবল সি-তে উল্লেখ করছি।
mouviciel

16

আমি মনে করি এই আলোচনায় আপনাকে ওও এবং সি ++ পার্থক্য করতে হবে।

সি তে অবজেক্ট কার্যকর করা সম্ভব এবং এটি বেশ সহজ - কেবল ফাংশন পয়েন্টার সহ কাঠামো তৈরি করুন। এটি আপনার "দ্বিতীয় পদ্ধতির", এবং আমি এটির সাথে যেতে চাই। অন্য বিকল্পটি হ'ল স্ট্রাক্টে ফাংশন পয়েন্টার ব্যবহার না করা, বরং "প্রসঙ্গ" পয়েন্টার হিসাবে সরাসরি কলগুলিতে ফাংশনগুলিতে ডেটা স্ট্রাক্টটি পাস করা। এটি আরও ভাল, আইএমএইচও, এটি আরও পঠনযোগ্য, সহজেই সন্ধানযোগ্য এবং স্ট্রাক্ট পরিবর্তন না করে ফাংশন যুক্ত করার অনুমতি দেয় (কোনও ডেটা যোগ না করা হলে উত্তরাধিকারের পক্ষে সহজ)। এটি আসলে কীভাবে সি ++ thisপয়েন্টারটি কার্যকর করে ।

পলিমারফিজম আরও জটিল হয়ে ওঠে কারণ কোনও অন্তর্নির্মিত উত্তরাধিকার এবং বিমূর্ত সমর্থন নেই, তাই আপনাকে হয় আপনার শিশু শ্রেণিতে পিতামাতার কাঠামো অন্তর্ভুক্ত করতে হবে, বা অনেকগুলি অনুলিপি পেস্ট করতে হবে, প্রযুক্তিগতভাবে সত্ত্বেও এই বিকল্পগুলির মধ্যে উভয়ই স্পষ্টতই ভয়ঙ্কর is সহজ। বিপুল পরিমাণ ত্রুটি ঘটতে অপেক্ষা করছে।

ভার্চুয়াল ফাংশনগুলি প্রয়োজনীয়ভাবে বিভিন্ন ফাংশনগুলিকে নির্দেশ করে ফাংশন পয়েন্টারগুলির মাধ্যমে সহজেই সহজেই অর্জন করা যায় - ম্যানুয়ালি করা হয়ে গেলে খুব বাগ প্রবণ হয় those পয়েন্টারগুলি সঠিকভাবে আরম্ভ করার জন্য প্রচুর ক্লান্তিকর কাজ।

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

এটি না বলে চলে যায় যে আপনি যদি সি ++ ব্যবহার করতে পারেন - সি ++ ব্যবহার করুন। না করার কোন বাস্তব কারণ নেই।


প্রকৃতপক্ষে, আপনি কোনও কাঠামো থেকে উত্তরাধিকারী হয়ে ডেটা যুক্ত করতে পারেন: কেবলমাত্র শিশু স্ট্রাক্টের প্রথম আইটেমটি ভেরিয়েবল হিসাবে ঘোষণা করুন যার প্রকারের প্যারেন্ট স্ট্রাক্ট। তারপরে আপনার প্রয়োজন মতো কাস্ট করুন।
mouviciel

1
@ মউভিচিয়েল - হ্যাঁ আমি সেটা বলেছিলাম. " ... সুতরাং আপনাকে বাচ্চাদের ক্লাসে পিতামাতার কাঠামো অন্তর্ভুক্ত করতে হবে, বা ... "
লিটলডিভি

5
উত্তরাধিকার প্রয়োগের চেষ্টা করার কোনও কারণ নেই। কোড পুনরায় ব্যবহারের উপায় হিসাবে, এটি শুরু করার একটি ত্রুটিযুক্ত ধারণা। অবজেক্ট রচনা সহজ এবং ভাল better
কাপ্তজনকোল্ড

@ ক্যাপ্টাজনকোল্ড - একমত
littleadv

8

সিটিতে কীভাবে অবজেক্ট ওরিয়েন্টেশন তৈরি করা যায় তার মূল কথা এখানে রয়েছে

1. অবজেক্টস এবং এনক্যাপসুলেশন তৈরি করা

সাধারণত - একটি যেমন একটি বস্তু তৈরি করে

object_instance = create_object_typex(parameter);

পদ্ধতিগুলি এখানে দুটি উপায়ের একটিতে সংজ্ঞায়িত করতে পারে।

object_type_method_function(object_instance,parameter1)
OR
object_instance->method_function(object_instance_private_data,parameter1)

নোট করুন যে বেশিরভাগ ক্ষেত্রে, object_instance (or object_instance_private_data)প্রত্যাশিত হয় প্রকারভেদে void *.অ্যাপ্লিকেশনটি এর পৃথক সদস্য বা এর কার্যাদি উল্লেখ করতে পারে না।

এর পরেও প্রতিটি পদ্ধতি পরবর্তী পদ্ধতিগুলির জন্য এই অবজেক্ট_ইনস্ট্যান্স ব্যবহার করে।

২. পলিমারফিজম

রান টাইমে নির্দিষ্ট কার্যকারিতা ওভাররাইড করতে আমরা অনেকগুলি ফাংশন এবং ফাংশন পয়েন্টার ব্যবহার করতে পারি।

উদাহরণস্বরূপ - সমস্ত অবজেক্ট_মোথডগুলি একটি ফাংশন পয়েন্টার হিসাবে সংজ্ঞায়িত করা হয় যা জনসাধারণের পাশাপাশি প্রাইভেট পদ্ধতিতেও প্রসারিত হতে পারে।

আমরা সীমিত অর্থে ফাংশন ওভারলোডিং প্রয়োগ করতে পারি, এটি ব্যবহারের মাধ্যমে var_args যা প্রিন্টফের মধ্যে পরিবর্তনশীল সংখ্যার আর্গুমেন্টের সংখ্যার সাথে সাদৃশ্যপূর্ণ। হ্যাঁ, এটি সি ++-তে মোটামুটি নমনীয় নয় - তবে এটি নিকটতম উপায়।

৩. উত্তরাধিকার নির্ধারণ করা

উত্তরাধিকার সংজ্ঞা দেওয়া কিছুটা জটিল তবে স্ট্রাকচারের সাহায্যে নিম্নলিখিতটি করা যায়।

typedef struct { 
     int age,
     int sex,
} person; 

typedef struct { 
     person p,
     enum specialty s;
} doctor;

typedef struct { 
     person p,
     enum subject s;
} engineer;

// use it like
engineer e1 = create_engineer(); 
get_person_age( (person *)e1); 

এখানে doctorএবং engineerব্যক্তি থেকে প্রাপ্ত করা হয় এবং এটি উচ্চতর স্তরে এটা typecast করা সম্ভব বলে person

এর সেরা উদাহরণটি জিওজেক্টে ব্যবহৃত হয় এবং এটি থেকে উত্পন্ন জিনিসগুলি।

৪. ভার্চুয়াল ক্লাস তৈরি করা আমি জেপিগ ডিকোডিংয়ের জন্য সমস্ত ব্রাউজার দ্বারা ব্যবহৃত লাইবজেপেইগ নামে একটি লাইব্রেরির দ্বারা বাস্তব জীবনের উদাহরণ উদ্ধৃত করছি। এটি ত্রুটি_ম্যানেজার নামে একটি ভার্চুয়াল শ্রেণি তৈরি করে যা অ্যাপ্লিকেশনটি কংক্রিট উদাহরণ তৈরি করতে পারে এবং সরবরাহ করতে পারে -

struct djpeg_dest_struct {
  /* start_output is called after jpeg_start_decompress finishes.
   * The color map will be ready at this time, if one is needed.
   */
  JMETHOD(void, start_output, (j_decompress_ptr cinfo,
                               djpeg_dest_ptr dinfo));
  /* Emit the specified number of pixel rows from the buffer. */
  JMETHOD(void, put_pixel_rows, (j_decompress_ptr cinfo,
                                 djpeg_dest_ptr dinfo,
                                 JDIMENSION rows_supplied));
  /* Finish up at the end of the image. */
  JMETHOD(void, finish_output, (j_decompress_ptr cinfo,
                                djpeg_dest_ptr dinfo));

  /* Target file spec; filled in by djpeg.c after object is created. */
  FILE * output_file;

  /* Output pixel-row buffer.  Created by module init or start_output.
   * Width is cinfo->output_width * cinfo->output_components;
   * height is buffer_height.
   */
  JSAMPARRAY buffer;
  JDIMENSION buffer_height;
};

এখানে নোট করুন যে JMETHOD ম্যাক্রোর মাধ্যমে একটি ফাংশন পয়েন্টারে প্রসারিত করে যথাক্রমে সঠিক পদ্ধতিতে লোড করা প্রয়োজন।


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

এছাড়াও, অনেক যুক্তি রয়েছে যে এটি সি ++ সমতুল্যের ঠিক প্রকৃত সম্পত্তি হবে না । আমি জানি যে সি-ওন্টে ওও এর সংজ্ঞাটির প্রতি কঠোর হতে হবে। তবে এর মতো কাজ করা কিছু মূল নীতি বুঝতে পারে।

গুরুত্বপূর্ণ বিষয় এটি নয় যে ওও সি ++ এবং জেভিএর মতো কঠোর। এটি এমন যে কাঠামোগতভাবে ওও চিন্তাভাবনা করে কোডটি কাঠামোগতভাবে সংগঠিত করতে পারে এবং সেভাবে এটি পরিচালনা করতে পারে।

আমি লোকদের লিবিজেপেইগ এবং নিম্নলিখিত সংস্থানগুলির আসল নকশাটি দেখার জন্য দৃ strongly়ভাবে পরামর্শ দেব

ক। সি বিতে অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং
। এটি একটি ভাল জায়গা যেখানে লোকেরা ধারণা বিনিময় করে
সি। এবং এখানে পুরো বই


3

অবজেক্ট-ওরিয়েন্টেশনটি তিনটি জিনিসে সিদ্ধ হয়:

1) স্বায়ত্তশাসিত ক্লাস সহ মডুলার প্রোগ্রাম ডিজাইন।

2) ব্যক্তিগত এনক্যাপসুলেশন সহ ডেটা সংরক্ষণ।

3) উত্তরাধিকার / বহুমুখ এবং অন্যান্য বিভিন্ন সহায়ক সিনট্যাক্স যেমন কনস্ট্রাক্টর / ডেস্ট্রাক্টর, টেম্পলেট ইত্যাদি

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

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

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

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

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

সুতরাং আমার পরামর্শটি 1) এবং 2) উপরের প্রয়োগ এবং বাকী অংশটি এড়িয়ে চলুন। এটি সি প্রোগ্রাম লেখার একটি উপায় যা 20 বছরেরও বেশি সময় ধরে সফল প্রমাণিত হয়েছে।


2

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

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

একাধিক বিকাশকারীকে একে অপরের ক্লাস ব্যবহার এবং প্রসারিত করার মঞ্জুরি দেওয়ার জন্য ডিজাইন করা সাধারণ-উদ্দেশ্য ও ও লাইব্রেরির সমস্ত অংশই তাই আপনার নিজের প্রকল্পের জন্য ওভারকিল হতে পারে। কাঠামো এবং ফাংশনগুলি ব্যবহার করে আমি প্রায়শই সি প্রকল্পগুলি "স্ট্যাটিক" শ্রেণি-ভিত্তিক প্রকল্প হিসাবে ডিজাইন করেছি: - প্রতিটি শ্রেণি সিভার কাঠামোর সংজ্ঞা যা আইভার লেআউটকে নির্দিষ্ট করে - প্রতিটি উদাহরণটি সম্পর্কিত কাঠামোর একটি উদাহরণ - বস্তু হতে পারে না "ম্যাসেজড", তবে পদ্ধতির মতো দেখতে ফাংশনগুলি MyClass_doSomething(struct MyClass *object, …)সংজ্ঞায়িত করা হয়েছে। এটি ওজেজেসি পদ্ধতির চেয়ে কোডগুলিতে জিনিসগুলি আরও স্পষ্ট করে তোলে তবে স্বচ্ছন্দতা কম।

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


1

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

জিনিসটি সিওএসের সাথে কিছুটা আলাদা কারণ এটি প্রিপ্রোসেসর নিয়ে আসে যা কিছু ওও কনস্ট্রাক্টসের সাথে সি সিনট্যাক্স প্রসারিত করে। জি অবজেক্ট , জি অবজেক্ট বিল্ডার এর জন্য একই রকম প্রিপ্রোসেসর রয়েছে ।

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


1

প্রথমে, যদি না এটি হোমওয়ার্ক হয় বা লক্ষ্য ডিভাইসের জন্য কোনও সি ++ সংকলক না থাকে তবে আপনি সি ব্যবহার করতে হবে বলে আমি মনে করি না, আপনি সি ++ থেকে সহজেই সি লিংকেজ সহ একটি সি ইন্টারফেস সরবরাহ করতে পারেন।

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

আপনি যদি সিদ্ধান্ত নিতে এখনও সত্যই ডিজাইন না পেয়ে থাকেন তবে স্পাইক করুন এবং কোডটি আপনাকে কী বলে তা দেখুন।

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

সম্পাদনা: সুতরাং পরিচালনা দ্বারা এটি সিদ্ধান্ত একটি সিদ্ধান্ত তারপর প্রথম পয়েন্ট উপেক্ষা করতে দেয়।

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