- بواسطة x32x01 ||
ليه مش لازم تعمل Abstraction من غير سبب؟ 

يا صاحبي قبل ما تقعد تقول "هعمل interface" أو "خلّيني أزوّد factory"، اسأل نفسك سؤال بسيط جدًا…
"هو أنا فعلاً محتاج الكلام ده دلوقتي؟"
الحتة دي من أكتر الأخطاء اللي بشوف مطورين كتير بيقعوا فيها، سواء في البرمجة أو الـ software architecture. بنقعد نعمل abstraction وطبقات وlayers من غير ما يكون فيه سبب قوي… وبصراحة؟ ده بيضيع وقت وبيكبّر الكود على الفاضي.
ومع بداية السلسلة دي هنتكلم عن أهم Red Flags في الكود. وأول Red Flag معانا هو:
الفكرة البايخة اللي بتقول:
"خلّيني أعمل abstraction علشان الكود يبقى scalable بعدين"
بس الحقيقة؟
اللي بيحصل غالبًا إن سطرين كانوا ممكن يعملوا الشغل… بيتحولوا لـ 200 سطر، والفايل الصغير يبقى مكتبة هندسية كاملة، وفهم الكود بقى محتاج دكتوراه
.
ليه الـ Abstraction الزايد مشكلة؟
خلّيني أكلمك بصراحة وباللهجة اللي بنفهم بيها كلنا… مش كل حاجة محتاجة إنك تعمّمها أو تعمل لها interface.
لما تعمل abstraction قبل أوانه بتقع في مشاكل كتير، منها:
1. زيادة عدد الملفات من غير لازمة
بدل ما كان عندك فايل واحد، تلاقي نفسك عامل:
2. الكود يبقى أصعب بكتير في الفهم
كل ما تعمل طبقات زيادة، كل ما هتزود الـ indirection اللي هو باختصار إن الوصول للمنطق الحقيقي للكود يتطلب إنك تلف على 3 أو 4 ملفات قبل ما تفهم بيعمل إيه.
3. وقت التعديل يزيد بشكل مرعب
لما يحصل تغيير حقيقي بعدين… هتلاقي نفسك لازم تعدّل في أماكن كتير.
وده غير إن abstraction غالبًا بيتبني على تخمين… مش احتياج حقيقي.
4. بتخلق مشاكل مش موجودة
تبدأ تحل مشاكل مستقبلية ممكن ما تحصلش أصلاً.
وده يعتبر تضيع وقت ومجهود ممكن تستخدمه في حاجات أهم.
إمتى أعمل Abstraction فعلاً؟
لو واحدة من الحالات دي حصِلت… يبقى ساعتها abstraction مطلوب وفعلاً صحي:
2. API خارجي بيتغيّر فعلاً
لو بتتعامل مع API ممكن يتغيّر بكرة…
اعمل abstraction علشان ما تبقاش مربوط بيه بشكل مباشر.
3. محتاج seam للاختبار (Testing seam)
زي مثلًا لما تعمل abstraction للوقت:
ده بيخليك تعمل Mock بسهولة في الاختبارات.
4. بتبني نظام Plugins أو extensible system
زي:
مثال برمجي يوضح خطأ الـ Abstraction الزيادة
ده كله… علشان تبعت رسالة واحدة بس؟
يا راجل!
الكود أبسط، أوضح، وأسرع… ومبيعملش abstraction من غير لازمة.
نصيحة مهمة لكل مبرمج
Write boring code.
اكتب كود بسيط. مفيهوش تعقيد زيادة.
ومش لازم تستخدم كل Design Pattern في الدنيا علشان تحس إنك عملت شغل جامد.
الهدف الأساسي من البرمجة إنك:
✔ تحل المشكلة
✔ بأقل تعقيد
✔ وبأوضح طريقة
والـ Abstraction مش هدف…
ده أداة، تستخدمها لما تحتاج بس.
إزاي تحافظ على الكود بسيط؟
خلاصة الكلام
لو أنت لسه بادئ في المشوار أو حتى Senior…
افتكر النصيحة دي:
مش كل abstraction صح…
ومش كل future-proofing مفيد…
ومش كل design pattern لازم تستخدمه.
اكتب كود بسيط، واضح، مفهوم…
ومع الوقت لما المشروع يكبر فعلًا، هتعمل abstraction صح وفي مكانه الصح
يا صاحبي قبل ما تقعد تقول "هعمل interface" أو "خلّيني أزوّد factory"، اسأل نفسك سؤال بسيط جدًا…
"هو أنا فعلاً محتاج الكلام ده دلوقتي؟"
الحتة دي من أكتر الأخطاء اللي بشوف مطورين كتير بيقعوا فيها، سواء في البرمجة أو الـ software architecture. بنقعد نعمل abstraction وطبقات وlayers من غير ما يكون فيه سبب قوي… وبصراحة؟ ده بيضيع وقت وبيكبّر الكود على الفاضي.
ومع بداية السلسلة دي هنتكلم عن أهم Red Flags في الكود. وأول Red Flag معانا هو:
Future-Proofing Fallacy - وهم الاستعداد للمستقبل
الفكرة البايخة اللي بتقول:"خلّيني أعمل abstraction علشان الكود يبقى scalable بعدين"
بس الحقيقة؟
اللي بيحصل غالبًا إن سطرين كانوا ممكن يعملوا الشغل… بيتحولوا لـ 200 سطر، والفايل الصغير يبقى مكتبة هندسية كاملة، وفهم الكود بقى محتاج دكتوراه
ليه الـ Abstraction الزايد مشكلة؟ 
خلّيني أكلمك بصراحة وباللهجة اللي بنفهم بيها كلنا… مش كل حاجة محتاجة إنك تعمّمها أو تعمل لها interface.لما تعمل abstraction قبل أوانه بتقع في مشاكل كتير، منها:
1. زيادة عدد الملفات من غير لازمة 
بدل ما كان عندك فايل واحد، تلاقي نفسك عامل:- interface
- class
- factory
- service layer
- wrapper
… وكل ده علشان وظيفة واحدة بس!
2. الكود يبقى أصعب بكتير في الفهم 
كل ما تعمل طبقات زيادة، كل ما هتزود الـ indirection اللي هو باختصار إن الوصول للمنطق الحقيقي للكود يتطلب إنك تلف على 3 أو 4 ملفات قبل ما تفهم بيعمل إيه.3. وقت التعديل يزيد بشكل مرعب 
لما يحصل تغيير حقيقي بعدين… هتلاقي نفسك لازم تعدّل في أماكن كتير.وده غير إن abstraction غالبًا بيتبني على تخمين… مش احتياج حقيقي.
4. بتخلق مشاكل مش موجودة 
تبدأ تحل مشاكل مستقبلية ممكن ما تحصلش أصلاً.وده يعتبر تضيع وقت ومجهود ممكن تستخدمه في حاجات أهم.
إمتى أعمل Abstraction فعلاً؟
لما يكون له معنى 
لو واحدة من الحالات دي حصِلت… يبقى ساعتها abstraction مطلوب وفعلاً صحي:1. عندك 2 implementations أو أكتر شغالين دلوقتي
يعني مثلًا:- عندك خدمة بتقرأ من File System
- وخدمة تانية بتقرأ من Database
ساعتها آه، يبقى تعمل abstraction.
2. API خارجي بيتغيّر فعلاً
لو بتتعامل مع API ممكن يتغيّر بكرة…اعمل abstraction علشان ما تبقاش مربوط بيه بشكل مباشر.
3. محتاج seam للاختبار (Testing seam)
زي مثلًا لما تعمل abstraction للوقت: C#:
class TimeProvider:
def now(self):
raise NotImplementedError()
class SystemTimeProvider(TimeProvider):
def now(self):
from datetime import datetime
return datetime.now() 4. بتبني نظام Plugins أو extensible system 
زي:- Handlers
- Events
- Filters
مثال برمجي يوضح خطأ الـ Abstraction الزيادة 
شكل abstraction الزيادة اللي بنشوفه للأسف:
C#:
class IMessageSender {
send(message) {}
}
class EmailMessageSender extends IMessageSender {
send(message) {
console.log("Sending Email:", message);
}
}
class MessageService {
constructor(sender) {
this.sender = sender;
}
sendMessage(message) {
this.sender.send(message);
}
}
const email = new MessageService(new EmailMessageSender());
email.sendMessage("Hello!"); يا راجل!
الشكل الأبسط اللي بيعمل نفس الهدف:
C#:
function sendEmail(message) {
console.log("Sending Email:", message);
}
sendEmail("Hello!"); نصيحة مهمة لكل مبرمج 
Write boring code.اكتب كود بسيط. مفيهوش تعقيد زيادة.
ومش لازم تستخدم كل Design Pattern في الدنيا علشان تحس إنك عملت شغل جامد.
الهدف الأساسي من البرمجة إنك:
✔ تحل المشكلة
✔ بأقل تعقيد
✔ وبأوضح طريقة
والـ Abstraction مش هدف…
ده أداة، تستخدمها لما تحتاج بس.
إزاي تحافظ على الكود بسيط؟ 
1. اسأل نفسك: هل فيه سبب حقيقي ولا مجرد "يمكن"؟
لو الإجابة "يمكن" → يبقى بلاش.2. سيب المستقبل للمستقبل
لما ييجي use-case جديد… ساعتها بس تعمل abstraction مضبوط.3. اعمل refactor بدل ما تعمل layers على الفاضي
4. لو الكود بسيط… سيبه بسيط
بلاش تزوّد complexity علشان "الشياكة".خلاصة الكلام 
لو أنت لسه بادئ في المشوار أو حتى Senior…افتكر النصيحة دي:
مش كل abstraction صح…
ومش كل future-proofing مفيد…
ومش كل design pattern لازم تستخدمه.
اكتب كود بسيط، واضح، مفهوم…
ومع الوقت لما المشروع يكبر فعلًا، هتعمل abstraction صح وفي مكانه الصح