يتضمن نموذج التطوير الكلاسيكي لأي تطبيق وثائق جيدة على واجهة المستخدم وواجهة برمجة التطبيقات ، وكذلك ، إذا لزم الأمر ، تغطية جيدة للكود المصدري مع التعليقات. في هذه الحالة ، يبدأ وضع اللمسات الأخيرة على النظام بدراسة الوثائق ، ثم يتم تغيير الرمز مباشرة ، وأخيرا ، يتم تحديث جميع المعلومات اللازمة.
ومع ذلك ، واحدة من المشاكل مع هذا النهج هو أنه يزيد بشكل كبير من التكلفة ويبطئ عملية التنمية. ماذا لو لم يكن كل هذا؟ ثم يأتي IDE إلى عملية الإنقاذ ، وبفضل ذلك يمكنك دراسة المنطق الحالي باستخدام الكود العاري.
عندما طورنا منصة
lsFusion بلغة مضمنة ، كان لدينا العديد من الخيارات. إما إعادة اختراع العجلة ، والكتابة من الصفر IDE الخاص بك ، كما فعل 1C في وقت واحد ، أو تنفيذ مكون إضافي لأحد الموجودة. ذهبنا في الطريق الثاني ، وفي هذا المقال سأبين ما حدث.
منذ أن تم تطوير النظام الأساسي نفسه في Java ، كان لدينا خياران رئيسيان: Eclipse أو IDEA. استقرنا على الخيار الأخير ولم نفشل. عندما اتخذنا القرار ، كانت IDEA لا تزال غير شعبية بما فيه الكفاية ، ولكن منذ ذلك الحين ، برزت كقادة في السوق ، وتأخر Eclipse بهدوء.
لم يستغرق تطوير
المكون الإضافي نفسه الكثير من الوقت ، لأنه كان من الممكن استخدام الكود المستخدم مباشرة أثناء تنفيذ النظام الأساسي بعدة طرق. وبالتالي ، مع الحد الأدنى من الجهد ، حصلنا على IDE قوي للغاية ، وفي كثير من الجوانب متفوقة بشكل كبير في الوظائف على IDE للعديد من المنصات الأخرى لتخطيط موارد المؤسسات (سواء الأصلية والمبنية على Eclipse).
من الصعب المبالغة في تقدير دور IDE في التنمية. على الرغم من حقيقة أن العديد من المطورين لا يزالون يستخدمون vim ويعتقدون أنه ينبغي أن يكون. هذا الموقف له الحق في الحياة إذا قام شخص واحد بتطوير ودعم هذا الرمز. ومع ذلك ، في المشروعات الكبيرة التي يشارك فيها عدد كبير من الأشخاص ، تعد قابلية التبادل مهمة جدًا. يمرض الموظفون ، ويذهب في إجازة ، ويترك في النهاية. بالإضافة إلى ذلك ، يكون الحمل على المشروعات المختلفة غير متساوٍ ، وأحيانًا يكون مطلوبًا توصيل المزيد من الأشخاص بواحد منهم للوفاء بالمواعيد النهائية. في مثل هذه اللحظات ، يتعين عليك توصيل أشخاص جدد بالتحسينات ، والذين يحتاجون إلى معرفة كيفية عمل البرنامج حاليًا وإجراء التغييرات اللازمة. وهنا يأتي IDE.
بادئ ذي بدء ، كنا بحاجة إلى ما يلي من IDE:
- دعم بناء الجملة . تمييز الكلمات الرئيسية ، الاستبدال التلقائي ، تسليط الضوء على الأخطاء.
- الملاحة. انتقل إلى الإعلان ، ابحث عن الاستخدامات ، ابحث بحسب السلسلة النصية أو الملف أو الاسم ، إلخ.
- تحليل . التسلسل الهرمي للفئات والمكالمات ، وكذلك خصائص وتصرفات الفئة.
- إعادة بيع ديون. إعادة تسمية الفئات والخصائص والإجراءات.
- التصور من الأشكال . لعرضه على مطور التصميم الحالي لنموذج معين.
- برمجة القدرة على إنشاء التعليمات البرمجية المستندة إلى metacode أثناء الطيران .
- المصحح. القدرة على تعيين نقاط التوقف (بما في ذلك الظروف) ، وتصحيح المنطق الضروري ، ومشاهدة الساعات.
- حقن اللغة . تسليط الضوء على التنقل ، وإعادة البناء ، والاستبدال التلقائي ، وبناء الجملة lsFusion عند استخدامها بلغات أخرى - Java و JasperReports XML.
نظرًا لأننا استخدمنا المخطط القياسي المضمن في IDEA للمكون الإضافي ، فقد أصبح الإخراج من العمل باستخدام المنطق في lsFusion متطابقًا تقريبًا مع التطوير في Java. نفس عناصر القائمة ، والمفاتيح الساخنة ، وتصحيح الأخطاء الشفاف ، والتي يمكن أن تنتقل من كود lsFusion إلى Java والعكس ، وهكذا.
فيما يلي بعض الأمثلة البسيطة لإظهار كيف يعمل هذا في الممارسة العملية.
دعم بناء الجملة
يمكن للمكون الإضافي استبدال الكلمات الرئيسية الصالحة ، والخصائص المحتملة ، واكتشاف الأخطاء المختلفة تلقائيًا:

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

