يعني إيه 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.