تنفيذ نمط تصميمي كائني التوجه (Object-Oriented Design Pattern) في لغة رست (Rust)
المقدمة
تُعد لغة رست (Rust) واحدة من أبرز لغات البرمجة الحديثة التي تجمع بين الأداء العالي والأمان في إدارة الذاكرة، ما جعلها خيارًا مفضلًا لبناء الأنظمة المعقدة والتطبيقات التي تتطلب موثوقية فائقة. ومع ذلك، فإن رست ليست لغة كائنية التوجه بالمفهوم التقليدي، كما هو الحال في لغات مثل Java أو C++. إلا أن ذلك لا يمنع مطوري رست من الاستفادة من مفاهيم البرمجة الكائنية التوجه (Object-Oriented Programming – OOP) ونماذج التصميم (Design Patterns) بطريقة مناسبة لمزايا رست وبنيتها الفريدة.
تُعد أنماط التصميم الكائني التوجه مجموعة من الحلول البرمجية الشائعة لمشاكل متكررة في تصميم البرمجيات. ورغم أن هذه الأنماط نشأت في لغات برمجية كائنية، إلا أن مفاهيمها قابلة للتطبيق في سياقات لغوية متعددة، بما فيها رست، وذلك باستخدام ميزاتها القوية مثل التراكيب (Structs)، السمات (Traits)، الإنماط (Enums)، والتطابق (Pattern Matching).
الفروقات الجوهرية بين OOP التقليدية ونمط رست
قبل الخوض في تنفيذ الأنماط التصميمية في رست، لا بد من فهم الفروقات الجوهرية بين رست واللغات الكائنية التقليدية:
| المبدأ الكائني التقليدي | ما يقابله أو يختلف عنه في رست |
|---|---|
| الوراثة الكلاسيكية (Class Inheritance) | استخدام السمات (Traits) والتركيب (Composition) بدلاً من الوراثة |
| الكائنات (Objects) | استخدام التراكيب (Structs) مع سمات (Traits) لتوفير السلوك |
| التعدد الشكلي (Polymorphism) | عبر السمات والسمات الديناميكية (dyn Trait) |
| التحكم في الذاكرة عبر جامع نفايات | إدارة الذاكرة عبر الملكية (Ownership) ونظام الاقتراض (Borrowing) |
هذا يجعل تنفيذ الأنماط التصميمية يتطلب تفكيرًا أكثر وظيفيًا وهجينًا، بما يتوافق مع فلسفة رست التي تركز على الأمان والكفاءة.
نمط التصميم “الاستراتيجية” (Strategy Pattern) في رست
نمط “الاستراتيجية” يسمح بتعريف مجموعة من الخوارزميات القابلة للاستبدال في وقت التشغيل، مما يفصل منطق تنفيذ الخوارزمية عن استخدامها.
الهيكل التقليدي:
في OOP التقليدية، يتم عادة إنشاء واجهة Strategy تحتوي على دالة مشتركة، ثم يتم إنشاء عدة أصناف (Classes) تطبق هذه الواجهة. يتم تمرير الاستراتيجية المناسبة إلى الكائن في وقت التشغيل.
التنفيذ في رست:
في رست، يتم تمثيل الاستراتيجية عبر السمات (Traits)، ويمكن استخدام المؤشرات الذكية مثل Box من أجل تحقيق التعدد الشكلي الديناميكي.
rusttrait CompressionStrategy {
fn compress(&self, data: &str) -> String;
}
struct ZipCompression;
struct RarCompression;
impl CompressionStrategy for ZipCompression {
fn compress(&self, data: &str) -> String {
format!("Zip: {}", data)
}
}
impl CompressionStrategy for RarCompression {
fn compress(&self, data: &str) -> String {
format!("Rar: {}", data)
}
}
struct Compressor {
strategy

