আমি মনে করি সংগ্রহে কিছু যুক্ত করার সর্বাধিক সাধারণ উপায় হ'ল কোনও ধরণের Add
পদ্ধতি ব্যবহার করা যা কোনও সংগ্রহ সরবরাহ করে:
class Item {}
var items = new List<Item>();
items.Add(new Item());
এবং এটি সম্পর্কে অস্বাভাবিক কিছুই নেই।
আমি ভাবছি তবে আমরা কেন এইভাবে করি না:
var item = new Item();
item.AddTo(items);
এটি প্রথম পদ্ধতিটি একরকম আরও প্রাকৃতিক বলে মনে হচ্ছে । এর সাথে অ্যান্ডওয়ান্টেজ থাকবে যখন Item
শ্রেণীর কোনও সম্পত্তি থাকলে Parent
:
class Item
{
public object Parent { get; private set; }
}
আপনি সেটটার বেসরকারী করতে পারেন। অবশ্যই এই ক্ষেত্রে আপনি কোনও এক্সটেনশন পদ্ধতি ব্যবহার করতে পারবেন না।
তবে সম্ভবত আমি ভুল এবং আমি এই প্যাটার্নটি আগে কখনও দেখিনি কারণ এটি এতটা অস্বাভাবিক? আপনি কি জানেন যে এরকম কোনও প্যাটার্ন রয়েছে কি না?
ইন C#
একটি এক্সটেনশন পদ্ধতি যে জন্য দরকারী হবে
public static T AddTo(this T item, IList<T> list)
{
list.Add(item);
return item;
}
অন্য ভাষা সম্পর্কে? আমি অনুমান করি তাদের মধ্যে বেশিরভাগ Item
ক্লাসকে একটি ICollectionItem
ইন্টারফেস বলা যাক ।
আপডেট -1
আমি এটি সম্পর্কে আরও কিছুটা ভাবছিলাম এবং এই প্যাটার্নটি সত্যই কাজে লাগবে উদাহরণস্বরূপ আপনি যদি কোনও আইটেম একাধিক সংগ্রহে যুক্ত না করতে চান তবে।
পরীক্ষা ICollectable
ইন্টারফেস:
interface ICollectable<T>
{
// Gets a value indicating whether the item can be in multiple collections.
bool CanBeInMultipleCollections { get; }
// Gets a list of item's owners.
List<ICollection<T>> Owners { get; }
// Adds the item to a collection.
ICollectable<T> AddTo(ICollection<T> collection);
// Removes the item from a collection.
ICollectable<T> RemoveFrom(ICollection<T> collection);
// Checks if the item is in a collection.
bool IsIn(ICollection<T> collection);
}
এবং একটি নমুনা বাস্তবায়ন:
class NodeList : List<NodeList>, ICollectable<NodeList>
{
#region ICollectable implementation.
List<ICollection<NodeList>> owners = new List<ICollection<NodeList>>();
public bool CanBeInMultipleCollections
{
get { return false; }
}
public ICollectable<NodeList> AddTo(ICollection<NodeList> collection)
{
if (IsIn(collection))
{
throw new InvalidOperationException("Item already added.");
}
if (!CanBeInMultipleCollections)
{
bool isInAnotherCollection = owners.Count > 0;
if (isInAnotherCollection)
{
throw new InvalidOperationException("Item is already in another collection.");
}
}
collection.Add(this);
owners.Add(collection);
return this;
}
public ICollectable<NodeList> RemoveFrom(ICollection<NodeList> collection)
{
owners.Remove(collection);
collection.Remove(this);
return this;
}
public List<ICollection<NodeList>> Owners
{
get { return owners; }
}
public bool IsIn(ICollection<NodeList> collection)
{
return collection.Contains(this);
}
#endregion
}
ব্যবহার:
var rootNodeList1 = new NodeList();
var rootNodeList2 = new NodeList();
var subNodeList4 = new NodeList().AddTo(rootNodeList1);
// Let's move it to the other root node:
subNodeList4.RemoveFrom(rootNodeList1).AddTo(rootNodeList2);
// Let's try to add it to the first root node again...
// and it will throw an exception because it can be in only one collection at the same time.
subNodeList4.AddTo(rootNodeList1);
add(item, collection)
তবে তা ওও স্টাইল ভাল নয় style
item.AddTo(items)
ধরুন আপনার কাছে এক্সটেনশন পদ্ধতি ছাড়াই একটি ভাষা রয়েছে: প্রাকৃতিক বা না, অ্যাডটোর সমর্থন করার জন্য প্রতিটি ধরণের এই পদ্ধতির প্রয়োজন হবে এবং এডেন্ডিং সমর্থনকারী প্রতিটি ধরণের সংগ্রহের জন্য এটি সরবরাহ করবে। এটি আমি শুনেছি এমন কিছুর মধ্যে নির্ভরতা প্রবর্তনের সর্বোত্তম উদাহরণের মতো : পি - আমি মনে করি যে এখানে মিথ্যা ভিত্তি 'বাস্তব' জীবনের কিছু প্রোগ্রামিং বিমূর্ততা মডেল করার চেষ্টা করছে। এটি প্রায়শই ভুল হয়ে যায়।