يعني إيه POCO؟
كلمة POCO دي اختصار لحاجة اسمها “Plain Old CLR Object” أو “Plain Old C# Object”.
الفكرة ببساطة إن ده عبارة عن class
عادي جدًا وبسيط في الـ C#.
شغلته الأساسية إنه يمثل structure للـ data بتاعتك.
يعني، تقدر تقول عليه “حامل بيانات” مش أكتر.
وفالغالب هو بيمثل الـ Table اللي بتعمله في الـ Databases ومفيش فيه أي Behavior او Functionality.
إيه اللي بيميز الـ POCO Class؟
عشان نقول على class
إنه POCO، المفروض يكون فيه شوية حاجات (أو بالأحرى، ميكونش فيه شوية حاجات):
- بيركز ع الـ Data: أهم حاجة فيه هي الـ
properties
بتاعته اللي بتشيل القيم (زيstring Name
,int Age
, etc.). - مفيهوش Logic كتير: مش هتلاقي جواه
methods
بتعمل عمليات معقدة أو business logic كبير. لو فيهmethods
، بتبقى بسيطة جدًا ومساعدة للـ data نفسها. - مستقل (Independent): مش بيورث (inherits) من
base classes
تقيلة خاصة بـ framework معين (زيEntityObject
في Entity Framework زمان). الـ POCO class بيكون مستقل بذاته. - مفيهوش Attributes كتير: غالبًا مش هتلاقي عليه
attributes
خاصة بـ technology معينة (زي persistence attributes بتاعة ORM مثلاً)، إلا لو حاجات بسيطة أوي ومبتاثرش على استقلاليته. الفكرة إنه ميكونش “متلوث” بتفاصيل الـ infrastructure.
طيب وإيه لزمته؟ (المميزات)
استخدام الـ POCO classes ليه فوايد كتير:
- البساطة والوضوح: الـ Code بيبقى نضيف وسهل تقراه وتفهمه، لأنه بيركز على الـ data وبس.
- سهولة الاختبار (Testability): عشان هي classes بسيطة ومش معتمدة على حاجات خارجية كتير، سهل جدًا تعملها Unit Testing.
- المرونة (Flexibility): مش بتربطك بـ technology أو framework معين. ممكن تستخدم نفس الـ POCO class مع Entity Framework، أو Dapper، أو حتى لو هتعمل serialization لـ JSON API.
- عدم الاعتمادية على التخزين (Persistence Ignorance): الـ POCO class نفسها “مش عارفة” هي هتتخزن فين أو إزاي (في database، في file، etc.). ده بيخلي الـ domain model بتاعك نضيف ومش متأثر بتفاصيل الـ data access layer.
مثال على POCO Class
تعالى نشوف مثال بسيط لـ class
يعتبر POCO:
// ده مثال لـ POCO Class بسيط بيمثل منتج
public class Product
{
// دي Properties بسيطة بتشيل data
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
public string Description { get; set; } // ممكن تكون nullable لو حبيت
// ممكن تضيف constructor بسيط لو محتاج
public Product()
{
}
// Method بسيط جدًا لو لازم (لكن الأفضل نقلل الـ logic هنا)
public override string ToString()
{
return $"Product: {Name}, Price: {Price:C}";
}
}
- لاحظ إن الـ
class
ده مفهوش أي حاجة غريبة. - مجرد
properties
بتستخدم الـ auto-implemented feature ({ get; set; }
). - مفيش
attributes
خاصة بـ database أو serialization (ولو فيه بتبقى بسيطة ومش أساسية زي[Key]
أو[Required]
أحيانًا). - مفيش
inheritance
من حاجة معقدة خاصة بـ framework معين.
الخلاصة
الـ POCO Class هو مجرد class
بسيط ومستقل، شغلته الأساسية إنه يشيل وينظم الـ data بتاعتك في الأبلكيشن.
استخدامه بيساعدك تبني software نضيف، مرن، وسهل تختبره وتعمله صيانة. هو يعتبر حجر أساس في حاجات كتير زي الـ Domain-Driven Design (DDD) والـ ORMs الحديثة زي Entity Framework Core.