কম থেকে নিখরচায় আরও বেশি
যদি সি ++ এবং জাভা টাইপ শ্রেণিবিন্যাস এবং ধরণের শ্রেণীবিন্যাস সম্পর্কে হয় তবে গো সংশ্লেষ সম্পর্কে।
কম থেকে নিখরচায় আরও বেশি
যদি সি ++ এবং জাভা টাইপ শ্রেণিবিন্যাস এবং ধরণের শ্রেণীবিন্যাস সম্পর্কে হয় তবে গো সংশ্লেষ সম্পর্কে।
উত্তর:
তার অর্থ হ'ল আপনি যেখানে ক্রম দিয়ে কিছু ব্যবহার করবেন:
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;
};
এই প্রশ্ন / সমস্যা এই এক ধরনের অনুরূপ ।
গো তে, আপনার কাছে সত্যিই ওওপি নেই।
আপনি যদি কোনও অবজেক্টকে "বিশেষজ্ঞ" করতে চান তবে আপনি এটি এম্বেড করে এটি করেন যা একটি রচনা, তবে কিছু গুডিজ এটিকে আংশিকভাবে উত্তরাধিকারের মতো করে তোলে । আপনি এটি এর মতো করুন:
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 একটি বি বি এর একটি বিশেষায়িতকরণ, এটি একটি বি বি এর একটি উপক্লাস হিসাবে একটি ক্লাস বি এবং ক্লাস এ তৈরি করে এই সত্যটিকে প্রতিপন্ন করার জন্য আপনার ডেটা চারপাশে প্রোগ্রাম, আপনি এই কোডটি যে বাস্তবতা নীতির ভিত্তিতে আপনার কোডে অবজেক্টের শ্রেণীবিন্যাস পুনরুত্পাদন করতে সময় ব্যয় করেন।
গোয়ে আপনি একটি সাধারণ অ্যালগরিদম সংজ্ঞায়িত করতে এবং এটি বিশেষজ্ঞ করতে পারবেন না। আপনাকে অবশ্যই একটি সাধারণ অ্যালগরিদম সংজ্ঞায়িত করতে হবে এবং এটি সাধারণ এবং তা নিশ্চিত করা উচিত এবং প্রদত্ত ইন্টারফেস প্রয়োগের সাথে কাজ করবে।
কিছু শ্রেণিবিন্যাস গাছের ক্রমবর্ধমান জটিলতা দেখে আতঙ্কিত হয়ে পড়ে যার উপরে কোডাররা একটি অ্যালগোরিদমকে যুক্ত করার চেষ্টা করার জন্য জটিল হ্যাক তৈরি করছিল যার যুক্তি শেষ পর্যন্ত সমস্ত স্তরের সাথে বোঝায়, আমি বলব আমি সরল গো যুক্তির সাথে খুশি, এমনকি যদি এটি জোর করেও আপনার অ্যাপ্লিকেশন মডেলের ধারণাগুলি কেবল পুনরায় সংশোধন করার পরিবর্তে আপনাকে ভাবতে হবে।