في النافذة التي تظهر ، يمكنك أن ترى على الفور في أي وحدة يتم إنشاء هذه الخاصية (شحنة) ، وما هو رقم الصف الموجود فيها (37) ، والجدول الذي تم تخزينه فيه (_auto_Shipment_ShipmentDetail) ، وعدد من المعلومات الأخرى.
للانتقال مباشرةً إلى بيان الملكية ، يلزمك بدء البحث عن الملف وإدخال Shipment في مربع الحوار الذي يظهر:


بعد ذلك ، باستخدام Navigate - Line / Column ، انتقل إلى السطر 37 ، حيث نرى إعلان الخاصية:

بالضغط على CTRL + ALT + F7 ، أثناء وجود المؤشر على الخاصية المطلوبة ، يمكنك العثور بسرعة على جميع استخداماته لجميع المشاريع:

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

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

لتلخيص ، وجدنا أين تم الإعلان عن هذه الخاصية التي نحتاجها ، وفي أي الحالات يتم استخدامها ، وعندما يتم التسجيل هناك. على الفيديو ، قمت بجميع الإجراءات باستخدام الماوس ، على الرغم من أنه بالطبع ، في الممارسة العملية ، يتم استخدام لوحة المفاتيح فقط. تتيح لك هذه التقنية تحديد منطق النظام المطبق الحالي وإجراء تغييرات عليه بسرعة ، وفهم كامل لما سيؤدي إليه هذا.
إعادة بيع ديون
غالبًا ما تكون هناك مواقف عندما تحتاج إلى تغيير اسم خاصية أو فئة أو نموذج أو أي عنصر آخر في النظام. لتنفيذ مثل هذا الإجراء ، تحتاج إلى الوقوف على هذا العنصر والنقر فوق Refactor - إعادة تسمية:

تؤدي إعادة تسمية عنصر تلقائيًا إلى تغيير شفرة المصدر في جميع أماكن استخدامه. بالإضافة إلى ذلك ، إذا تم إنشاء ملف migration.script ، فستتم إضافة الإدخالات المقابلة هناك. يحتاج الخادم إلى معرفة تغيير الاسم بالترتيب ، على سبيل المثال ، لترحيل البيانات تلقائيًا من عمود إلى آخر. وإلا ، فمن المستحيل التمييز بين إعادة تسمية وإنشاء خاصية جديدة باسم مختلف.
تحليل
قبل القيام بإعادة البناء ، من الضروري في كثير من الأحيان معرفة "ما يحدث" و "من هم كل هؤلاء الناس".
للقيام بذلك ، تسمح لك IDEA ، خارج الصندوق تقريبًا ، بعرض بنية الفئة المحددة (الخصائص والإجراءات المتاحة لهذه الفئة):

أيضًا ، إذا كنت بحاجة إلى الحصول على صورة عامة لما يحدث ، فإن IDEA تسمح لك بإنشاء تسلسلات هرمية مختلفة:
- وراثة الفئة المختارة
- استخدامات العنصر المحدد (على سبيل المثال ، الخصائص أو النماذج)

يتم توفير جميع الميزات العليا بواسطة IDEA تلقائيًا (مع الحد الأدنى من الإيماءات) بعد تنفيذ إعلانات محرك البحث. أدت مجموعة الميزات التالية إلى جعل العبث الإضافي أكثر بقليل ، ولكن لا يزال يتم توفير جزء كبير من البنية التحتية بواسطة IDEA (ليس بدون مشاكل بالطبع ، ولكن المزيد عن ذلك لاحقًا).
نموذج التصور
في lsFusion ، يتم تعيين بنية النماذج وتصميمها في نفس الرمز مثل منطق المجال باستخدام إنشاءات خاصة. علاوة على ذلك ، يمكن الإعلان عن أجزاء مختلفة من النموذج في وحدات نمطية مختلفة ، وعند بدء تشغيل الخادم ، "سيتم دمج" معًا ، اعتمادًا على الوحدات النمطية المتصلة.
لرؤية التصميم الناتج ، يمكنك بالطبع إعادة تشغيل الخادم ومشاهدة النتيجة في العميل. ولكن إعادة تشغيل الخادم يستغرق بعض الوقت. البرنامج المساعد يمكنه:
- إظهار التصميم الحالي والهيكل الهرمي للنموذج في نافذة خاصة
- العثور على عناصر في هيكل الشكل
- تمييز عنصر الشكل المحدد في التصميم
إليك ما يبدو في IDE:

