আমি একটি অবজেক্ট মডেল বিকাশ করছি যার প্রচুর পিতামাতার / শিশুদের প্রচুর ক্লাস রয়েছে। প্রতিটি শিশু অবজেক্টের তার প্যারেন্ট অবজেক্টের একটি রেফারেন্স থাকে। পিতামাতার রেফারেন্সটি সূচনা করার জন্য আমি বেশ কয়েকটি উপায় (এবং চেষ্টা করেছি) সম্পর্কে ভাবতে পারি তবে প্রতিটি পদ্ধতির কাছে আমি গুরুত্বপূর্ণ ত্রুটিগুলি খুঁজে পাই। নীচে বর্ণিত পদ্ধতিগুলি দেওয়া যা কোনটি সেরা ... বা এর থেকে আরও ভাল।
আমি নীচের কোডটি সংকলন করে তা নিশ্চিত করতে যাচ্ছি না তাই দয়া করে কোডটি সিনট্যাক্টিকভাবে সঠিক না হলে আমার উদ্দেশ্যটি দেখার চেষ্টা করুন।
মনে রাখবেন যে আমার কিছু শিশু শ্রেণির নির্মাতারা প্যারামিটারগুলি নেন (পিতামাতা ব্যতীত) যদিও আমি সবসময় কোনও দেখায় না।
কলার পিতামাতাকে সেট করতে এবং একই পিতামাতার সাথে যুক্ত করার জন্য দায়বদ্ধ।
class Child { public Child(Parent parent) {Parent=parent;} public Parent Parent {get; private set;} } class Parent { // singleton child public Child Child {get; set;} //children private List<Child> _children = new List<Child>(); public List<Child> Children { get {return _children;} } }
ডাউনসাইড: পিতামাতার সেট করা গ্রাহকের জন্য একটি দ্বি-পদক্ষেপ প্রক্রিয়া।
var child = new Child(parent); parent.Children.Add(child);
ডাউনসাইড: ত্রুটি প্রবণ। কলার বাচ্চাকে আরম্ভ করার জন্য ব্যবহৃত পিতাকে আলাদা পিতামাতার সাথে যুক্ত করতে পারে।
var child = new Child(parent1); parent2.Children.Add(child);
পিতামাতারা যাচাই করে যে কলার শিশুটিকে পিতামাতার সাথে যুক্ত করে যার জন্য শুরু হয়েছিল।
class Child { public Child(Parent parent) {Parent = parent;} public Parent Parent {get; private set;} } class Parent { // singleton child private Child _child; public Child Child { get {return _child;} set { if (value.Parent != this) throw new Exception(); _child=value; } } //children private List<Child> _children = new List<Child>(); public ReadOnlyCollection<Child> Children { get {return _children;} } public void AddChild(Child child) { if (child.Parent != this) throw new Exception(); _children.Add(child); } }
ডাউনসাইড: পিতামাতার সেট করার জন্য কলারের এখনও একটি দ্বি-পদক্ষেপ প্রক্রিয়া রয়েছে।
ডাউনসাইড: রানটাইম চেকিং - পারফরম্যান্স হ্রাস করে এবং প্রতিটি অ্যাড / সেটারে কোড যুক্ত করে।
সন্তানের পিতামাতার সাথে যুক্ত / নির্ধারিত হওয়ার পরে পিতামাতা সন্তানের পিতামাতার রেফারেন্স (নিজেই) সেট করে। পিতামাতার সেটারটি অভ্যন্তরীণ।
class Child { public Parent Parent {get; internal set;} } class Parent { // singleton child private Child _child; public Child Child { get {return _child;} set { value.Parent = this; _child = value; } } //children private List<Child> _children = new List<Child>(); public ReadOnlyCollection<Child> Children { get {return _children;} } public void AddChild(Child child) { child.Parent = this; _children.Add(child); } }
ডাউনসাইড: সন্তানের পিতামাতার উল্লেখ ছাড়াই তৈরি করা হয়েছে। কখনও কখনও সূচনা / বৈধকরণের জন্য পিতামাতার প্রয়োজন হয় যার অর্থ শিশুর পিতামাতার সেটারে কিছু সূচনা / বৈধতা অবশ্যই সম্পাদন করা উচিত। কোড জটিল হতে পারে। যদি শিশুটির সর্বদা এর পিতামাতার উল্লেখ থাকে তবে তা বাস্তবায়ন করা এত সহজ হবে would
পিতামাতারা কারখানার অ্যাড পদ্ধতিগুলি প্রকাশ করে যাতে কোনও সন্তানের সর্বদা পিতামাতার উল্লেখ থাকে। শিশু ctor অভ্যন্তরীণ। পিতামাতা সেটার ব্যক্তিগত।
class Child { internal Child(Parent parent, init-params) {Parent = parent;} public Parent Parent {get; private set;} } class Parent { // singleton child public Child Child {get; private set;} public void CreateChild(init-params) { var child = new Child(this, init-params); Child = value; } //children private List<Child> _children = new List<Child>(); public ReadOnlyCollection<Child> Children { get {return _children;} } public Child AddChild(init-params) { var child = new Child(this, init-params); _children.Add(child); return child; } }
ডাউনসাইড: আরম্ভের সিনট্যাক্স যেমন ব্যবহার করতে পারে না
new Child(){prop = value}
। পরিবর্তে করতে হবে:var c = parent.AddChild(); c.prop = value;
ডাউনসাইড: অ্যাড-ফ্যাক্টরি পদ্ধতিতে শিশু নির্মাণকারীর পরামিতিগুলি নকল করতে হবে।
ডাউনসাইড: সিঙ্গলটন সন্তানের জন্য কোনও সম্পত্তি সেটার ব্যবহার করতে পারবেন না। খোঁড়া দেখে মনে হচ্ছে যে মানটি নির্ধারণের জন্য আমার একটি পদ্ধতি প্রয়োজন তবে সম্পত্তি গেটারের মাধ্যমে পাঠ্য অ্যাক্সেস সরবরাহ করে। এটা একতরফা।
শিশু তার নির্মাতার সাথে উল্লেখ করা পিতামাতার সাথে নিজেকে যুক্ত করে। চাইল্ড কোর্ট সর্বজনীন। পিতামাতার কাছ থেকে কোনও পাবলিক অ্যাড অ্যাক্সেস নেই।
//singleton class Child{ public Child(ParentWithChild parent) { Parent = parent; Parent.Child = this; } public ParentWithChild Parent {get; private set;} } class ParentWithChild { public Child Child {get; internal set;} } //children class Child { public Child(ParentWithChildren parent) { Parent = parent; Parent._children.Add(this); } public ParentWithChildren Parent {get; private set;} } class ParentWithChildren { internal List<Child> _children = new List<Child>(); public ReadOnlyCollection<Child> Children { get {return _children;} } }
ডাউনসাইড: সিনট্যাক্স কল করা দুর্দান্ত নয়। সাধারণত কেউ
add
কেবল এই জাতীয় কোনও বস্তু তৈরির পরিবর্তে পিতামাতার কাছে একটি পদ্ধতি কল করে:var parent = new ParentWithChildren(); new Child(parent); //adds child to parent new Child(parent); new Child(parent);
এবং কেবল এই জাতীয় কোনও বস্তু তৈরি করার চেয়ে একটি সম্পত্তি সেট করে:
var parent = new ParentWithChild(); new Child(parent); // sets parent.Child
...
আমি কেবল শিখেছি যে এসই কিছু বিষয়গত প্রশ্নকে অনুমতি দেয় না এবং স্পষ্টতই এটি একটি বিষয়গত প্রশ্ন। তবে, এটি একটি ভাল বিষয়গত প্রশ্ন।