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

أسباب الاستخدام
---------------

في فحص الوحدة (بالإنجليزية: UNIT TEST)‏ يمكن للأغراض المقلدة أن تحاكي سلوكا حقيقيا للأغراض الحقيقية (غير المقلدة) ولذلك يعتبر من المفيد استخدامها عوضا عن الغرض الحقيقي، خاصةً إذا كان الغرض الحقيقي مستحيل التحقيق، أو غير عملي، أو غير قادر على التجاوب عند الفحص.
إذا كان الغرض الحقيقي يملك إحدى الصفات السابقة فمن المفيد استخدام الغرض المقلد بدلًا منه.

أمثلة على الأغراض
-----------------

* إذا كان الغرض غير قابل للقياس (الزمن – درجة الحرارة)
* إذا كان غرض حالة صعبة من حيث الإنتاج والإنشاء مثل (خطأ في الشبكة)
* بطيء (COMPLETE DATA BASE قاعدة معطيات كاملة) حيث يجب إنشائها قبل اختبارها
* إذا كان الغرض غير موجود أو قد يغير سلوكه.

مؤثرات العالم الخارجي
---------------------

منبه الساعة (بالإنجليزية: ALARM CLOCK)‏ سيقوم بالتنبيه خلال زمن معين يتم الحصول عليه من العالم الخارجي، حيث ستنتظر نتيجة فحص الوقت الذي سيدق فيه جرس المنبه للحصول على النتيجة وفي حال استخدام غرض مقلد بدلا من الحقيقي يمكن للمبرمج أن يقدم الوقت إلى وقت التنبيه (الرنين) بغض النظر عن الوقت الحقيقي وذلك لاختبار المنبه بمعزل تام عن المؤثرات الخارجية.

تفاصيل تقنية (TECHNICAL DETAILS)
--------------------------------

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

المقلد والمزيف (MOCKS AND FAKES)
--------------------------------

بعض الكتاب يميزون بين الأغراض المزيفة والأغراض المقلدة. فالمزيفة هي الأبسط حيث تحقق الواجهة نفسها للأغراض التي تمثلها. بينما الأغراض المقلدة في هذه الحالة تفعل أكثر بقليل من الأغراض المزيفة حيث تحقيق (IMPLEMENT) توابعها الأعضاء موجودة ضمنها.
هذا يعني أن الأغراض المقلدة ومن خلال المفهوم السابق ستقوم بفحص السياق لكل طلب وربما التدقيق في كل ترتيب لطلب التوابع الأعضاء METHODS أو ربما تأدية فحص على المعطيات التي ستمرر في كل استدعاء للتوابع الأعضاء كمعاملات.

الإعدادات المطلوبة (SETTING EXPECTATION)
----------------------------------------

لنأخذ بالاعتبار المثال التالي :
نظام فرعي مقلد للسماحيات
الغرض المقلد يحقق التابع : {IS USER ALLOWED (TASK TASK) :BOOLEAN ;}
من صف السماحيات الحقيقي نحصل على العديد من الايجابيات في حال طبقنا التابع
IS ALLOWED():BOOLEAN ;
والذي هو غير موجود في الصف الحقيقي مما يمكن كود الاختبار من تسهيل توقع مجموعة الاستخدامات التي سيحصل المستخدم على صلاحية لاستخدامها في الاستدعاء القادم وبذلك جاهزية الاختبار وسلوك باقي النظام في باقي الحالات.
مما يمكن المطورين من اختبار سلوك الزبائن من اجل جميع حالات الأخطاء الواقعية مما يمكننا من وضع استجابات للأخطاء التي أصبحت متوقعة.
من غير هذا النظام المقلد السهل المرن ستصبح دراسة الحالات المعقدة بحاجة إلى جهد كبير واعتبارات كثيرة.

