ما الفرق بين مخطط البيانات وبوابة بيانات الجدول (البوابة) وكائن الوصول إلى البيانات (DAO) وأنماط المستودع؟

StackOverflow https://stackoverflow.com/questions/804751

سؤال

أحاول تحسين مهاراتي في أنماط التصميم، ولدي فضول ما هي الاختلافات بين هذه الأنماط؟تبدو جميعها وكأنها نفس الشيء - قم بتغليف منطق قاعدة البيانات لكيان معين بحيث لا يكون لدى رمز الاتصال معرفة بطبقة الثبات الأساسية.من خلال بحثي الموجز، يقوم جميعهم عادةً بتنفيذ أساليب CRUD القياسية الخاصة بك واستخلاص التفاصيل الخاصة بقاعدة البيانات.

وبصرف النظر عن اصطلاحات التسمية (على سبيل المثال.CustomerMapper مقابل.العميلDAO مقابل.بوابة العملاء مقابل.CustomerRepository)، ما هو الفرق، إن وجد؟وإذا كان هناك فرق، متى تختار أحدهما على الآخر؟

في الماضي كنت أكتب كودًا مشابهًا لما يلي (مبسط، بطبيعة الحال - لا أستخدم الخصائص العامة عادةً):

public class Customer
{
    public long ID;
    public string FirstName;
    public string LastName;
    public string CompanyName;
}

public interface ICustomerGateway
{
    IList<Customer> GetAll();
    Customer GetCustomerByID(long id);
    bool AddNewCustomer(Customer customer);
    bool UpdateCustomer(Customer customer);
    bool DeleteCustomer(long id);
}

ولها CustomerGateway فئة تنفذ منطق قاعدة البيانات المحددة لجميع الأساليب.في بعض الأحيان، لا أستخدم واجهة وأقوم بإجراء جميع الأساليب الموجودة على CustomerGateway الثابتة (أعلم، أعلم أن هذا يجعلها أقل قابلية للاختبار) حتى أتمكن من تسميتها كما يلي:

Customer cust = CustomerGateway.GetCustomerByID(42);

يبدو أن هذا هو نفس المبدأ بالنسبة لأنماط مخطط البيانات والمستودع؛يبدو أيضًا أن نمط DAO (وهو نفس الشيء مثل البوابة، على ما أعتقد؟) يشجع البوابات الخاصة بقاعدة البيانات.

هل فاتني شيء؟يبدو غريبًا بعض الشيء أن يكون لديك 3-4 طرق مختلفة لفعل نفس الشيء بالضبط.

هل كانت مفيدة؟

المحلول

مصطلحات المثال الخاص بك؛كل من DataMapper وDAO وDataTableGateway وRepository لها غرض مماثل (عندما أستخدم واحدًا، أتوقع استعادة كائن العميل)، ولكن القصد/المعنى مختلف والتنفيذ الناتج.

أ مخزن "يعمل كمجموعة، باستثناء إمكانية الاستعلام الأكثر تفصيلاً" [إيفانز، التصميم القائم على المجال] ويمكن اعتباره "الكائنات في واجهة الذاكرة" (مناقشة المستودع)

أ DataMapper "ينقل البيانات بين الكائنات وقاعدة البيانات مع إبقائها مستقلة عن بعضها البعض وعن مصمم الخرائط نفسه" (فاولر، PoEAA، مخطط)

أ بوابة بيانات الجدول يكون "بوابة (كائن يتضمن الوصول إلى نظام أو مورد خارجي) إلى جدول قاعدة بيانات.مثيل واحد يعالج كافة الصفوف في الجدول" (فاولر، PoEAA، TableDataGateway)

أ DAO "يفصل واجهة عميل مورد البيانات عن آليات الوصول إلى البيانات الخاصة به/يكيف واجهة برمجة تطبيقات الوصول لمورد بيانات محدد إلى واجهة عميل عامة" السماح "آليات الوصول إلى البيانات تتغير بشكل مستقل عن الكود الذي يستخدم البيانات" (مخططات الشمس)

يبدو المستودع عامًا جدًا، ولا يكشف عن أي فكرة عن تفاعل قاعدة البيانات.يوفر DAO واجهة تمكن من استخدام تطبيقات قاعدة البيانات الأساسية المختلفة.يعد TableDataGateway على وجه التحديد غلافًا رفيعًا حول جدول واحد.يعمل DataMapper كوسيط يمكّن كائن النموذج من التطور بشكل مستقل عن تمثيل قاعدة البيانات (بمرور الوقت).

نصائح أخرى

