عارض الرماد: إعادة التشغيل

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

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



اقتباس من CF Matrix: "قرص واحد يكفي ، الجدد." المدير: Wachowski الإخوة والأخوات. 1999. الولايات المتحدة الأمريكية

منذ أكثر من 10 سنوات ، كتبت رمزًا لـ ASH Viewer (المزيد عن طريقي هنا ) ، ونشرته أولاً على sourceforge.net ، ثم على github حتى يتمكن الناس من الاتصال وإضافة وظائف وتصحيح الأخطاء. تم بناء المشروع باستخدام Gradle ، وحل المشكلات المتعلقة بعرض الرسوم البيانية: قائمة كاملة تقريبًا بالتحسينات حسب المرجع .

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

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

منذ إصداره الأول ، نشط ASH Viewer في هذا المجال. تم إجراء ثلاثة مشاريع كبيرة إلى حد ما على أساس JfreeChart لتحليل البيانات. بالإضافة إلى هذه المشاريع ، جربت مناهج ونماذج ومكتبات مختلفة. كنتيجة لذلك ، قررت أن كل شيء يجب أن يكون مكتوبًا بلغة Java النقية ، دون استخدام المكتبات المصممة خصيصًا لإنشاء واجهة رسومية من البداية. لكن مع ذلك ، يعد استخدام مكتبات الجهات الخارجية لحل بعض المهام عالية التخصص أمرًا مقبولًا تمامًا - حيث سيتيح لك ذلك الحفاظ على المستوى اللازم من المرونة ولن يتطلب وقتًا طويلاً يُقضي في إصلاح الخلل وتطوير الوظائف المطلوبة بيديك.

كيف بدأ كل شيء


كنت قلقًا دائمًا ، ولكن هل هناك مثال في المجال العام يعطي أساسيات كتابة تطبيقات التعقيد المتوسط ​​بشكل صحيح في Java Swing؟ بالطبع أرسلوني إلى المكتبة نفسها أو إلى بعض الأمثلة البسيطة من الكتب المدرسية. وفي بعض النواحي كانوا على حق.

لكنني بحثت باستمرار عن رمز التطبيق الذي يمكن استخدامه كمثال على "كيفية القيام بذلك بشكل صحيح" في Java Swing. وأردت أن يكون لدي نظام يعمل أمام عيني حتى يمكن الشعور به.

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

في يوم من الأيام ، عثرت على Angry IP Scanner من محرّكات Anton Keks المحترمة ، ونظرت إليها وأدركت على الفور - ها هو! Java Swing ، وظيفة بسيطة ، رمز نظيف ، نمطية - قراءة لطيفة! بشكل عام ، استخدمت الطرق المستخدمة فيه عند كتابة أحد المشاريع السابقة ، ثم عند إعادة كتابة ASH Viewer.

البرامج والمكتبات التي ساعدت في تحسين جودة الشفرة وتبسيط العمل


IDEA : لقد تم استخدام IDE هذا للبرمجة Java لمدة خمس سنوات حتى الآن. أؤكد رأي الأغلبية - هذا برنامج مفيد حقًا وأداة ملائمة جدًا لكتابة التعليمات البرمجية. عندما انتقلت إليها من Eclipse www.eclipse.org/ide (وكانت النسخة الأولى مكتوبة على هذا IDE) ، وبعد تدريب قصير أدركت أن IDEA يرشدك ويخبرك عندما تحاول التبديل إلى الجانب المظلم :). تسليط الضوء على التكرار في التعليمات البرمجية يبقيك في حالة جيدة ويمنعك من القيام بلصق نسخ غبي. افي JetBrains!

Java 8 : تعبيرات lambda التي تجعل من الممكن كتابة رمز أقصر ، واجهة برمجة تطبيقات Time جديدة تتيح لك إلغاء استخدام مكتبة Joda Time التابعة لجهة خارجية.

