Window.pipedriveLeadboosterConfig = { القاعدة: 'leadbooster-chat.pipedrive.com', companyId: 11580370, playbookUuid: '22236db1-6d50-40c4-b48f-8b11262155be', الإصدار: 2, } ؛(الدالة () { var w = نافذة إذا كان (w.LeadBooster) { console.warn('LeadBooster موجود بالفعل') } وإلا { { w.LeadBooster = { q: [], على: دالة (ن، ح) { { هذا.q.push({ t: 'o'، n: n، n: n، h: h }) }, الزناد: الدالة (n) { هذا.q.push({ t: 't'، n: n: n }) }, } } })() تحسين التعليمات البرمجية باستخدام كائنات الاستعلام - The Codest
The Codest
  • نبذة عنا
  • الخدمات
    • تطوير البرمجيات
      • تطوير الواجهة الأمامية
      • تطوير الواجهة الخلفية
    • Staff Augmentation
      • مطورو الواجهة الأمامية
      • مطورو الواجهة الخلفية
      • مهندسو البيانات
      • مهندسو السحابة
      • مهندسو ضمان الجودة
      • أخرى
    • استشاري
      • التدقيق والاستشارات
  • الصناعات
    • التكنولوجيا المالية والمصرفية
    • E-commerce
    • أدتك
    • التكنولوجيا الصحية
    • التصنيع
    • الخدمات اللوجستية
    • السيارات
    • إنترنت الأشياء
  • القيمة مقابل
    • CEO
    • CTO
    • مدير التوصيل
  • فريقنا
  • دراسات الحالة
  • اعرف كيف
    • المدونة
    • اللقاءات
    • ندوات عبر الإنترنت
    • الموارد
الوظائف تواصل معنا
  • نبذة عنا
  • الخدمات
    • تطوير البرمجيات
      • تطوير الواجهة الأمامية
      • تطوير الواجهة الخلفية
    • Staff Augmentation
      • مطورو الواجهة الأمامية
      • مطورو الواجهة الخلفية
      • مهندسو البيانات
      • مهندسو السحابة
      • مهندسو ضمان الجودة
      • أخرى
    • استشاري
      • التدقيق والاستشارات
  • القيمة مقابل
    • CEO
    • CTO
    • مدير التوصيل
  • فريقنا
  • دراسات الحالة
  • اعرف كيف
    • المدونة
    • اللقاءات
    • ندوات عبر الإنترنت
    • الموارد
الوظائف تواصل معنا
السهم الخلفي العودة إلى الوراء
2019-03-08
تطوير البرمجيات

تحسين التعليمات البرمجية باستخدام كائنات الاستعلام

The Codest

توماش زكاراديك

مهندس التطوير

من المحتمل جدًا أن تكون قد واجهت في العمل مع النماذج المحملة بشكل زائد وعدد كبير من المكالمات في وحدات التحكم لمرات عديدة. استنادًا إلى المعرفة في بيئة Rails، سأقترح في هذه المقالة حلاً بسيطًا لهذه المشكلة.

أحد الجوانب المهمة جدًا في تطبيق القضبان هو تقليل عدد التبعيات الزائدة عن الحاجة، وهذا هو السبب في أن بيئة Rails بأكملها كانت تروج مؤخرًا لنهج كائن الخدمة واستخدام طريقة PORO (كائن روبي القديم النقي). ستجد وصفًا لكيفية استخدام مثل هذا الحل هنا. في هذه المقالة، سنقوم بحل المفهوم خطوة بخطوة وتكييفه مع المشكلة.

المشكلة

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

ستجد أدناه نموذج تطبيق موسع بالفعل. يتم تخزين معاملات نظام الدفع فيه. كما ترى في المثال أدناه:

فئة المعاملة  { حيث (مرئي: صحيح)}

  النطاق(:نشط، لامدا دو
    ينضم (<<<SQL
      LEFT OUTER JOIN FORTER JOIN Source ON Trans transactions.source_id = source.id
      و source.accepted_at المصدر ليس فارغًا
    SQL
  نهاية)
النهاية

النموذج هو شيء واحد، ولكن مع زيادة حجم مشروعنا، تبدأ وحدات التحكم أيضًا في التضخم. لننظر إلى المثال أدناه:

صنف TransactionsController <متحكم التطبيق
  تعريف الفهرس
    المعاملات = Transaction.for_publishers.for_publishers
                                   نشط
                                   .مرئي
                                   .joins("LEFT JOIN LEFT JOIN withdrawal_items ON withdrawal_items.transaction_id = transaction.id")
                                   .joins("LEFT JOIN JOIN SPARIN DRUIN DRUIN ON withdrawals.ID = withdrawal_items.withdrawal_id or
 (معرف السحوبات = source.resource_id و source.resource_type = 'سحب')")")
                                   .order(:created_at)
                                   .page(params[:page])
                                   .لكل(بارامز[:صفحة])
    @المعاملات = تطبيق_المعاملات(@المعاملات)
  النهاية
النهاية

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

الحل

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

لنقم بإنشاء دليل جديد باسم "الخدمات"، الموجود في دليل التطبيقات في مشروعنا. هناك سننشئ صنفًا باسم استعلام المعاملات.

فئة استعلام المعاملات
نهاية

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

فئة استعلام المعاملات
  تعريف التهيئة(النطاق = Transaction.all)
    النطاق = النطاق
  النهاية
النهاية

بفضل هذا، سنتمكن من نقل العلاقة من السجل النشط إلى منشأتنا. يمكننا الآن نقل جميع نطاقاتنا إلى الصف، والتي نحتاجها فقط في وحدة التحكم المقدمة.

فئة استعلام المعاملات
  تعريف التهيئة(النطاق = Transaction.all)
    النطاق = النطاق
  النهاية

  خاص

  تعريف نشط (النطاق)
    ينضم النطاق(<<<SQL
      LEFT OUTER JOIN Source ON Trans transactions.source_id = source.id
      و source.accepted_at المصدر ليس فارغًا
    SQL
  نهاية

  تعريف مرئي (النطاق)
    النطاق(حيث(مرئي: صحيح)
  نهاية

  ديف for_publishers(النطاق)
    النطاق.select("المعاملات.*")
         .ينضم(:حساب)
         .where("حسابات.owner_type.owner_type = 'Publisher'")
         .joins("الانضمام إلى الناشرين على owner_id = publishers.id")
  النهاية
النهاية

لا يزال ينقصنا الجزء الأهم، أي تجميع البيانات في سلسلة واحدة وجعل الواجهة عامة. الطريقة التي سنجمع فيها كل شيء معًا ستسمى "استدعاء".

المهم حقًا هو أننا سنستخدم متغير مثيل @scope هناك، حيث يوجد نطاق استدعائنا.

فئة استعلام المعاملات
  ...
  تعريف الاستدعاء
    مرئي(@نطاق)
        .ثم(&طريقة(:نشط))
        .ثم(&طريقة(:for_publishers))
        .order(:created_at)
  نهاية

  خاص
  ...
نهاية

يقدم الفصل بأكمله نفسه على النحو التالي:

فئة استعلام المعاملات
  تعريف التهيئة(النطاق = Transaction.all)
    النطاق = النطاق
  النهاية

  ديف استدعاء
    مرئي(@النطاق)
        .ثم(&طريقة(:نشط))
        .ثم(&الطريقة(:for_publishers))
        .order(:created_at)
  نهاية

  خاص

  تعريف نشط (النطاق)
    ينضم النطاق(<<<SQL
      LEFT OUTER JOIN Source ON Trans transactions.source_id = source.id
      و source.accepted_at المصدر ليس فارغًا
    SQL
  نهاية

  تعريف مرئي (النطاق)
    النطاق(حيث(مرئي: صحيح)
  نهاية

  ديف for_publishers(النطاق)
    النطاق.select("المعاملات.*")
         .ينضم(:حساب)
         .where("حسابات.owner_type.owner_type = 'Publisher'")
         .joins("الانضمام إلى الناشرين على owner_id = publishers.id")
  النهاية
النهاية

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

فئة المعاملة < أكتيف ريكورد::قاعدة
  ينتمي_إلى :حساب
  لديه_واحد :عنصر السحب
نهاية

لقد نفذت وحدة التحكم بالفعل حلنا؛ لقد نقلنا جميع الاستعلامات الإضافية إلى فئة منفصلة. ومع ذلك، تظل الاستدعاءات، التي لم تكن لدينا في النموذج، مشكلة لم يتم حلها. بعد إجراء بعض التغييرات، يبدو إجراء الفهرس الخاص بنا كما يلي:

صنف TransactionsController <متحكم التطبيق
  تعريف الفهرس
    @ المعاملات = TransactionsQuery.new.new
                                     .call
                                     .joins("LEFT JOIN LEFT JOIN withdrawal_items ON withdrawal_items.accounting_event_id = transactions.id")
                                     .joins("LEFT JOIN JOIN SPARIN DRUIN DRUIN ON withdrawals.ID = withdrawal_items.withdrawal_id or
 (معرف السحوبات = source.resource_id و source.resource_type = 'سحب')")")
                                     .order(:created_at)
                                     .page(params[:page])
                                     .لكل(بارامز[:صفحة])
    @المعاملات = تطبيق_المعاملات(@المعاملات)
  النهاية
النهاية

الحل

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

فئة TransactionsFilterableQuery
  تعريف التهيئة(النطاق = Transaction.all)
    النطاق = النطاق
  النهاية

  تعريف الاستدعاء
    سحب(@النطاق).ثم(&طريقة(:سحب_العناصر))
  نهاية

  خاص

  ديف سحب(نطاق)
    ينضم النطاق(<<<SQL
      LEFT JOIN LEFT JOIN انسحابات على withdrawals.id = withdrawal_items.withdrawal_id أو
      (معرف السحوبات = source.resource_id و source.resource_type = 'سحب')
    SQL
  نهاية

  def withdrawal_items(النطاق)
    ينضم النطاق(<<<SQL
      LEFT JOIN LEFT JOIN pullal_items ON withdrawal_items.account_event_id = transactions.id
    SQL
  إنهاء
النهاية

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

صنف TransactionsController <متحكم التطبيق
  تعريف الفهرس
    @المعاملات = TransactionsQuery.new.call.new.then do |scope|
      TransactionsFilterableQuery.new.new(النطاق).call
    end.page(params[:page]).per(params[:page]).

    @المعاملات = تطبيق_المعاملات(@المعاملات)
  النهاية
النهاية

الملخص

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

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

مقالات ذات صلة

تطوير البرمجيات

إنشاء تطبيقات ويب مستقبلية: رؤى من فريق خبراء The Codest

اكتشف كيف تتفوق شركة The Codest في إنشاء تطبيقات ويب تفاعلية قابلة للتطوير باستخدام أحدث التقنيات، وتقديم تجارب مستخدم سلسة عبر جميع المنصات. اكتشف كيف تقود خبرتنا التحول الرقمي والأعمال التجارية...

ذا كوديست
تطوير البرمجيات

أفضل 10 شركات لتطوير البرمجيات في لاتفيا

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

thecodest
الحلول المؤسسية وحلول التوسعة

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

استكشف هذا الدليل الأساسي حول تطوير برمجيات جافا outsourcing بنجاح لتعزيز الكفاءة والوصول إلى الخبرة وتحقيق نجاح المشروع باستخدام The Codest.

thecodest
تطوير البرمجيات

الدليل الشامل للاستعانة بمصادر خارجية في بولندا

إن الطفرة في outsourcing في بولندا مدفوعة بالتقدم الاقتصادي والتعليمي والتكنولوجي، مما يعزز نمو تكنولوجيا المعلومات والمناخ الملائم للأعمال.

ذا كوديست
الحلول المؤسسية وحلول التوسعة

الدليل الكامل لأدوات وتقنيات تدقيق تكنولوجيا المعلومات

تضمن عمليات تدقيق تكنولوجيا المعلومات وجود أنظمة آمنة وفعالة ومتوافقة. تعرف على المزيد حول أهميتها من خلال قراءة المقال كاملاً.

The Codest
ياكوب جاكوب جاكوبوفيتش CTO وشريك مؤسس CTO

اشترك في قاعدة معارفنا وابقَ على اطلاع على آخر المستجدات في قطاع تكنولوجيا المعلومات.

    نبذة عنا

    The Codest - شركة دولية لتطوير البرمجيات لها مراكز تقنية في بولندا.

    المملكة المتحدة - المقر الرئيسي

    • المكتب 303 ب، 182-184 شارع هاي ستريت نورث E6 2JA
      لندن، إنجلترا

    بولندا - مراكز التكنولوجيا المحلية

    • مجمع مكاتب فابريتشنا المكتبي، أليجا
      بوكوجو 18، 31-564 كراكوف
    • سفارة الأدمغة، كونستروكتورسكا
      11, 02-673 02-673 وارسو، بولندا

      The Codest

    • الصفحة الرئيسية
    • نبذة عنا
    • الخدمات
    • دراسات الحالة
    • اعرف كيف
    • الوظائف
    • القاموس

      الخدمات

    • استشاري
    • تطوير البرمجيات
    • تطوير الواجهة الخلفية
    • تطوير الواجهة الأمامية
    • Staff Augmentation
    • مطورو الواجهة الخلفية
    • مهندسو السحابة
    • مهندسو البيانات
    • أخرى
    • مهندسو ضمان الجودة

      الموارد

    • حقائق وأساطير حول التعاون مع شريك خارجي لتطوير البرمجيات
    • من الولايات المتحدة الأمريكية إلى أوروبا: لماذا تقرر الشركات الأمريكية الناشئة الانتقال إلى أوروبا؟
    • مقارنة مراكز تطوير التكنولوجيا في الخارج: تك أوفشور أوروبا (بولندا)، آسيان (الفلبين)، أوراسيا (تركيا)
    • ما هي أهم التحديات التي تواجه CTOs ومديري تكنولوجيا المعلومات؟
    • The Codest
    • The Codest
    • The Codest
    • Privacy policy
    • شروط استخدام الموقع الإلكتروني

    جميع الحقوق محفوظة © 2025 بواسطة The Codest. جميع الحقوق محفوظة.

    arArabic
    en_USEnglish de_DEGerman sv_SESwedish da_DKDanish nb_NONorwegian fiFinnish fr_FRFrench pl_PLPolish it_ITItalian jaJapanese ko_KRKorean es_ESSpanish nl_NLDutch etEstonian elGreek arArabic