وهناك اتجاه في تصميم البرمجيات العالم (على الأقل، وأنا أشعر بذلك) لابتكار أسماء جديدة للأشياء والأنماط القديمة المعروفة. وعندما يكون لدينا نموذج جديد (والذي يختلف ربما قليلا من الأشياء الموجودة بالفعل)، فإنه عادة ما تأتي مع مجموعة كاملة من أسماء جديدة لكل مستوى. حتى "منطق الأعمال" يصبح "الخدمات طبقة" فقط لأننا نقول إننا نفعل SOA، وDAO يصبح مستودع لمجرد أن نقول نفعل DDD (ولكل من تلك ليست في الواقع شيئا جديدا وفريدة من نوعها على الإطلاق، ولكن مرة أخرى: أسماء جديدة لمفاهيم معروفة جمعها في كتاب واحد). لذلك أنا لا أقول أن كل هذه النماذج الحديثة والمختصرات يعني بالضبط نفس الشيء، ولكن هل حقا لا ينبغي أن يكون بجنون العظمة جدا حول هذا الموضوع. في الغالب وهذه هي نفس الأنماط، فقط من عائلات مختلفة.

مخطط البيانات مقابل بوابة بيانات الجدوللجعل القصة الطويلة أقصر:

  • سيتلقى مخطط البيانات كائن نموذج المجال (الكيان) كمعلمة وسيستخدمه لتنفيذ عمليات CRUD
  • ستستقبل بوابة بيانات الجدول جميع المعلمات (كأوليات) للطرق ولن تعرف أي شيء عن كائن نموذج المجال (الكيان).

    في النهاية، سيعمل كلاهما كوسيط بين الكائنات الموجودة في الذاكرة وقاعدة البيانات.

  • لديك نقطة جيدة. اختيار واحد كنت أكثر دراية. أود أن أشير إلى عدد قليل من الأشياء التي يمكن أن تساعد على توضيح.

    ويستخدم بوابة بيانات الجدول أساسا لجدول واحد أو رأي. فهو يحتوي على كل يختار، إدراج والتحديثات والحذف. حتى العملاء هو جدول أو طريقة عرض في قضيتك. لذلك، مثيل واحد من وجوه بوابة بيانات الجدول يعالج كافة الصفوف في الجدول. عادة ما يرتبط هذا لكائن واحد في جدول قاعدة البيانات.

    وعلى الرغم مخطط البيانات هي أكثر استقلالا من أي منطق نطاق وأقل جانب (على الرغم من أنني أعتقد إما هناك اقتران أم لا اقتران). إنها مجرد طبقة وسيطة لنقل البيانات بين الأشياء وقاعدة بيانات مع إبقائها مستقلة عن بعضها البعض ومخطط نفسها.

    وهكذا، وعادة في مخطط، ترى أساليب مثل إدراج، تحديث وحذف وفي بوابة بيانات الجدول سوف تجد getcustomerbyId، getcustomerbyName، وما إلى ذلك.

    والكائن نقل البيانات يختلف اثنان أنماط المذكورة أعلاه، ويرجع ذلك أساسا هو نمط التوزيع وليس نمط مصدر البيانات على النحو الوارد أعلاه نمطين. استخدام أساسا عندما كنت تعمل مع واجهة عن بعد وتحتاج إلى إجراء المكالمات أقل الشطي كما كل مكالمة يمكن الحصول على تكاليف باهظة. لذلك عادة تصميم DTO التي يمكن إجراء تسلسل على الأسلاك التي يمكن أن تحمل جميع البيانات مرة أخرى إلى الخادم لتطبيق المزيد من قواعد العمل أو المعالجة.

    وأنا لست ضليعا في نمط مستودع لأنني لم أحصل على فرصة لاستخدام حتى الآن، ولكن سيتم النظر في إجابات الآخرين.

    وفيما يلي مجرد فهمي.

    على TableGateWay / RowDataGateWay : ل وفي هذا السياق، بوابة يشير التنفيذ المحددة التي لديها كل "كائن المجال" خرائط لكل "بوابة كائن المجال". على سبيل المثال، إذا كان لدينا <م> شخص ، ثم سيكون لدينا <م> PersonGateway لتخزين شخص كائن المجال إلى قاعدة البيانات. اذا كان لدينا شخص، والموظفين، العملاء، وما إلى ذلك، سيكون لدينا PersonGateway، EmployeeGateway، وCustomerGateway. وسيكون لكل بوابة لديها وظيفة CRUD محددة لهذا الكائن، وأنه لا علاقة له مع بوابة أخرى لا شيء. لا يوجد كود قابلة لإعادة الاستخدام / وحدة هنا. العبارة يمكن تقسيم إلى RowDataGateway أو TableGateway، يعتمد إذا قمت بتمرير "المعرف" أو "كائن". بوابة عادة ما يكون مقارنة مع سجل نشط. أنه يربط نموذج المجال لمخطط قاعدة البيانات.

    على مستودع / DataMapper / DAO : في هم نفس الشيء. أنهم جميعا الرجوع إلى طبقة المثابرة التي تنقل الكيانات قاعدة بيانات لنموذج المجال. وخلافا للبوابة، ومستودع / DataMapper / DAO إخفاء التنفيذ. كنت لا تعرف إذا كان هناك PersonGateway وراء شخص. فإنه قد أو قد لا، كنت لا تهتم. كل ما أعرفه هو أنه يجب أن يكون دعم عمليات الخام لكل كائن المجال. ومن فصل نموذج مصدر البيانات والنطاق.

    مرخصة بموجب: CC-BY-SA مع الإسناد
    لا تنتمي إلى StackOverflow
    scroll top