استخدام الاختبارات المشتقة في عملية التطوير(USE IN TEST –DRIVEN DEVELOPMENT) :
المبرمجين الذين يعملون في توابع TDD (TEST- DRIVEN DEVELOPMENT) يستخدمون الأغراض المقلدة في كتابة البرامج.
الأغراض المقلدة تحقق متطلبات الواجهات لأغراض حقيقية معقدة وبذلك يمكن للمبرمجين كتابة واختبار مقدار فاعلية التابع في مجال واحد بدون استدعاء معقد لصفوف مشتركة أو ضمنية.
مما يعني إمكانية المطورين من التركيز على اختبارات في اختبار سلوك النظام المختبر (تحت الاختبار) بدون القلق على ارتباطه بالآخرين.
على سبيل المثال :
اختبار خوارزمية معقدة تعتمد على أغراض متعددة بحالة ثابتة يمكن تمثيلها باستخدام أغراض مقلدة بدلا من أغراض حقيقية
بغض النظر عن قضايا التعقيد والفوائد المكتسبة من خصائص الفصل هناك فرق في سرعة العملية حيث تطوير جزء حقيقي من برنامج باستخدام TDD يمكن أن يستخدم عدة مئات من الـ UNIT TEST إذا كان العديد من هذه الاتصالات السابقة يتطلب اتصال مع قاعدة المعطيات أوال WEB SERVICE أو عمليات على الشبكة مما يجعل وحدة الاختبار تتباطأ بسرعة.
عند الانتهاء من عملية الاختبار واستبدال الأغراض المقلدة بأغراض حقيقية وننتهي من اختبار الوحدة ونبدأ بعملية اختبار أخرى للأغراض الحقيقية وهذا ما يدعى باختبار التكامل.

JSMOCK
------

هي مكتبة لها كل ميزات الأغراض المقلدة تعمل من اجل JAVA SCRIPT أي تقديم الأدوات الضرورية من اجل اختبارات تفاعلية فعالة.
يزودنا JSMOCK بمسجل توقعات ومطابق (MATCHING) هو ذو واجهات بسيطة سهلة التعامل مما يجعل عملية الاختبار سهلة.

تعريف وحدة الاختبار (UNIT TEST)
-------------------------------

في البرمجة وحدة الاختبار هي طريقة تأكيد صحة عمل وحدة فردية (INDIVIDUAL UNIT) من الكود ولاختبارها.
الوحدة هي اصغر جزء من التطبيق قابل للاختبار في البرمجة الإجرائية الوحدة يمكن أن تكون برنامج قائم بذاته أو تابع أو إجرائية أو..........
في حين في البرمجة غرضية التوجه اصغر وحدة ممكنة هي ال METHOD التي يمكن أن تنتمي إلى صف BASE أو SUPER وبمعنى آخر صف مشتق DERIVED أو مجرد ABSTRACT.
بشكل مثالي كل حالة اختبار لا تعتمد أبدا على الأخرى.

TEST -DRIVEN DEVELOPMENT(TDD):
أثبتت سابقا أنها أفضل طريقة من اجل تطوير البرمجيات من خلال ال (TDD) نصل إلى حالة حيث أن أحد ال METHOD يحتاج إلى التواصل مع صفوف أخرى يعرف توابعها. ومن اجل فحص هذا ال METHOD يجب علينا إنشاء METHOD يقوم بالتعامل معه أولا.
على أي حال هذا سيحرف مفهوم ال UNIT TESTING لكننا نملك أدوات مفيدة من اجل السيطرة على هذا النوع من الحالات مثل JMOCK وEASY MOCK والتي تقلد الأغراض وال METHODS التي تتفاعل معها.
وبذلك نكون قد استغنينا عن استخدام غرض حقيقي لإنهاء الاختبار على هذا ال METHOD.

المصادر
-------

* www.jmock.com
* www.theserverside.com

* أيقونة بوابةبوابة برمجة الحاسوب
* أيقونة بوابةبوابة علم الحاسوب

| * ع
* ن
* ت
 أنماط تصميم البرمجيات (برمجة) |