خنجر 2 : إطار حقن التبعية لم أستخدمه من قبل. لكنني تجسست بطريقة ما على كيفية استخدام هذه المكتبة بواسطة Anton antonkeks ، وبدأت في العمل وفقًا للقالب. قسّم البرنامج إلى وحدات ، حيثما أمكن ، استخدم حقن التبعية. إذا لم يكن ذلك ممكنًا ، فقد استخدم إنشاء الأجسام الصدفية مقدمًا ، ثم قام بتعيين السمات الضرورية أو ببساطة لم يستخدم DI.

نظام بناء مخضرم . هذا هو نظام الإنشاء الذي هو المعيار الفعلي ، لذلك قررت أن أضيف المكتبات بشكل نظيف من خلال pom.xml وأن أستخدم نظام الوحدة النمطية Maven للعمل مع JFreeChart و Gantt code في مشروع واحد.

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

يوميات: جعل برنامج جافا المثالي؟ لذلك ، دون وسائل حديثة للصحافة ، في أي مكان. لذلك ، نأخذ واجهة التسجيل البسيطة لجافا SLF4J و Logback كأساس .

مدير التخطيط: أستخدم بشكل رئيسي برنامج Miglayout . من الصعب للغاية التعلم (في بعض الأماكن يمكنني استخدام مديري تخطيط Swing بالطريقة القديمة) ، لكنها قصيرة. يتيح لك القيام بمثل هذه التأثيرات المثيرة للاهتمام كما في علامة التبويب التفاصيل.

Swingx بواسطة Swinglabs: واجهة Java Swing UI المهجورة منذ فترة طويلة. أنا استخدم بنشاط JXTable. يسهل الاختيار التعسفي لأعمدة الجدول والبحث المدمج في محتويات الخلايا إجراء تحليل مفصل لبيانات محفوظات الجلسات النشطة.

ommons-dbcp2 : مفيد لإنشاء تجمع اتصال لاتصالات قاعدة البيانات. في الإصدار القديم ، استخدمت تطبيقًا معدلاً وجدته على الإنترنت.

المكتبات التي انتقلت من الإصدار القديم


Oracle Berkeley DB Java Edition v. 5.0.73: تخزين مفتاح القيمة المضمّن. لتخزين بيانات السجل المجمعة للجلسات النشطة.

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

E-Gantt : مكتبة لإنشاء رسومات Gantt في Java Swing. آثاره الآن لا يمكن العثور عليها حتى على شبكة الإنترنت ، للأسف. وضعت أيضا كوحدة منفصلة Maven في المشروع.

من المثير للاهتمام في الكود ، ما يمكنك الانتباه إليه


التغييرات المعمارية:

  1. الآن يتم تخزين الإعدادات في قاعدة بيانات مدمجة منفصلة ، وليس في ملفات نصية عادية. نظرًا لعدم وجود الكثير من البيانات ، يتم استخدام نمط EAV المتقدم لتخزين إعدادات الاتصال ؛
  2. لتخزين بيانات المراقبة ، قررت أن أشبه محرك OLAP. أولاً ، لتسريع عرض Gantt drilldown بواسطة SQL_ID / SESSION_ID على النطاق المحدد. ثانياً ، للحصول على إمكانية البحث السريع على SQL_ID / SESSION_ID على الرسوم البيانية المتراكمة و Gantt. ثالثًا ، تشكيل العرض المستقبلي لتاريخ الجلسات النشطة (أعلى على التوقعات ، واستكشاف التوقعات ، والتمرين على SQL_ID / SESSION_ID). يتم تخزين كل شيء في كيان واحد (يتم فصل البيانات الفعلية لفترات زمنية مدتها 15 ثانية ، وفي المستقبل ، لفترات زمنية ممتدة أخرى) ؛
  3. يتمثل أحد الآثار الجانبية للهندسة المعمارية النظيفة في القدرة على دعم مراقبة تاريخ الجلسات النشطة لقواعد البيانات الأخرى. نفذت حاليا دعم بوستجرس. لتوصيل قواعد البيانات الأخرى ، تحتاج إما إلى واجهة جاهزة لبيانات محفوظات الجلسات النشطة (التي تمت إضافتها إلى Postgres أو مثل هذا التطبيق ) أو مجموعة مُعدة ذاتيًا لتاريخ الجلسات النشطة في جدول منفصل ، والتي يمكن الوصول إليها لاحقًا.

    كيفية تمكين الدعم لقاعدة بيانات أخرى
    1. إنشاء فئة جديدة وتنفيذ واجهة IProfile. تفعل الشيء نفسه كما هو الحال في Postgres ؛
    2. إضافة تطبيق الإصدار الجديد من قاعدة البيانات إلى الإجراء loadProfile للفئة ConnectToDbArea و التعداد دالة من فئة ConstantManager ؛
    3. الاتصال والتحقق من التطبيق.

