الخلاصة

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

يبدأ الاختبار المهم بعد نجاح المخرجات

KWIC اختصار لعبارة Key Word in Context. نشر H. P. Luhn عام 1960 طريقة لفهرس آلي يعرض الكلمة في سياق عنوانها. استخدم Parnas نسخة صغيرة من مسألة معروفة: قراءة السطور، وتكوين إزاحاتها الدائرية، وترتيبها أبجدياً، ثم إخراجها.

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

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

التقسيم الأول تبع سير التنفيذ

ضم التصميم التقليدي Input وCircular Shift وAlphabetizing وOutput وMaster Control. بدت المهام منفصلة، لكن الواجهات حملت تخطيطات الذاكرة والمصفوفات المشتركة والفهارس والمؤشرات. كان Input يحزم أربعة محارف في كلمة آلة، وكانت المراحل اللاحقة تعرف شكل الجداول التي سبقتها.

انقسم تدفق التحكم، لكن معرفة التمثيل المتقلب بقيت موزعة.

في التصميم الثاني امتلك Line Storage التمثيل الداخلي للسطور، وقدم عمليات للوصول إلى المحارف والكلمات والسطور. قدم Circular Shifter للعميل صورة مجموعة من السطور المزاحة من دون كشف ما إذا كانت مخزنة أو ممثلة بفهرس أو محسوبة عند الطلب. وامتلك Alphabetizer استراتيجية الترتيب.

كانت module تعني إسناد مسؤولية، لا subroutine. قد تضم الوحدة إجراءات عدة، وقد يجمع البرنامج النهائي شيفرة آتية من وحدات مختلفة. الفئة أو الحزمة أو العملية أو الفريق قد يحمل هذا الحد، لكن الاسم وحده لا يصنعه.

خمس تغييرات رسمت نصف قطر الأثر

بقي تغيير صيغة الإدخال داخل Input في التصميمين، ولذلك لم يكن التصميم الأول خاسراً في كل حالة.

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

أما استبدال فهرس الإزاحات بسطور مخزنة فعلياً، أو حساب المحارف عند الطلب، فمسّ Circular Shift وAlphabetizer وOutput في الأول، وبقي داخل Circular Shifter في الثاني.

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

المعلومة لا تختفي؛ بل يصبح لها مالك محدد، ويتوقف الآخرون عن بناء منطقهم على تفاصيلها.

يمكن للواجهة أن تقول أكثر مما ينبغي

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

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

ليس أمناً ولا اسماً آخر للكائنات

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

وليست الفكرة مرادفاً للبرمجة الكائنية. يمكن لنوع بيانات مجرد أو فئة أن يحمي التمثيل، كما يمكنه كشف صيغة التخزين أو تصنيف غير مستقر. مفهوما cohesion وcoupling مفيدان في لغة لاحقة، لكنهما لا يغنيان عن تسمية القرار المخفي.

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

حتى المثال المرجعي احتاج إلى مراجعة

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

كما تطورت الفكرة بعمل جماعي. عالج بحث 1971 الروابط على أنها افتراضات تضعها الوحدات عن بعضها. وسّعت ورقة عائلات البرامج عام 1976 الأفق إلى إصدارات مرتبطة. وفي 1985 ميّز Parnas وPaul C. Clements وDavid M. Weiss معاً بين بنية الوحدات وبنية الاستخدام وبنية العمليات، واقترحوا دليلاً للوحدات يساعد القائمين على الصيانة.

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

المصادر