| --- |
| إنشائي (Creational) | 
* Abstract factory  ‏
* نمط تصميم الباني
* حقن التبعية
* نمط طريقة المصنع
* Lazy initialization
* Multiton
* Object pool  ‏
* Prototype
* اكتساب الموارد تهيئة
* النمط المفرد

 |
| هيكلي (Structural) | 
* نمط المحول
* نموذج التصميم جسر
* نموذج التصميم المجمع
* نموذج التصميم ديكور
* نمط\_التفويض
* نمط واجهة المبنى
* نموذج التصميم وزن الذبابة
* Front controller
* Marker interface  ‏
* Module
* نمط الوكيل
* Twin

 |
| سلوكي (Behavioral) | 
* Blackboard
* Chain of responsibility
* Command
* Interpreter
* نمط المكرر
* Mediator
* Memento
* Null object  ‏
* المراقب (نموذج تصميم)
* Servant
* Specification
* State
* نموذج الإستراتيجية
* Template method  ‏
* Visitor

 |
| وظيفي (Functional) | 
* مونويد
* Functor
* Applicative
* Monad
* Comonad
* Free monad
* HOF
* Currying
* Function composition  ‏
* Closure
* المولد

 |
| متزامن (Concurrency) | 
* Active object
* Actor
* Balking
* حاجز (حوسبة)
* Binding properties  ‏
* Coroutine
* Compute kernel
* Double-checked locking
* Event-based asynchronous  ‏
* ليف
* Futex
* Futures and promises
* Guarded suspension
* Immutable object
* Join
* Lock
* صيغة التراسل
* Monitor
* Nuclear
* Proactor
* Reactor
* Read write lock  ‏
* Scheduler
* STM
* Thread pool
* Thread-local storage

 |
| معماري (Architectural) | 
* \* ADR
* نمط التسجيل النشط
* نمط الوسيط
* نموذج الخادم والعميل
* هندسة البرمجيات بالمكونات
* DAO
* كائن نقل البيانات
* تصميم موجه بالمجال
* ECB
* ECS
* EDA
* Front controller
* Identity map  ‏
* Interceptor
* Implicit invocation
* عكس التحكم
* Model 2  ‏
* MOM
* Microservices
* MVA
* نمط وعرض ومتحكم
* MVP
* MVVM
* Monolithic
* عمارة متعددة الطبقات
* Naked objects
* ORB
* ند لند
* Publish–subscribe
* PAC
* رست
* بنية خدمية
* نمط محدد موقع الخدمة
* SN
* SBA
* Specification

 |
| توزيع سحابي (Cloud Distributed) | 
* Ambassador
* Anti-Corruption Layer
* Bulkhead
* Cache-Aside
* Circuit Breaker  ‏
* CQRS
* Compensating Transaction  ‏
* Competing Consumers
* Compute Resource Consolidation
* Event Sourcing
* External Configuration Store
* Federated Identity
* Gatekeeper
* فهرس قاعدة بيانات
* Leader Election  ‏
* نموذج الهيكلة والتجميع
* Materialized View  ‏
* Pipes
* Filters
* Priority Queue
* Publisher-Subscriber
* Queue-Based Load Leveling
* Retry
* Scheduler Agent Supervisor
* Sharding
* Sidecar
* Strangler
* Throttling
* Valet Key

 |
| أخرى | 
* Business delegate  ‏
* Composite entity  ‏
* Intercepting filter  ‏
* التحميل البطئ
* Mangler
* غرض مقلد
* Type tunnel  ‏
* Method chaining

 |
| كتب | 
* *خطط التصميم*
* *Enterprise Integration Patterns*
* *Code Complete*
* *POSA*

 |
| أشخاص | 
* كريستوفر الكسندر
* إريك جاما
* رالف جونسن
* John Vlissides
* غرادي بوتش
* كينت بيك
* وورد كانينغهام
* مارتن فاولر
* روبرت سيسيل مارتن
* Jim Coplien
* دوغلاس س. شميت
* Linda Rising

 |
| مجتمعات (Communities) | 
* The Hillside Group
* The Portland Pattern Repository  ‏

 |