واجهة المستخدم الرسومية


نموذج الاتصال بقاعدة البيانات

تمت إعادة كتابته بالكامل من البداية ، وكانت تستخدم سابقًا أفضل الممارسات من مشروع Squirrel-sql المفتوح. الآن كل شيء في ملف واحد . الجمال!



كيفية الاتصال بقاعدة البيانات
  1. إنشاء اتصال جديد ؛
  2. حدد الاسم وعنوان URL (JDBC هو المعيار لـ Oracle: jdbc: oracle: thin:host: port: SID ، لـ Postgres: jdbc: postgresql: // host: port: database) ، اسم المستخدم / كلمة المرور ، وحدد ملف تعريف مكتبة jdbc ؛
  3. بالنسبة إلى Oracle ، كل شيء يعمل مع ojdbc6.jar ؛ بالنسبة لـ PostgresDB ، يتم التحقق من العمل مع postgresql-42.2.5


أعلى النشاط / واجهة التفاصيل

هنا ، دون تغييرات كبيرة ، على غرار الإصدار القديم ، فقط دون عرض القصة.



حفر بواسطة SQL_ID / SESSION_ID

SQL



ASH : رسم بياني للنشاط لـ SQL_ID معين ، يسمى بالنقر المزدوج فوق الصف مع SQL_ID من Gantt-graph.
Sql text / plan : بالنسبة إلى Oracle / Postgres ، يمكن الحصول على النص الكامل للطلب. فقط من أجل Oracle يتم توفير خطط تنفيذ الاستعلام لجميع plan_hash_value.
الإحصائيات : بيانات الجدول بواسطة SQL_ID: جلب من V $ SQL. الكود لديه القدرة على إضافة المزيد من الكيانات التي يمكنك من خلالها الاختيار (انظر التنفيذ ). ولكن عليك أن تكون حذراً للغاية ، فقد تكون هناك مشكلات في الأداء: على سبيل المثال ، يكون جلب VARE SQLAREA على الأنظمة المحملة بطيئًا للغاية).

الجلسة

ASH : الرسم البياني للنشاط session_id ، على غرار SQL ، انقر نقرًا مزدوجًا على سطر الجلسة من رسم Gantt.
إحصائيات : بيانات الجدول بواسطة SQL_ID: جلب من V $ SESSION و V $ PROCESS. الكود لديه القدرة على إضافة المزيد من الكيانات التي يمكنك من خلالها الاختيار (انظر التنفيذ ).

خطط أخرى


  1. تثبيت API. إجراء إعادة هيكلة الرمز النهائي. تنفيذ التخزين الديناميكي لبيانات المراقبة الأولية ، والتي لن تعتمد على إصدارات وأنواع قاعدة البيانات ؛
  2. لا توجد بالفعل اختبارات كافية لاختبار الوحدات الرئيسية للنظام و CI وأفضل الممارسات الأخرى.

رمز مشروع جيثب ، ملفات المشروع ؛
رابط إلى المجموعة في Telegram t.me/ashviewer للإبلاغ عن آخر التحديثات ؛

PS الذي يقرر الاتصال بالتطوير - الكتابة إلى PM ، دون إثارة لا لزوم لها ودون خلق سحق ، بالطبع :).

هذا كل شيء. شكرا لاهتمامكم!

Source: https://habr.com/ru/post/ar441186/


All Articles