রব পাইক যখন বলেন "গো কম্পোজিশনের বিষয়ে", তখন তার অর্থ কী? [বন্ধ]


12

কম থেকে নিখরচায় আরও বেশি

যদি সি ++ এবং জাভা টাইপ শ্রেণিবিন্যাস এবং ধরণের শ্রেণীবিন্যাস সম্পর্কে হয় তবে গো সংশ্লেষ সম্পর্কে।

উত্তর:


13

তার অর্থ হ'ল আপনি যেখানে ক্রম দিয়ে কিছু ব্যবহার করবেন:

class A : public B {};

জাভা বা সি ++ এর মতো কিছুতে, আপনি যে গো ব্যবহার করবেন (এর সমতুল্য কিছু):

class A {
    B b;
};

হ্যাঁ, এটি উত্তরাধিকারের মতো ক্ষমতা সরবরাহ করে। কিছুটা উপরে উদাহরণটি প্রসারিত করা যাক:

struct B {
    int foo() {}
};

struct A { 
    B b;
};

A a;

a.foo();  // not allowed in C++ or Java, but allowed in Go.

এটি করতে, তবে, আপনি এমন একটি সিনট্যাক্স ব্যবহার করেন যা সি ++ বা জাভাতে অনুমোদিত নয় - আপনি এম্বেড করা অবজেক্টের নিজস্ব নাম ছাড়াই ছেড়ে যান, সুতরাং এটি আরও পছন্দ:

struct A {
   B;
};

1
আমি কৌতূহলী, আমি এটি সি ++ তে করি (রচনা পছন্দ)। জাভা / সি ++ এ যখন আমাকে উত্তরাধিকারী হতে হবে তখন এমন বৈশিষ্ট্যগুলি সরবরাহ করে যা আমাকে রচনা করতে সহায়তা করে?
ডগ টি।

2
@ ডউগটি: হ্যাঁ, আমি একটি উদাহরণ সম্পাদনা করেছি যা এটির (অংশের) সাধারণ ধারণাটি দেখায়।
জেরি কফিন

2
আমি মনে করি এটি বিন্দুটি মিস করে: পার্থক্যটি কেবল একটি সিনট্যাকটিক নয় যা বোঝায় যে আপনি আপনার শ্রমশক্তি তৈরি করতে এমবেডিং ব্যবহার করেন। আসল বিষয়টি হ'ল ওওপি পদ্ধতির ওভাররাইডের অভাব আপনাকে আপনার ধ্রুপদী শ্রেণিবৃত্তি তৈরি করতে বাধা দেয় এবং এর পরিবর্তে আপনাকে অবশ্যই রচনাটি ব্যবহার করতে হবে।
18:32

1
@ অডিস্ট্রয়: জাভার তুলনায় আপনার সম্ভবত একটি পয়েন্ট আছে। সি ++ এর সাথে তুলনা করে এতটা নয় - কারণ (কমপক্ষে কোনও ক্লুযুক্ত লোকদের মধ্যে) সেই দৈত্য ট্যাকোনোমিকে শেষবার 20 বছর আগে দেখা হয়েছিল।
জেরি কফিন

1
@ অডিস্ট্রয়: আপনি এখনও বুঝতে পারছেন না। আধুনিক সি ++ তে একটি তিন স্তরের শ্রেণিবদ্ধতা শুনতে পেল না। সি ++ এ আপনি iostreams গ্রন্থাগার এবং ব্যতিক্রম শ্রেণিবিন্যাসের এগুলি দেখতে পাবেন - তবে অন্য কোথাও নেই। যদি আজ আইস্ট্রিমেজ লাইব্রেরিটি তৈরি করা হয়েছিল, তবে আমার মনে হয় এটি নিরাপদ বলে এটি নিরাপদ নয়। নীচের লাইন: আপনার যুক্তিগুলি আপনি এর সাথে কীভাবে ছোঁয়াচ্ছেন তার চেয়ে সি ++ কম দেখায়। আপনি এটি দশকগুলিতে ব্যবহার করেন নি তা বোঝা যায়। যে বিষয়টি বোধগম্য নয় তা সেই তারিখের অভিজ্ঞতার ভিত্তিতে সি ++ কীভাবে ব্যবহৃত হবে তা বলার চেষ্টা করছে।
জেরি কফিন

8

এই প্রশ্ন / সমস্যা এই এক ধরনের অনুরূপ ।

গো তে, আপনার কাছে সত্যিই ওওপি নেই।

আপনি যদি কোনও অবজেক্টকে "বিশেষজ্ঞ" করতে চান তবে আপনি এটি এম্বেড করে এটি করেন যা একটি রচনা, তবে কিছু গুডিজ এটিকে আংশিকভাবে উত্তরাধিকারের মতো করে তোলে । আপনি এটি এর মতো করুন:

type ConnexionMysql struct {
    *sql.DB
}

এই নমুনায়, ConnexionMysql হ'ল * sql.DB এর এক বিশেষত্ব, এবং আপনি * sql.DB- তে সংজ্ঞায়িত ফাংশনগুলি ConnexionMysql এ কল করতে পারেন:

type BaseMysql struct {
    user     string
    password string
    database string
}

func (store *BaseMysql) DB() (ConnexionMysql, error) {
    db, err := sql.Open("mymysql", store.database+"/"+store.user+"/"+store.password)
    return ConnexionMysql{db}, err
}

func (con ConnexionMysql) EtatBraldun(idBraldun uint) (*EtatBraldun, error) {
    row := con.QueryRow("select pv, pvmax, pa, tour, dla, faim from compte where id=?", idBraldun)
    // stuff
    return nil, err
}

// somewhere else:
con, err := ms.bd.DB()
defer con.Close()
// ...
somethings, err = con.EtatBraldun(id)

সুতরাং প্রথম দর্শনে আপনি মনে করতে পারেন যে এই রচনাটি আপনার সাধারণ শ্রোক্তি তৈরির সরঞ্জাম is

কিন্তু

যদি * sql.DB এ সংজ্ঞায়িত কোনও ফাংশন * sql.DB- এ সংজ্ঞায়িত অন্যান্য ফাংশনগুলিকে কল করে তবে এটি উপস্থিত থাকলেও ConnexionMysql এ পুনরায় সংজ্ঞায়িত ফাংশনগুলিকে কল করবে না।

শাস্ত্রীয় উত্তরাধিকার সহ, আপনি প্রায়শই এরকম কিছু করেন:

func (db *sql.DB) doComplexThing() {
   db.doSimpleThing()
   db.doAnotherSimpleThing()
}

func (db *sql.DB) doSimpleThing() {
   // standard implementation, that we expect to override
}

এটি হল, doComplexThingবিশেষায়নের কলগুলিতে আপনি একটি সংগঠন হিসাবে সুপার ক্লাসের সংজ্ঞা দেন।

তবে গো-এ, এটি বিশেষায়িত ফাংশনটিকে না বলে "সুপারক্লাস" ফাংশন বলে।

সুতরাং, আপনি যদি * sql.DB- তে সংজ্ঞায়িত কিন্তু কনেক্সেক্সিয়ানমাইএসকিউএল (বা অন্যান্য বিশেষায়িতকরণ) -এ পুনরায় সংজ্ঞায়িত কিছু ফাংশন কল করার প্রয়োজনে একটি অ্যালগরিদম পেতে চান তবে আপনি এই অ্যালগরিদমকে * sql.DB এর ফাংশন হিসাবে সংজ্ঞায়িত করতে পারবেন না তবে এটি অন্য কোথাও সংজ্ঞায়িত করতে হবে এবং এই ফাংশনটি কেবল সরবরাহিত বিশেষায়নের জন্য কল রচনা করবে।

আপনি ইন্টারফেস ব্যবহার করে এটি করতে পারেন:

type interface SimpleThingDoer {
   doSimpleThing()
   doAnotherSimpleThing()
}

func doComplexThing(db SimpleThingDoer) {
   db.doSimpleThing()
   db.doAnotherSimpleThing()
}

func (db *sql.DB) doSimpleThing() {
   // standard implementation, that we expect to override
}

func (db ConnexionMySQL) doSimpleThing() {
   // other implemenation
}

এটি শ্রেণিবিন্যাসের শাস্ত্রীয় ওভাররাইড থেকে একেবারেই আলাদা।

বিশেষত, আপনি স্পষ্টতই দ্বিতীয়টি থেকে কোনও ফাংশন বাস্তবায়নের উত্তরাধিকার সূত্রে কোনও তৃতীয় স্তর থাকতে পারবেন না।

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

আমার অভিজ্ঞতায় এটি এক স্তরের চেয়েও গভীর স্তরক্রমের ব্যবহারিক অনুপস্থিতির দিকে নিয়ে যায়।

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

গোয়ে আপনি একটি সাধারণ অ্যালগরিদম সংজ্ঞায়িত করতে এবং এটি বিশেষজ্ঞ করতে পারবেন না। আপনাকে অবশ্যই একটি সাধারণ অ্যালগরিদম সংজ্ঞায়িত করতে হবে এবং এটি সাধারণ এবং তা নিশ্চিত করা উচিত এবং প্রদত্ত ইন্টারফেস প্রয়োগের সাথে কাজ করবে।

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

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