عند إنشاء نموذج ، يتم فقط أخذ الوحدة النمطية النشطة الحالية وكل شيء يعتمد عليها في الاعتبار.
ليس من الممكن بعد تغيير التصميم الحالي بشكل مرئي ، حيث يتم تشكيل النموذج من عدة كتل من التعليمات البرمجية. أثناء التعديل ، يصعب تحديد المكان الذي تريد إجراء التغييرات المناسبة فيه بوضوح. بالإضافة إلى ذلك ، يمكن تعديل نفس العنصر في عدة كتل من التعليمات البرمجية ، ويضمن النظام أنه إذا كانت إحدى الوحدات تعتمد على وحدة أخرى ، فسيتم تطبيق تغييراتها أخيرًا. ومع ذلك ، نخطط في المستقبل لإضافة وظائف معينة لتغييرات التصميم المرئي.
metaprogramming
في بعض الأحيان هناك حاجة لإنشاء نفس النوع من التعليمات البرمجية لمختلف المهام. يحتوي LsFusion على آلية metacode تتيح لك إنشاء رمز يستند إلى بعض القوالب. في هذه الحالة ، في حالة حدوث تغيير في metacode ، سيتم تحديث الرمز تلقائيًا. في الواقع ، هذه نسخة / لصق تلقائي مع إمكانية استبدال بعض المعرفات بقيم محددة.
لتمكين هذه الآلية ، يجب عليك أولاً تفعيلها في القائمة. بعد ذلك ، سيقوم IDE تلقائيًا بتغيير الكود المقابل.

عند بدء تشغيل الخادم ، سيتم استخدام الرمز الذي تم إنشاؤه فقط. لن تؤخذ قوالب META نفسها في الاعتبار عند بدء تشغيل الخادم.
بالمناسبة ، أجبرنا تنفيذ إمكانية metaprogramming على تقديم مساهمة أخرى للمصدر المفتوح (في هذه الحالة ، Intellij IDEA). والحقيقة هي أنه في ERP يتم استخدام metacodes بنشاط كبير ، وبالتالي ، في كثير من الأحيان هناك حاجة لإنشاء رمز / حذف التعليمات البرمجية التي تم إنشاؤها. يؤدي هذا إلى عدد كبير من التغييرات غير المتزامنة للملفات ، والتي بدورها أدت إلى حدوث
خلل كبير جدًا. المشكلة هي أنه لا يمكن لعبها في JetBrains نفسها ، لذلك كل ذلك يرجع إلى حقيقة أننا أنفسنا اضطررنا إلى كتابة
اختبار وحدة غير عاملة. استغرق هذا الأمر بالطبع عدة أيام ، لكنه ساعدنا بشكل غير مباشر في تنفيذ الاحتمالين التاليين.
المصحح
عندما يكون الرمز غير واضح تمامًا ما يحدث ، يجب عليك اللجوء إلى مصحح الأخطاء. على أي سطر من المنطق الضروري (الإجراءات ، الأحداث ، القيود) ، يمكنك وضع نقطة توقف. بمجرد أن يصل تنفيذ الخادم إلى هذه النقطة ، سيتم إيقافه وسيذهب التحكم إلى المصحح. في هذه اللحظة ، يمكنك مشاهدة الساعات ، وكذلك متابعة خط التنفيذ. على اليسار ، سيتم عرض تتبع مكدس ، حيث يمكنك التنقل خلاله عند تصحيح أخطاء تطبيق Java العادي.

عند عرض القيم الحالية ، يمكنك الوصول إلى كل من الكائنات الحالية (على سبيل المثال ، Shipment s) ، وأي كائنات أخرى من قاعدة البيانات (على سبيل المثال ، العنصر i). ومع ذلك ، فإن المطور نفسه مسؤول عن إضافة البيانات إلى الساعات ، والتي ستستغرق قراءتها الكثير من الوقت أو الذاكرة ، وستؤدي إلى انخفاض في الأداء.
يمكنك أيضًا تعيين نقاط توقف على خاصية معينة. سيتوقف التنفيذ في أي مكان عند إنشاء سجل له:

يعد هذا مفيدًا عندما تحتاج إلى تحديد الحدث أو الإجراء الذي يغير قيمة الخاصية.
لتطبيق مصحح الأخطاء بالفعل ، استخدمنا بالفعل IDEA Java Debugger الموجود. أي أنه يجري تصحيح أخطاء النظام الأساسي كتطبيق Java عادي ، ولكن بالنسبة لإجراءات lsFusion ، فإننا نقوم بإنشاء طرق java بالبروكسي واستبدالها برمزنا (كما أفهمها في IDEA ، يتم ذلك لدعم Scala والمغلفات الأخرى عبر Java). وهنا كانت لحظة مضحكة. في مرحلة ما ،
جعل مطورو IDEA مُنشئ Java Debugger الخاص بهم. وإذا كان لا يزال من الممكن التغلب على الموقف من الاتصال بالطرق الخاصة من خلال "التفكير" ، فإن كيفية التوريث من الفصل باستخدام منشئ خاص ليست واضحة. ولكن في ذلك الوقت كانت هناك مواجهة مع خلل من القسم العلوي ، وقررنا "المقايضة" أن نطلب من الناس من JetBrains إعادة حماية هذا المنشئ ، والذي استجابوا إليه بسرعة كبيرة (بالطبع ، شكرًا جزيلاً لهم).
حقن اللغة
واحدة من أكثر ميزات IDEA غير العادية هي القدرة على توفير الدعم للغتك في ثوابت السلسلة باللغات الأخرى. للقيام بذلك ، يكفي إخبار IDEA بالضبط أي ثوابت السلسلة تنطبق على لغتك ، ثم IDEA نفسها تلقائيًا:
- ينشئ ملفًا ظاهريًا (أو عدة ملفات) بالبادئات المحددة لكل ثابت سلسلة
- ينشئ في محرر الملف المصدر لجميع الثوابت نوعًا من "النافذة" في هذا الملف الظاهري
- يوفر في هذا الملف الافتراضي الدعم لجميع ميزات اللغة "المضمنة" ، مثل تسليط الضوء على الأخطاء ، والتحول إلى إعلان ، والإكمال التلقائي ، والبحث عن الاستخدامات ، والأهم من ذلك ، إعادة التنظيم. أي عند إعادة تسمية أي عنصر بلغة واحدة ، تتم إعادة تسميته تلقائيًا في جميع ثوابت السلسلة التي تشير إلى هذا العنصر بلغات أخرى. وبالتالي ، فأنت محمي تلقائيًا من الروابط المعطلة.

هنا في IDEA كان هناك (ولا يزال)
حشرة صغيرة. عندما يكون الملف الظاهري كبيرًا ، إذا كان يجب أن ينتقل IDEA إلى بداية "نافذة التنفيذ" عندما يواصل استخدامه ، فإنه ينتقل فعليًا إلى نهاية "نافذة التنفيذ" السابقة (على سبيل المثال ، للاستخدام السابق للخاصية في ملف Java). بالطبع ، هناك حل بسيط لهذا الخطأ هو إنشاء ملف ظاهري منفصل لكل سلسلة حرفية. لكن هذا النهج يتباطأ عندما يكون هناك أكثر من 30 استخدامًا ، لذلك في هذه الحالة لا يزال عليك استخدام ملف افتراضي كبير واحد (من ناحية أخرى ، عندما يكون هناك الكثير من الاستخدامات ، ليس من الصعب العثور على الاستخدام الصحيح ، أي ما يلي). لقد طلبنا إصلاح هذا الخطأ مرة أخرى في إطار "تبادل الخدمة" ، ونوع من مطوري JetBrains قاموا بإصلاحه ، ولكن كما اتضح لاحقًا ، بطريقة ما لم يكن الأمر كذلك (كان لا يزال مرئيًا من قبل الالتزام ، لكننا اعتقدنا أن الأمر لا يصل إلى فهمه في النهاية). ومع ذلك ، فقد اعتدنا جميعًا على هذا الخطأ لفترة طويلة ، نظرًا لأن الموقف من استخدام أكثر من 30 عنصرًا في ملف واحد نادر جدًا.
استنتاج
توضح المقالة حالات الاستخدام الرئيسية فقط. كما أن لديها القدرة على البحث عن تطبيقات الخصائص والفئات المجردة ، وتصور التبعيات بين الوحدات النمطية والخصائص ، وإنشاء النماذج تلقائيًا استنادًا إلى xml / json ، وغير ذلك الكثير. وبالطبع ، هناك تكامل مدمج مع أنظمة التحكم في الإصدار الرئيسي من Git و Subversion ، بالإضافة إلى دعم Maven و Ant.
بعد مسار تطوير المكوّن الإضافي لـ IDEA ، بجهد ضئيل حصلنا على بيئة تطوير متكاملة مجانية قوية للغاية تفوق المنافسين IDE في العديد من النواحي.