Yhya Nesb
626 subscribers
141 photos
1 video
1 file
112 links
شاب سوري طموح محب لعالم التقنية مهندس برمجيات
منشوراتي تعكس وجهة نظري الشخصية فقط.
Download Telegram
إختصارات الكيبورد وأهمية التعامل بإختصارات الكيبورد ⌨️
من اسمها هي إختصار تنفيذها يؤدي لتنفيذ مهمة ⭐️ معينة، تختلف المهمة بإختلاف الإختصار ⁉️ ولعل من أشهر هذه الإختصارات هو
إختصار CTRL + C مع CTRL + V في مجال البرمجة 😅 (اشتهر من خلال مفهوم نسخت كود شغال وما اشتغل معي)

لماذا أنا كمبرمج يجب أن أستخدم الإختصارات 🧑‍💻
لأن توفير الوقت والجهد من أهم الأمور التي تميز المبرمجين (في حال كنت تنفي هذه الفرضية فأنت تنفي أهمية التكرار Loop 😉)
وتوفير الوقت ليس من أجل أن تعمل قليلاً وتستريح كثيراً 🙂 بل لأن اليوم السرعة من العمل تعد جزءً أساسياً في أي عمل، لم أقابل سوا القليل من العملاء الذين لا يبالون بالتأخير بالوقت 😅 (مع تفضيلي لهذا النوع) فأكثرهم يود أن ينتهي العمل الخاص به قبل الوقت المحدد ! وهذا له عواقب سواءً في مرحلة الإطلاق الأولى أو في مرحلة التطوير القادمة 🔜

هل يجب أن أتعلم كامل إختصارات النظام الذي أستخدمه 🤔
صديقي أنت عليك تعلم الإختصارات التي تزيد من إنتاجيتك وتوفر وقت 🕐 ما الفائدة من تعلم إختصارات خاصة بالطباعة وأنت لا تملك طابعة بالواقع 🖨
عليك تعلم إختصارات النظام 👩‍💻👩‍💻 المهمة بالنسبة لك، إختصارات المحرر 👩‍💻👩‍💻 المستخدم، وأنصح أيضاً بتعلم سطر الأوامر 👩‍💻

لماذا أضيع الوقت في هذه التفاهات وأنا أستطيع إستخدام الماوس 😒
أنا لا يمكنني الإستغناء عن الماوس أثناء إستخدام حاسوبي الشخصي في حال كنت أتصفح الإنترنت 🌐 أو أقضي بعض الوقت في لعب الألعاب الإلكترونية 🙄
لكن أثناء عملي في كتابة أي كود برمجي صغير الماوس لا تتحرك ‼️ لأن العمليات التي سأقوم بها بالماوس يمكنني القيام بها من خلال إختصارات الكيبورد بحيث يكون هذا توفير للوقت (توفر دقيقة؟ في حال كنت أجري 7 عمليات سأوفر بهذه الطريقة 7د مع العلم هناك إختصارات توفر الكثير من الوقت يمكنك رأيت التعليقات)

حسناً ماهي أشهر هذه الإختصارات 🎮
النسخ: Ctrl + C
القص: Ctrl + X
لصق: Ctrl + V
التراجع: Ctrl + Z
إعادة: Ctrl + Y
حفظ: Ctrl + S
فتح: Ctrl + O
البحث: Ctrl + F
استبدال: Ctrl + H أو Ctrl + R
التبديل بين علامات التبويب: Ctrl + Tab
تعليق/إلغاء تعليق السطر: Ctrl + /
التبديل بين النوافذ: Alt + Tab
سطر الأوامر: Ctrl + Shift + ` أو Ctrl + Alt + T
فتح ملف موجود في المحرر من خلال اسمه أو أحرف من اسمه Ctrl + E

للمزيد من المنشورات ♻️: تصفح قائمة المنشورات
#programming #shortcuts
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21🥰1
في حال كنت تستخدم هاتف من هواتف شاومي xiaomi ❤️ وحصلت على تحديث للنظام أو التطبيقات فقم بالتحديث بالفور ⁉️
فهذه الهواتف تعاني من عيوب متعددة في تطبيقات ومكونات النظام ⚠️ (تم اكتشاف هذه العيوب والابلاغ عنها قبل 10 أيام تقريباً)
يمكنك تقليل الآثار أو الحد منها من خلال:
- حذف وعدم إستخدام أي برنامج لم يتم تثبيته من مصدر موثوق (غير متجر google 🛒 مثلا)
- عدم الإتصال بالشبكات العامة المفتوحة (حتى لو حلت المشكلة لا تعتبر هذه الشبكات آمنة)
- عدم تحميل أي ملف من جهة غير موثوقة (وخاصة من الايميل أو التلجرام أو الوتس اب من أرقام مجهولة)
لقراءة المزيد عن هذه العيوب:
20 Security Issues Found in Xiaomi Devices

للمزيد من المنشورات ♻️: تصفح قائمة المنشورات
#bug #xiaomi #MIUI
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍1
Yhya Nesb
منشور من سلسة #CleanCode لمعرفة التفاصيل انقر هنا 🔗
الجزء الثامن في هذه القناة 8️⃣
منشور من سلسة #CleanCode لمعرفة التفاصيل انقر هنا 🔗
الجزء التاسع في هذه القناة 9️⃣
تجنب التحقق من الأنواع الجزء الأول:
بمعنى أصح لماذا تريد التحقق من الأنواع type بنفسك في حال كانت php تدعم هذا الخيار 😁، الفرق هنا بأن وضع النوع المحدد في المعامل (Parameter) سيفيد المطور أكثر بحيث لن يجبر لقراءة الكود البرمجي أو حتى إجراء عملية تجربة للتحقق من النوع بأنه مقبول 😊
الاستخدام السيء:
function travelToTexas($vehicle): void
{
if ($vehicle instanceof Bicycle) {
$vehicle->pedalTo(new Location('texas'));
} elseif ($vehicle instanceof Car) {
$vehicle->driveTo(new Location('texas'));
} else {
throw new Exception("Error Type");
}
}

الاستخدام الجيد:
function travelToTexas(Vehicle $vehicle): void
{
$vehicle->travelTo(new Location('texas'));
}

تجنب التحقق من الأنواع الجزء الثاني:
في حال كنت تستخدم أنواع البيانات الأساسية مثل int - string فقم بإضافتها للمعامل (Parameter) فهي تفيد أيضاً لعملية الإختبار الأولية أيضاً 🧑‍💻
الاستخدام السيء:
function combine($val1, $val2): int
{
if (! is_numeric($val1) || ! is_numeric($val2)) {
throw new Exception('Must be of type Number');
}

return $val1 + $val2;
}

الاستخدام الجيد:
function combine(int $val1, int $val2): int
{
return $val1 + $val2;
}

احذف الكود البرمجي القديم:
حذف الكود البرمجي القديم والغير مستخدم ضروري 🙂 للأسف قابلت البعض ممن يظنون أن وضع التعليقات هي الطريقة السليمة لهذا 🤦‍♂️ لكن العكس فأنت بكل يوم تتعلم شيء جديد وكتابتك للكود ستختلف حتماً من يوم لأخر فعند إعادة كتابتك لكود جديد فسيكون مختلف وأفضل من القديم 🔥
بالإضافة لماذا تريد أن نضيع بأسماء هذه البرمجيات 🙂 v1 و v2 و new و old 🤦‍♂️ كلما كانت برمجياتك نظيفة كلما زاد تقديرك لمن طور بعدك 🫡
الاستخدام السيء:
function oldRequestModule(string $url): void
{
// ...
}

function newRequestModule(string $url): void
{
// ...
}

$request = newRequestModule($requestUrl);
inventoryTracker('apples', $request, 'www.inventory-awesome.io');

الاستخدام الجيد:
function requestModule(string $url): void
{
// ...
}

$request = requestModule($requestUrl);
inventoryTracker('apples', $request, 'www.inventory-awesome.io');

هذا كل شيء لليوم 😁 في حال أعجبك هكذا نوع من المنشورات لا تنسا مشاركته مع أصدقائك ☺️
للمزيد من هذه الشروحات يمكنك متابعتي ⬅️ @YhyaNesb 🔥
#php
Please open Telegram to view this post
VIEW IN TELEGRAM
👏2👍1
Yhya Nesb
منشور من سلسة #CleanCode لمعرفة التفاصيل انقر هنا 🔗
الجزء التاسع في هذه القناة 9️⃣
منشور من سلسة #CleanCode لمعرفة التفاصيل انقر هنا 🔗
الجزء العاشر في هذه القناة 0️⃣1️⃣
الكائنات Objects وهياكل البيانات Data Structures
قم بتغليف الكائن encapsulation:
في لغة php 👩‍💻 يمكن تعيين كلمات رئيسية للخصائص بالأسماء التالي (private, protected, public) التي تستخدم في تعديل خصائص (properties) الصنف
التغليف:
هو جعل الخصائص خاصة private على مستوى الصنف object ويتم التعديل ✏️ على هذه الخصائص من خلال توابع تسمى ب set + get أو setter and getter، وهذه العملية تعد طبقة حماية 🔐
من مميزاتها:
- عندما تريد القيام بإجراء أو تنفيذ أمر معين عندما تقوم بجلب خاصة معينة عند عمل get، فلن تحتاج لإستخدام التوابع السحرية أو حتى البحث عن مكان الإستدعاء 😅 لتنفيذ هذا الأمر.
- يجعل إضافة تحقق أو شرط لعملية الإسناد ⬇️ أمر بسيط عند عمل set.
- إخفاء التفاصيل 📝 الداخلية، فلست مهتم بآلية عمل شروط الإسناد مثلاً.
- من السهل العثور على الدخول (loging) ومعالجة الأخطاء (errors) 🤖 عند الحصول او تغير قيم الخصائص.
- عند وراثة هذا الصنف class، يمكنك تعديل الوظائف أو التوابع (function) الافتراضية.
- يمكنك التحميل البطيء (lazy load) لخصائص الكائن ، دعنا نقول الحصول عليه من خادم.
بالإضافة لذلك يعد هذا جزء من مبدأ فتح/إغلاق
الاستخدام السيء:
class BankAccount
{
public $balance = 1000;
}
$bankAccount = new BankAccount();
// عند شراء شيء، في هذا المثال يصبح رصيدي سالب 9 الف بسبب نسياني لشرط التحقق من رصيد المحفظة قبل الخصم !
$bankAccount->balance -= 10000;

الاستخدام الجيد:
class BankAccount
{
private $balance;

public function __construct(int $balance = 1000)
{
$this->balance = $balance;
}

public function withdraw(int $amount): void
{
if ($amount > $this->balance) {
throw new \Exception('Amount greater than available balance.');
}

$this->balance -= $amount;
}

public function deposit(int $amount): void
{
$this->balance += $amount;
}

   public function getBalance(): int
{
return $this->balance;
}
}

$bankAccount = new BankAccount();

// Buy shoes...
$bankAccount->withdraw($shoesPrice);

// Get balance
$balance = $bankAccount->getBalance();

هذا كل شيء لليوم 😁 في حال أعجبك هكذا نوع من المنشورات لا تنسا مشاركته مع أصدقائك ☺️
للمزيد من هذه الشروحات يمكنك متابعتي ⬅️ @YhyaNesb 🔥
#php
Please open Telegram to view this post
VIEW IN TELEGRAM
أهم المواقع لأي مبرمج 🧑‍💻
كونك مبرمج يعني لازم ولا بد انك تستخدم المواقع التالية 🌐 أو على الأقل البعض منها، في حال ماكنت عم تستخدم ولا موقع منهم فبنصحك تدخل على الشي يلي بيلفت انتباهك 🔍 لحتى تعرف كيف تمشي وشو لازم تتعلم 💬
مواقع حل المشكلات Problem solving:
أهمية حل المكشلات تكمن في زيادة الوعي ومنطق التفكير لحل مشكلات حقيقة
LeetCode - HackerRank - Codewars -
مواقع استلهام:
مواقع مفيدة لمصممين ال UI/UX ومبرمجين ال Front-End:
dribbble - pinterest - mobbin - uxcrush
مواقع تعلم البرمجة:
من المواقع التي تحوي على شروحات كتابية لمجال البرمجية، تفيدك للمراجعة أو في حال كنت تريد التعلم من خلال قراءة المقالات:
geeksforgeeks - harmash - w3schools
مواقع كورسات:
مواقع لمشاهدة كورسات مجانية أو مدفوعة أو مساقات
udemy - coursera - learning paths
مواقع صور SVG:
undraw - svghub - manypixels
مواقع للبحث عن فرصة عمل:
المواقع التالية بعضها فريلانسر وبعضها التوظف بشركة، مع تأكيدي على ضرورة العلاقات للعثور على عمل:
mostaql - nafezly - fiverr - indeed - amazon jobs
مواقع مهمة لأي مبرمج:
موقع linkedin يعد أشهر منصة تواصل إحترافية، مخصصة للأعمال أي تعتبر عن منصة لعرض ال CV الخاص بك ومناقشة مواضيع مهنية مثل مجالات البرمجة
موقع notion لوضع خطة لأهدافك وتنظيم عملك من خلال قائمة مهام
موقع dev.to موقع تواصل اجتماعي خاص بالبرمجين فقط لنشر مقالات حول البرمجة، أنصحك بالإشتراك بالقائمة البريدية الخاصة به
موقع frontendfoc للإشتراك بقائمة بريدية خاصة بكل تطورات مجال ال front end
موقع 10015.io موقع يحوي على أدوات مهمة منها تحويل نص الكود إلى صورة
موقع regex101.com للتحقق من التعابير النمطية وتجربتها بشكل مباشر
موقع roadmap.sh لعرض خارطة الطريق لتعلم أي لغة أو مجال أو تقنية (يحوي على الكثير من الخرائط)
في حال اعجبت بمحتوى القناة لا تنسى مشاركتها ❤️

للمزيد من المنشورات ♻️: تصفح قائمة المنشورات
#php #python #cpp #programming #algorithms #data_structure #dataStructure #sites #problems_solving #problemsSolving
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2❤‍🔥1
Yhya Nesb
منشور من سلسة #CleanCode لمعرفة التفاصيل انقر هنا 🔗
الجزء العاشر في هذه القناة 0️⃣1️⃣
منشور من سلسة #CleanCode لمعرفة التفاصيل انقر هنا 🔗
الجزء الحادي عشر في هذه القناة 1️⃣1️⃣
جعل الكائنات تحوي على خصائص من النوع private/protected:
النوع أو الطريقة public للخصائص أو المتغيرات أكثر خطورة ☠️ ، لانه التعليمات البرمجة الخارجية قد تكون تعتمد عليه 😬 ولا يمكن التحكم بهذه التعليمات، والتعديل على الخاصية بدون قيود 🔐 سيؤدي لمشكلة للصنف object بأكلمه 🛡

النوع أو الطريقة protected التعديل على الخصائص من هذا النوع أقل خطورة 😊 فهي محصورة بالأصناف classes الأطفال child (اي الأصناف التي ترث من الصنف الأساسي) وهذا ال فرق الجوهري 💎 بين النوع public والنوع protected فقط من ناحية الوصول، لكن ضمان التغليق يبقى كما هو فيمكن التعديل على الخاصية على صنف يرث من الصنف الذي يحوي الخاصة 🖥 (أقل خطورة بحيث لن يقوم بتعديلها إلا شخص يفقه الشيء الذي يقوم به 🧑‍💻 لكن يظل خطورة تجاوز التحقق من المدخلات موجود)

النوع أو الطريقة private تتم تعديل الخصائص من خلال تابع (setProperty) في حال يريد المبرمج 🧑‍💻 السماح بالتعديل من خارج الصنف class، فالطريقة private تسمح بالوصول ✏️👀 للخاصية من داخل الصنف class فقط (أي لا يمكنك الوصول للقيمة أو تعديل الخاصية من خلال class child أو من خلال object للصنف المستخدم) وأنت في هذه الحالة ستكون بآمان من تأثير Jengaphobia
تأثير Jengaphobia 🧐؟
هو الخوف من تعديل الكود البرمجي حتى لا ينهار النظام بأكمله ☠️ وسميت بلعبة Jengaphobia حيث يقوم اللاعبين بإزالة قطعة خشبية من قطع خشبية مكدسة (مثل مبنى تم بنائه من قطع خشبية تقوم بإزالة القطع الخشبية من الأسفل)

لمزيد من المعلومات يمكنك قراءة هذه التدوينة

الاستخدام السيء:
class Employee
{
public $name;

public function __construct(string $name)
{
$this->name = $name;
}
}

$employee = new Employee('John Doe');
// Employee name: John Doe
echo 'Employee name: ' . $employee->name;

الاستخدام الجيد:
class Employee
{
private $name;

public function __construct(string $name)
{
$this->name = $name;
}

public function getName(): string
{
return $this->name;
}
}

$employee = new Employee('John Doe');
// Employee name: John Doe
echo 'Employee name: ' . $employee->getName();

هذا كل شيء لليوم 😁 في حال أعجبك هكذا نوع من المنشورات لا تنسا مشاركته مع أصدقائك ☺️
للمزيد من هذه الشروحات يمكنك متابعتي ⬅️ @YhyaNesb 🔥
#php
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
تقدم منصة IT legend مبادرة مجانية 🆓
محتوى المبادرة: باقة تحوي على 3 كورسات التي تعتبر هي كورسات أساسية أو مدخل لتعلم البرمجة 🧑‍💻 بشكل صحيح، حيث تضمن:
- مدخل لعلوم الحاسوب 💻
- مدخل للخوارزميات مستوى 1
- مدخل إلى c# 👩‍💻 وحل بعض المشكلات
هل منصة IT legend منصة موثوقة للتعلم؟
نعم، فهي ليست مجردة منصة ‼️ بل هي أيضاً شركة برمجية تقدم بعض الخدمات لشركات أخرى والمدرب في هذه المنصة هو المهندس علي شاهين ذو خبرة بأكثرر من 10 أعوم 💯
ويمكنك أن ترى تقيمات بعض الطلاب على المنصة
للتسجيل في المبادرة من هنا علماً أن هذه المبادرة ستنتهي بعد 3 أيام و14 ساعة من الآن 🕐، لا تنسا مشاركة المنشور ليستفيد أكبر عدد ممكن 😉
للمزيد من المنشورات ⬅️ @YhyaNesb 🔥
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Yhya Nesb
منشور من سلسة #CleanCode لمعرفة التفاصيل انقر هنا 🔗
الجزء الحادي عشر في هذه القناة 1️⃣1️⃣
منشور من سلسة #CleanCode لمعرفة التفاصيل انقر هنا 🔗
الجزء الثاني عشر في هذه القناة 2️⃣1️⃣
هذا المنشور هو أكثر منشور أخذ الجهد في كتابته لمحاولة تبسيط وايصال المعلومة الصحيحة، الرجاء مشاركته في المجتمعات البرمجية؛ وفي حال اعتقدت ان هناك تفصيل غير صحيح أو دقيق الرجاء إخباري وشكراً

الأصناف Classes
فصل التكوين او الإنشاء عن الوراثة (Prefer composition over inheritance):
كما هو مذكور في أنماط تصميم البرمجيات أو Design Patterns يجب أن تفصل التكوين عن الوراثة، أي لا يجب أن ترث صنف وتقوم بإستدعاء تابعه الباني construct في التابع الباني construct للصنف الجديد ‼️
حسناً دخلت الأمور ببعضها 😵‍💫 وهذا شيء طبيعي، ببساطة في حال تريد إنشاء صنف class ويحوي على تابع باني construct وسوف ترث صنف ثاني يحوي أيضاً على تابع باني construct فلا تقم بهذا ⚠️ لعدة أسباب منها:
1️⃣- ستخلق مشكلة باسم dependency injection أي في حال عدلت على التابع الباني للصنف الموروث فستجبر على تعديل كافة التوابع البانية للأصناف التي ترثه ❗️ مع العلم قد لا تستخدم هذه التعديلات إلا في صنف واحد من الكثير منه (عند اتباعك للطريقة السليمة سيكون لديك عدة حلول منها: التعديل على الصنف حين الإستخدام فقط، أو الإستفادة من مفهوم التغليف أو الكبسلة) وإليك فيديو يشرح المشكلة وحلها
2️⃣- سيصح الكود غير نظيف ‼️ وستجبر من يعمل 🧑‍💻 على تعديل التابع الباني للصنف الوارث على فهم التابع الباني للصنف الموروث لضمن عدم حدوث تضارب ❗️
حسناً هل هذا يعني ألا استخدم الوراثة بعد اليوم 🔍
بالطبع لا فتستخدم الوراثة عندما:
1️⃣- يوجد علاقة بين الأصناف الوراثة والموروثة تدعى بـ: "يكون" أو "is-a" وليست علاقة "يملك" أو "has-a" مثل:
صنف البشر تتم وراثته للمستخدمين 👥 وتم وراثت الأخر لمعلومات المستخدمين، لكن ليس منطق أن تكون السيارات تنتمي للبشر، علماً أنه يمكن أن تكون سيارة أو البعض منها تُملك لبشري أو أكثر
2️⃣- يمكن إعادة إستخدام التعليمات البرمجية من الفئة نفسها: فالبشر جميعهم يقومون بالتفكير والمشي، ولا بد أيضاً للمستخدمين أن يقومون بالعمليات أيضاً (فالمستخدم هو كل بشري يستخدم خدمة أو شيء معين)
3️⃣- عندما تريد إجراء تغير على الصنف الأب، فهناك بشر من الجنس الذكري، وبشر من الجنس الأنثوي (الفطرة السليمة التي خلقنا الله عليها)؛ فلا يمكن للذكر أن يحمل اسم أنثى (على سبيل المثال) والعكس ⚠️
الاستخدام السيء:
class Employee
{
private string $name;

private string $email;

public function __construct(string $name, string $email)
{
$this->name = $name;
$this->email = $email;
}

// ...
}

// Bad because Employees "have" tax data.
// EmployeeTaxData is not a type of Employee

class EmployeeTaxData extends Employee
{
private string $ssn;

private string $salary;

public function __construct(string $name, string $email, string $ssn, string $salary)
{
parent::__construct($name, $email);

$this->ssn = $ssn;
$this->salary = $salary;
}
}

الاستخدام الجيد:
class EmployeeTaxData
{
private string $ssn;

private string $salary;

public function __construct(string $ssn, string $salary)
{
$this->ssn = $ssn;
$this->salary = $salary;
}

// ...
}

class Employee
{
private string $name;

private string $email;

private EmployeeTaxData $taxData;

public function __construct(string $name, string $email)
{
$this->name = $name;
$this->email = $email;
}

public function setTaxData(EmployeeTaxData $taxData): void
{
$this->taxData = $taxData;
}

// ...
}

هذا كل شيء لليوم 😁 في حال أعجبك هكذا نوع من المنشورات لا تنسا مشاركته مع أصدقائك ☺️
للمزيد من هذه الشروحات يمكنك متابعتي ⬅️ @YhyaNesb 🔥
#php
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
ما المقصود بـ SEO !؟
هو تحسين محركات البحث وهو إختصار لـ: Search engine optimization والمقصد الأعم هو تحسين ترتيب الموقع أو التدوينة الخاصة بك في النتائج الأولى لمحرك البحث بشكل مجاني 🔥
ملاحظة: هذه نصائح لتحسين الظهور؛ ليست سحر وبنفس الوقت ليست شاملة أنا أفقط أعطيك نصائح تساعدك لزيادة الظهور فلا يمكنني برسالة واحدة أن أجعلك تفقه كل شيء في هذا المجال؛ أنا أذكر تجربتي بحصولي على 70 ألف ظهور على بحث جوجل بأقل من 20 تدوينة و ألفين نقرة
لماذا أريد ترتيب موقعي بنتائج البحث 🤔؟
تزيد من مصداقية نشاطك التجاري 🏆 ويعد مصدر تسويقي طويل الأمد 📈 فعند قيامك بحملات إعلانية مدفوعة ستكون مؤقتة وتحتاج لدفع المزيد للقيام بهذه العملية 💵 على عكس ترتيب موقعك فهو يضمن لك المزيد من العملاء وعلى المدى الطويل 🔜 فقد تتفاجئ بأن متجرك الإلكتروني بعد 3 أشهر من إنقطاع الاعلانات مازال يحصل على عملاء جدد 👥 لكونك تتبع إسترتجيات تحسين محركات البحث 👑
ماهي أنواع تحسين محركات البحث 🔍؟
* التحسين داخل الصفحة (On-Page SEO):
ويقصد بها كل التحسينات الداخلية، ومن هذه التحسينات:
1️⃣- ضع عنوان 🖥 ملفت للنظر، العنوان يجب أن يكون جاذب للأنظر 👀 بالإضافة لكونه عنوان قابل للبحث 🔍، مثلاً:
أرخص 10 هواتف ذكية لعام 2024
أهم المواقع لأي مبرمج
كيف أحصل على أول وظيفة لي.
- أنصحك وبشدة أن يكون العنوان الخاص بك يحوي على كلمة: "أفضل، أحسن، أرخص"
- أيضاً إضافة أرقام 10 أو 5 في حال التعداد (الرقم 10 أكثر رقم من بين الأرقام يتم البحث عنه)
- أيضاً إذا كانت التدوينة عبارة عن جواب فضع العنوان هو السوأل، أتذكر أنًي قرأت دراسة أن 50% من عمليات البحث في Google 🌐 كانت عبارة عن أسئلة
- في حال لديك تدوينة قديمة وتريد تحديثها فقط ضع بنهاية العنوان العام التي تم التحديث له 2025 مثلاً
2️⃣- حاول تكرار الكلمة المفتاحية ومرادفاتها بشكل غير جنوني 🗣️ لتستطيع محركات البحث فهم محتوى التدوينة
3️⃣- لا تنسى إضافة بعض الصور 👥 فهي تجذب انتباه القارئ 👀
4️⃣- حسن سرعة إستجابة الموقع الخاص بك نحن اليوم في عصر السرعة وبطء موقعك بمعدل ثانيتين قد يسبب خسراتك لأكثر من نصف عملائك المحتملين ‼️
5️⃣- بناء محتوى قيم © يستحق مشاركته والأهم صحته
* التحسين خارج الصفحة (Off-Page SEO):
ويقصد بها كل التحسينات التي تحدث خارج موقعك، ومن هذه التحسينات:
1️⃣- الروابط الخلفية (Backlink) 🔗 هي الروابط التي توضع في مواقع غير موقعك، وتزيد من قوة موقعك وتنقصها بحسب الموقع (لا تقوم بشراء ألف رابط خلفي ب 5$) ومن طرق تنقيص ترتيب الموقع: الرابط الخلفي موجود على كلمة "انقر هنا" أو في موقع ذو سمعة سيئة 🚫 وأتمنى الانتباه لأمر مهم: وضع الرابط في تذيل الموقع أو مقدمته لا يعد رابط خلفي 🙂
2️⃣- بناء علامة تجارية عبر وسائل التواصل الاجتماعي، وسائل التواصل الاجتماعي 📲 لن تفيدك ببناء روابط خلفية، لكن ستقدم الوعي 💭 للأشخاص بعلامتك التجارية وترسخ بذهنهم
3️⃣- نشر الروابط في المجتمعات المتعلقة بالموضوع، مشاركة موقع عن السياحة في مجموعات السفر 🧳
* التحسين التقني (Technical SEO):
كل شيء يتعلق بالأمور التقنية مثل:
1️⃣- جعل موقعك سريع من خلال ضغط ملفات التصميم 🎨 وإضافته لشبكة CDN وخاصة في المناطق القريبة من الفئة المستهدفة 🎯
2️⃣- تصميم جذاب يلفت المستخدم، والأهم الذي يعد شيء أساسي اليوم هو تصميم متجاوب على جميع الشاشات 📱 بالنسبة لي أكثر من 65% من الزيارات التي حصلت عليها من تجربتي كانت من هاتف محمول 📱
3️⃣- راقب الأخطاء واعرف كيف تتعامل معها ✖️
4️⃣- لا تقم بقتل موقعك من خلال إعادة التوجيه 302 التي يقصد بهذا ال status code بانتقال الصفحة بشكل مؤقت لهذا العنوان (سيظن محرك البحث أن هذه العملية لصيانة الموقع) وقم لإعادة التوجيه 301 🔄
5️⃣- بعض السمات المهمة في ال Meta Tag 🖥
6️⃣- استخدام خرائط الموقع XML لتعريف محركات البحث بمحتوى الموقع
7️⃣- اخبر محركات البحث نفسها بوجود موقعك على الانترنت 😁

للمزيد من المنشورات ♻️: تصفح قائمة المنشورات
#SEO #search #google #html #wordpress
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
من اللغات البرمجية المستخدمة في برمجة الألعاب هي HTML5 🧐⁉️
للأسف أولا خطء ان HTML5 👩‍💻 هي لغة ترميز وليست لغة برمجة ‼️ والألعاب التي يقال أنها برمجت ب HTML5 هي بالأساس مبرمجة ب JavaScript 👩‍💻 وفقط جرب تعطيل جافا سكريبت في المتصفح والعب اللعبة 😁 و HTML5 يمكن القول أنها مساعدة للمتصفح لبناء لعبة من خلال الرسومات (عنصر Canvas) ‼️ لكن اللعبة تبقى لعبة ويمكنك إنشاء لعبة من خلال HTML4 مع جافا سكريبت مثلاً لعبة XO 🤷‍♂️
ولهذا يجب الانتباه لمصدر المعلومة 🔍 ولا تصدق كل من يقول أن المحتوى الأجنبي هو أفضل من العربي 🙂
#html #javascript #games #programming
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣3
احصائية اللغات البرمجية المستخدمة في بناء مواقع الويب من جهة السيرفر back-end

للمزيد من المنشورات ♻️: تصفح قائمة المنشورات
#back_end #php #python #asp_net #aspnet #dotnet #java #javascript
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Yhya Nesb
منشور من سلسة #CleanCode لمعرفة التفاصيل انقر هنا 🔗
الجزء الثاني عشر في هذه القناة 2️⃣1️⃣
منشور من سلسة #CleanCode لمعرفة التفاصيل انقر هنا 🔗
الجزء الثالث عشر في هذه القناة 3️⃣1️⃣
قد يحوي هذا الجزء على بعض المصطلاحات الغريبة؛ مصطلاحات خاصة بهندسة البرمجيات (software engineering) وتصميم البرمجيات (design pattern)

تجنب الواجهات السلسة Avoid fluent interfaces:
تعد واجهة fluent واجهة برمجة التطبيقات API في البرمجة كائنية التوجه OOP حيث تهدف إلى تحسين قراءة الكود من خلال تتابع أو تسلسل التوابع (function) وتسمى بـ Method chaining
مصطلاحات غريبة 😔
واجهة fluent: ترجمتها: بطلاقة أو سلسة، لكن ليست ❗️ اسم على مسمى(لترجمة طلاقة)؛ المقصود ليس تجنب إستخدام الواجهات interfaces البرمجية بشكل مباشر أو طليق - وسنشرح في الأجزاء القادمة 🔜 ضرورة إستخدام الواجهات البرمجية -
بل هي عبارة عن وجه أو شكل لواجهة برمجة التطبيقات API (حيث API يقوم بعمل الوسيط بين برنامجين لتبادل البيانات؛ أي ليس المقصد هنا إستخدام APIs من جهات خارجية، فقد تقوم بجلب اسم الموقع من قاعدة بيانات وتعرضها للمستخدم) تستخدم تسلسل التوابع (function) في البرمجية كائنية التوجيه OOP لكن بدون إنشاء object (أو بإنشاء لكن القيام بكل العمليات في تسلسل واحد) في متغير، انظر للمثال لتفهم القصد بدقة مع التغير الذي سيحصل لإصدار php8.4 😉:
$name = (new Employees())->topEmployee()->getName();
// in php >= 8.4
$name = new Employees()->topEmployee()->getName();

طريقة التسلسل Method chaining: وهي أحد الطرق التي تستخدم إستدعاء التوابع function بشكل مستقل عند التعامل مع البرمجة كائنية التوجه OOP، حيث يعيد التابع الصنف نفسه الذي تستخدمه - الفرق بينها وبين واجهة fluent أن واجهة fluent تستخدم هذه الطريقة، لكن الطريقة يمكن إستخدامها بدون التعرض لتأثير fluent - في المثال السابق عرضنا طريقة التسلسل مع تأثير fluent أما المثال التالي سيكون بدون تأثير fluent بحيث نقوم بجعل الكائن في متغير خاص به:
$employees = new Employees();
$nameTopSalaryEmployee = $employees->topEmployee()->getName();
$namesTopSalaryEmployees = $employees->topTenEmployee()->getNames();

وفي أول تعليق ستشاهد صورة توضح العلاقة بين المفهومين
في حين أنها تستخدم في بعض السياقات، غالباً في كائنات objects البناء builder (مثل query builder في Laravel) لكن في كثير من الأحيان يأتي ذلك على حساب أنه:
1️⃣- يلغي مفهوم التغليف Encapsulation
2️⃣- يلغي فاعلية نمط المزخرف Decorator (هو نمط من أنماط تصميم البرمجيات)
3️⃣- صعوبة القيام بتجارب متتابعة على الكائن الوهمي (Mock object)
4️⃣- يجعل معرفة الإختلافات بعد التحديثات أكثر صعوبة (الاختلاف في الكود البرمجي)
لمزيد من المعلومات يمكنك قراءة المقالة التالية التي كتبها Marco Pivetta
الاستخدام السيء:
class Car
{
private $make = 'Honda';

private $model = 'Accord';

private $color = 'white';

public function setMake(string $make): self
{
$this->make = $make;

// NOTE: Returning this for chaining
return $this;
}

public function setModel(string $model): self
{
$this->model = $model;

// NOTE: Returning this for chaining
return $this;
}

public function setColor(string $color): self
{
$this->color = $color;

// NOTE: Returning this for chaining
return $this;
}

public function dump(): void
{
var_dump($this->make, $this->model, $this->color);
}
}

$car = (new Car())
->setColor('pink')
->setMake('Ford')
->setModel('F-150')
->dump();

الاستخدام الجيد:
class Car
{
private $make = 'Honda';

private $model = 'Accord';

private $color = 'white';

public function setMake(string $make): void
{
$this->make = $make;
}

public function setModel(string $model): void
{
$this->model = $model;
}

public function setColor(string $color): void
{
$this->color = $color;
}

public function dump(): void
{
var_dump($this->make, $this->model, $this->color);
}
}

$car = new Car();
$car->setColor('pink');
$car->setMake('Ford');
$car->setModel('F-150');
$car->dump();

هذا كل شيء لليوم 😁 في حال أعجبك هكذا نوع من المنشورات لا تنسا مشاركته مع أصدقائك ☺️
للمزيد من هذه الشروحات يمكنك متابعتي ⬅️ @YhyaNesb 🔥
#php
Please open Telegram to view this post
VIEW IN TELEGRAM
ماذا يجب أن أتعلم بعد c++ 🖥
تعلم لغة c++ يقصد به بعد التأسس بهذه اللغة الرائعة، فتعد لغة c++ لغة تأسيسة 🖥 وينصح بها الكثير؛ لكن هناك عدة نقاط يغفل عنها الكثير ‼️ فالتأسيس ليس فقط في تعلم كيف تكتب كود بهذه اللغة 🙂 فلا أحد بحاجة لك لأن أي Model ذكاء اصطناعي يمكنه القيام بذلك 🙃 ؛ تابع القراءة لمعرفة التفاصيل 🔍
ماذا يجب أن أتعلم قبل c++ 🖥
- أساسيات الحاسوب الذي ستتعامل معه 😬 فهو صديق مسيرتك البرمجة 😁 فعليك البدء بتعلم فوائد أو وظائف القطع الأساسية للحاسوب 💻 فمثلاً:
مفهوم خاطئ بأن الذاكرة المؤقتة RAM كلما كانت أكبر كلما كان الحاسوب أقوى 🔥
- بالإضافة لذلك يجب أن تتعلم أنظمة العد 🖥 التي قد تحتاج لها في يوم من الأيام (ركز على النظام الثنائي)
- مدخل إلى الخوارزميات 🖥؛ لا تقلق لا أقصد الخوارزميات التي ستكتب كود برمجي بها 😅 بل التي تجعلك تحلل فكرة صغيرة (الهدف منها هو مساعدك للتفكير كمبرمج، ما الهدف من كتابتك كود برمجي وأنت تبحث عن كود على الانترنت لوضعه في مشروعك - تقوم بكتابه لتشعر بأنك من استطاع حل المشكلة - فحل المشاكل سمة ضرورية للمبرمج الناجح)
- نظام التشغيل الذي ستعمل عليه، كيف تقوم بتحميل برنامج من الانترنت، البحث عبر الانترنت
حسناً أين يمكن العثور على كورسات 👥 لها؟ ببساطة قناة المهندس ابو هدهود
ماذا يجب أن أتعلم أثناء تعلم أساسيات c++ 🖥
- يجب أن تتعلم البنى الأساسية 📌 (الشروط - التكرار - التوابع)
- تقوم بحل بعض التحديات التي ستساعدك لتثبيت مفهوم التكرار (تحديات رسم الأشاكل) وأنصحك بالتحديات الموجودة في موقع هرمش، السبب ببساطة: موقع هرمش موقع تعليمي عربي، يقوم بتحديث محتوى موقعه باستمرار، التحديات الموجودة محلولة باللغات البرمجية التالية: (python - c# - c++ - c - java) التي تعد لغات تأسيسة أيضاً
ملاحظة ⁉️: في حال كنت تريد البدء بتعلم python أتمنى أن تقراء رسالة: لماذا لا يجب عليك تعلم بايثون أولاً؟
- تعلم الفرق ℹ️ بأنواع البيانات (int - short - bigint - unsigned int)
- تعلم البرمجة كائنية التوجه OOP والتي كانت لغة c++ هي أساساً لها عوضاً عن لغة C 👩‍💻
بالنسبة للمصادر أنصحك بكورس الاستاذ أسامة الزيرو وكورس OOP للمهندس عادل نسيم
ماذا يجب أن أتعلم بعد تعلم أساسيات c++ 🖥
- حل المشكلات على مواقع التحديات البرمجية
- تعلم هياكل البيانات والخوارزميات Data Structures تكمن أهمية الكورس في حل المشكلات التي واجهت المبرمجين، بالإضافة لفهم أنواع البيانات الموجودة في اللغات البرمجية الحديثة مثل: php - python
- ابحث عن بعض المكاتب والحاويات الديناميكية الأساسية التي قد تساعدك في حال أردت العمل بهذه اللغة الرائعة 💯 مثل Math - queue - vector
- ابداء بالتعرف على الاختصاصات البرمجية 👀 للتعرف على المجال التي تميل له لبتدأ تعلمه وفي حال كنت قد تعلمت كل ما سابق سيساعدك ويوفر عليك الوقت لتعلم أي لغة برمجة
أما لو كنت تريد احتراف هذه اللغة الرائعة فادعوك لقراءة الخريطة التالية roadmap.sh
تجارب تعلم c++ كلغة تأسيسة 📍
بالنسبة لي ☺️: بعد تعلم هذه اللغة الرائعة، تغيري مفهومي للبرمجة بشكل كامل، من أهمية البرمجة كائنية التوجه حتى فهم أدق 👌 التفاصيل في النتيجة النهائية للكود، والأهم التخطيط الصحيح 🤓 قبل البدء في عملية التكويد، ولا يمكنني أن أنكر فهمي لأنواع البيانات المتعدة التي ساعدتني على بناء قواعد بيانات 📊 بكفائة عالية 🔥
تجربت صديقي 😊 كانت: فهمه للأنواع المختلفة للبيانات بالإضافة لتعلمه أمور دقيقة جداً لم يتطرق لها في أي لغة برمجية قام بتعلمها، علاوة على ذلك فهم ضرورة التأسيس الجيد؛ يمكنك قراءة رائيه بشكل كامل هنا

للمزيد من المنشورات ♻️: تصفح قائمة المنشورات
#php #python #cpp #programming #algorithms #data_structure
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
كيف تحمي بيانات مشروعك في Laravel


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

أحياناً قد تعمل على مشروع بمفردك أو مع فريق وأثناء التحديثات قد يغفل عليكم خطأ معين، وسيسبب كارثة في حال حدثت تعديلات كثيرة في قاعدة البيانات

فالحل الأمثل هو عملية النسخ الإحتياطي للبيانات، فببساطة في حال حدوث خلل يمكنك الرجوع للإصدار السابق من خلال git وإعادة البيانات القديمة ريثما تتم حل المشكلة (أحد الحلول الممكنة)

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

يتطلب تحميل مكتبة: spatie/laravel-backup

بالإضافة لإصدار php أعلى من 8.0 و Laravel 9.0 و إمتداد zip في php (للمزيد من التفاصيل يمكنك قراءة كامل المتطلبات في أول تعليق)

للمزيد من المنشورات ♻️: تصفح قائمة المنشورات
#php #laravel #zip #backup #backend #data
Please open Telegram to view this post
VIEW IN TELEGRAM
1🥰1
جدول القناة لشهر 6/2024 📅
- ما المقصود ب SOLID 🔍
- العمل الحر في مجال البرمجة 🧑‍💻
- ما الفرق بين Model و Query builder في Laravel 👩‍💻
وسيتم النشر بمعدل رسالة اسبوعياً ❤️ ورسالتين لسلسلة #CleanCode 😅 لننهي هذه السلسلة هذا الشهر بإذن الله
بالإضافة لنشر بعض الأخبار التقنية 🖥
في حال اعجبت بمحتوى القناة لا تنسى مشاركتها ❤️

للمزيد من المنشورات ♻️: تصفح قائمة المنشورات
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Yhya Nesb
منشور من سلسة #CleanCode لمعرفة التفاصيل انقر هنا 🔗
الجزء الثالث عشر في هذه القناة 3️⃣1️⃣
منشور من سلسة #CleanCode لمعرفة التفاصيل انقر هنا 🔗
الجزء الرابع عشر في هذه القناة 4️⃣1️⃣
تفضيل الأصناف النهائية (Prefer final classes):
يفضل إستخدام الكلمة المفتاحية final إن أمكن، لأنها:
1️⃣- تمنع وراثة الصنف class، مما يجعله آمن من عمليات التعديل (overriding)
2️⃣- يشجع على فصل التكوين أو الإنشاء عن الوراثة
3️⃣- يؤدي لتحقيق مبدأ المسؤولية الفردية SRP (سنتكلم عنه في الدرس القادم 😁 عندما نتكلم عن مبادئ التصميم SOLID)
4️⃣- يحرض المطورين على إستخدام التوابع (functions) العامة التي قمت بتعريفها، بدلاً من توسيع الصنف والوصول للكائنات الخاصة private (من خلال تعديل توابع الكبسلة set and get)
5️⃣- يسمح لك بتغيير التعليمات البرمجية بدون القلق من إحتمالية حدوث مشكلة في التطبيقات التي تستخدم الصنف (لو لم تفصل الصنف بكلمة final كان ينبغي عليك إنشاء صنف وورثته والتعديل ستجريه على الصنف الابن)
الشرط الوحيد لفصلك ‼️ هو أن تطبق واجهة برمجية (interface) ولا يتم إنشاء أي تابع function عام غير ذلك
لمزيد من المعلومات يمكنك قراءة التدوينة الموضوع الذي كتبه Marco Pivetta (Ocramius)
الاستخدام السيء:
final class Car
{
private $color;

public function __construct($color)
{
$this->color = $color;
}

/**
* @return string The color of the vehicle
*/
public function getColor()
{
return $this->color;
}
}

الاستخدام الجيد:
interface Vehicle
{
/**
* @return string The color of the vehicle
*/
public function getColor();
}

final class Car implements Vehicle
{
private $color;

public function __construct($color)
{
$this->color = $color;
}

public function getColor()
{
return $this->color;
}
}

هذا كل شيء لليوم 😁 في حال أعجبك هكذا نوع من المنشورات لا تنسا مشاركته مع أصدقائك ☺️
للمزيد من هذه الشروحات يمكنك متابعتي ⬅️ @YhyaNesb 🔥
#php #CleanCode #oop #solid
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰1
ما المقصود ب SOLID 🔍
هي مبادئ لتصميم البرمجيات 🧑‍💻 وبالتحديد إختصار لأول 5 مبادئ للتصميم الشيئي (OOD التي هي اختصار لـ: object oriented design) وضعت بواسطة © العم بوب (Robert C. Martin)
تقوم هذه المبادئ على اتخاذ بعض الممارسات 🎮 أثناء بناء البرمجيات لإمكانية توسيع البرمجيات 🕯 وتطويرها بسهولة، واتبع هذه المبادئ يمكن أن يساعد في تجنب الأكواد السئية (أو النتنة)، وتساعد في إعادة هيكلة الكود في عملية refactoring، وإنشاء كود نظيف #CleanCode، وإمكانية إعادة استخدام الكود 🔖 مع قابلية الاختبار، وكل حرف منها يشير إلى مصطلح معين 📍
مبادئ ال SOLID:
مبدأ المسؤولية الفردية (Single-Responsibility Principle):
يجب على أي تابع function أو صنف class سبب واحد للتغير، أي يقوم بوظيفة واحدة فقط

الوظيفة لا يقصد بها شيء واحد 1️⃣ فقط (عندما نتعامل مع صنف class) بل كفكرة واحدة 1️⃣ أي مثلاً لنفترض أنه لدينا صنف class خاصة بإدارة الموظفين؛ قسم الإدارة مسؤول عن: إضافة وحذف وجلب الموظفين، لكن عملية حساب الراتب الخاص بهم ليست من مهمته ⁉️ فيجب أن تكون من مسؤولية صنف آخر مخصص لإدارة الأمور المالية والمحاسبة 💲، مثال عملي
مبدأ الفتح والإغلاق (Open-closed Principle):
يجب أن تكون الكائنات objects مفتوحة للتوسيع أو الوراثة ولكن مغلقة للتعديل

أي لا يجب تعديل الكود القديم ⌛️ (إن أمكن) والاكتفاء بوراثته أو توسيعه في كائن جديد وإجراء التعديل عليه، أو إضافة تابع 😬 يقوم بعمليات التعديل إن أمكن؛ لنفترض أنه لدينا مصفوفة تحوي على صلاحيات Roles يمكننا إضافة تابع يقوم بإضافة صلاحية جديدة حينما نحتاج بدلاً من وراثة الكائن وإضافة الصلاحية الجديدة 🤓، مثال عملي

مبدأ ليسكوف للاستبدال (Liskov Substitution Principle):
لمطلوب هنا هو شيء يشبه خاصيّة الاستبدال التالية: إذا كان من أجل كل كائن O1 من النوع S يوجد كائن O2 من النوع T، فمن أجل جميع البرامج P المعرّفة ضمن النوع T بحيث أنّ سلوك البرنامج P لا يتغيّر عند استبدال O2 بـ O1 فعندها يكون S هو نوع فرعي من T.

لنفترض أن لدينا كائن أب 👨‍🦳 تتم ورثاته في كائنات ابن 👶 (أو أبناء) عندما نقوم باستخدام كائن ابن 👶 لن تكون هناك مشكلة لو استبدلنا الابن 👶 بالأب 👨‍🦳، مثال:
لدينا كائن Car 🚘 يحوي على التوابع drive - getColor، ولدينا تابع Bmw 🚘 يقوم بوراثة الكائن Car يجب أن يحوي على نفس التوابع الموجودة في Car وأن تعمل بدون مشاكل ! (أي لا يجب أن نقوم بتعطيل تابع من خلال إنشاء إستثناء)، مثال عملي

مبدأ فصل الواجهة (Interface Segregation Principle):
لا ينبغي أبداً إجبار العميل على تنفيذ واجهة لا يستخدمها، ولا يجب إجبار العملاء أيضاً على اعتماد أساليب لا تستخدم

نفترض أنه لدينا واجهة للموظفين 👥 تحوي على كل العمليات التي يقوم بها أي بشري، مثل الأكل 🍽 والنوم والعمل، ولدينا صنف class للموظفين البشر 🧍‍♂️ نقوم بتضمين هذه الواجهة، ولدينا صنف للموظفون الآليون 🤖 نضمن لهم نفس الواجهة؛ بهذه الحالة سنضر لإنشاء استثناء لعملية النوم والأكل 😶
فالحل الأمثل إنشاء واجهة للعمليات البشرية، وواجهة للعمال خاصة بوظائف العمل فقط

مبدأ انعكاس التبعية (Dependency Inversion Principle):
يجب أن تعتمد الكائنات objects على التجريدات abstractions (أصناف مجردة)، ولا ينبغي أن تعتمد الواجهات البرمجية عالية المستوى على الواجهات البرمجية منخفضة المستوى، فلا ينبغي أن تعتمد الوجهات/الأصناف المجردة على التفاصيل

بفرض لدينا صنف class خاص بالاتصال بقواعد البيانات 📚 DatabaseConnection يقوم في التابع الباني (construct) بإنشاء كائن من النوع DatabaseMysql في هذه الحالة نحن مجبرون في التعامل مع قاعدة البيانات Mysql 👩‍💻 ويكون الصنفان متعلقين ببعض؛ لكن الحل الأمثل هو تمرير في التابع الباني الصنف المراد إستخدامه للإتصال بقاعدة البيانات مثل (DatabaseSqlServer - DatabaseMysql) وذلك من خلال اعتمادهما على واجهة معينة
#مراجع :
academy hsoub
تعلم SOLID Principles باستخدام Javascript
SOLID: The First 5 Principles of Object Oriented Design
بالنسبة لمثال عملي لكل مبدأ سيتم ذلك من خلال سلسة #CleanCode 😁
للمزيد من هذه الشروحات يمكنك متابعتي ⬅️ @YhyaNesb 🔥
#php #CleanCode #oop #solid
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Yhya Nesb
منشور من سلسة #CleanCode لمعرفة التفاصيل انقر هنا 🔗
الجزء الرابع عشر في هذه القناة 4️⃣1️⃣
منشور من سلسة #CleanCode لمعرفة التفاصيل انقر هنا 🔗
الجزء الخامس عشر في هذه القناة 5️⃣1️⃣
SOLID:
هي مبادئ لتصميم البرمجيات 🧑‍💻، قمنا بشرحها في منشور سابق: "ما المقصود ب SOLID"
مبدأ المسؤولية الفردية (Single-Responsibility Principle اختصارها SRP):
كما هو مذكور بـ Clean Code: "لا يجب أن يكون هناك أكثر من سبب واحد لتغيير الصنف class"
There should never be more than one reason for a class to change

من المغري تحميل الصنف class بالكثير 📈 من التوابع، مثل عندما يمكنك أخذ حقيبة 🛍 واحدة فقط في رحلتك ✈️
المشكلة في ذلك هو أن الصنف class الخاصة بك لن يكون من الناحية النظرية 👀 متماسك وسوف يحوي على العديد 🔍 من الأسباب للتغيير، من المهم تقليل 📉 عدد المرات التي تحتاج فيها إلى تغير الصنف class، أنه أمر ضروري لأن كثرة التوابع في صنف واحد ستؤدي بحال قمت بتعديل جزء 🍕 واحد منه؛ بإحتمالية أن يكون صعب الفهم لكيفية تأثير ذلك على التوابع الأخرى في الصنف class نفسه
الاستخدام السيء:
class UserSettings
{
private $user;

public function __construct(User $user)
{
$this->user = $user;
}

public function changeSettings(array $settings): void
{
if ($this->verifyCredentials()) {
// ...
}
}

private function verifyCredentials(): bool
{
// ...
}
}

الاستخدام الجيد:
class UserAuth
{
private $user;

public function __construct(User $user)
{
$this->user = $user;
}

public function verifyCredentials(): bool
{
// ...
}
}

class UserSettings
{
private $user;

private $auth;

public function __construct(User $user)
{
$this->user = $user;
$this->auth = new UserAuth($user);
}

public function changeSettings(array $settings): void
{
if ($this->auth->verifyCredentials()) {
// ...
}
}
}

هذا كل شيء لليوم 😁 في حال أعجبك هكذا نوع من المنشورات لا تنسا مشاركته مع أصدقائك ☺️
للمزيد من هذه الشروحات يمكنك متابعتي ⬅️ @YhyaNesb 🔥
#php #CleanCode #oop #solid
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰1👏1
Yhya Nesb
منشور من سلسة #CleanCode لمعرفة التفاصيل انقر هنا 🔗
الجزء الخامس عشر في هذه القناة 5️⃣1️⃣
منشور من سلسة #CleanCode لمعرفة التفاصيل انقر هنا 🔗
الجزء السادس عشر في هذه القناة 6️⃣1️⃣
مبدأ الفتح والإغلاق (Open-closed Principle اختصارها OCP):
كما ذكر Bertrand Meyer: "يجب أن تكون الكيانات البرمجية 👩‍💻 (الأصناف classes، الوحدات modules، التوابع functions، الخ ...) مفتوحة للتمدد ومغلقة للتعديل ✏️ ."
software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification.

ما المقصود في ذلك؟ هذا المبدأ ينص بشكل أساسي بالسماح للمستخدمين بإضافة وظائف جديدة 🆕 دون تغير التعليمات البرمجية الموجودة.
الاستخدام السيء:
abstract class Adapter
{
protected string $name;
public function __construct(){}
public function getName(): string
{
return $this->name;
}
}

class AjaxAdapter extends Adapter
{
public function __construct()
{
parent::__construct();

$this->name = 'ajaxAdapter';
}
}

class NodeAdapter extends Adapter
{
public function __construct()
{
parent::__construct();

$this->name = 'nodeAdapter';
}
}

class HttpRequester
{
private Adapter $adapter;

public function __construct(Adapter $adapter)
{
$this->adapter = $adapter;
}

public function fetch(string $url): Promise
{
$adapterName = $this->adapter->getName();

if ($adapterName === 'ajaxAdapter') {
return $this->makeAjaxCall($url);
} elseif ($adapterName === 'httpNodeAdapter') {
return $this->makeHttpCall($url);
}
}

private function makeAjaxCall(string $url): Promise
{
// request and return promise
}

private function makeHttpCall(string $url): Promise
{
// request and return promise
}
}

الاستخدام الجيد:
interface Adapter
{
public function request(string $url): Promise;
}

class AjaxAdapter implements Adapter
{
public function request(string $url): Promise
{
// request and return promise
}
}

class NodeAdapter implements Adapter
{
public function request(string $url): Promise
{
// request and return promise
}
}

class HttpRequester
{
private $adapter;

public function __construct(Adapter $adapter)
{
$this->adapter = $adapter;
}

public function fetch(string $url): Promise
{
return $this->adapter->request($url);
}
}

هذا كل شيء لليوم 😁 في حال أعجبك هكذا نوع من المنشورات لا تنسا مشاركته مع أصدقائك ☺️
للمزيد من هذه الشروحات يمكنك متابعتي ⬅️ @YhyaNesb 🔥
#php #CleanCode #oop #solid
Please open Telegram to view this post
VIEW IN TELEGRAM
عيد اضحى مبارك أعاده الله عليكم بكل خير  وبكل صحه وسعاده

و كل عام وانتم بخير جميعاً ❤️
5
Yhya Nesb
منشور من سلسة #CleanCode لمعرفة التفاصيل انقر هنا 🔗
الجزء السادس عشر في هذه القناة 6️⃣1️⃣
منشور من سلسة #CleanCode لمعرفة التفاصيل انقر هنا 🔗
الجزء السابع عشر في هذه القناة 7️⃣1️⃣
مبدأ ليسكوف للاستبدال (Liskov Substitution Principle اختصارها LSP):
هو مصطلح مخيف 😰 لمفهوم بسيط جداً، يتم تعريفه رسمياً على أنه:
إذا كان S هو نوع فرعي من T، يمكن استبدال كائنات من النوع T بكائنات من النوع S (أي، كائنات من النوع S قد تحل محل كائنات من النوع T) دون تغيير أي من الخصائص المرغوبة لذلك البرنامج (الصحة، تنفيذ المهمة، وما إلى ذلك).

وهذا تعريف أكثر رعباً 😅، بمعنى أصح 😬 يكون لدينا صنف S موروث من صنف T نستطيع استبدال كائنات T بكائنات S بدون حدوث مشاكل بتوافق التوابع (functions)، ربما لا يزال هذا الأمر غامضاً 🥲، لذا دعونا نلقي نظرة على المثال التقليدي ⌛️ المربع والمستطيل. من الناحية الرياضية ، المربع هو مستطيل، ولكن إذا قمت بتصميمه باستخدام علاقة "is-a" أو "يكون" عبر الميراث، فسوف تقع في مشكلة بسرعة.
الاستخدام السيء:
class Rectangle
{
protected $width = 0;

protected $height = 0;

public function setWidth(int $width): void
{
$this->width = $width;
}

public function setHeight(int $height): void
{
$this->height = $height;
}

public function getArea(): int
{
return $this->width * $this->height;
}
}

class Square extends Rectangle
{
public function setWidth(int $width): void
{
$this->width = $this->height = $width;
}

public function setHeight(int $height): void
{
$this->width = $this->height = $height;
}
}

function printArea(Rectangle $rectangle): void
{
$rectangle->setWidth(4);
$rectangle->setHeight(5);

// BAD: Will return 25 for Square. Should be 20.
echo sprintf('%s has area %d.', get_class($rectangle), $rectangle->getArea()) . PHP_EOL;
}

$rectangles = [new Rectangle(), new Square()];

foreach ($rectangles as $rectangle) {
printArea($rectangle);
}

الاستخدام الجيد:
أفضل طريقة 🥇 هي فصل المربعات وتخصيص 🎨 أنواع فرعية أكثر عمومية للشكل
ورغم تشابه المربع والمستطيل إلا أنهما مختلفان 🤷‍♂️، ويحتوي المربع على الكثير مع القواسم المشتركة مع المعين والمستطيل مع متوازي الأضلاع، لكنهما ليسا أنواعًا فرعية 😅.
المربع والمستطيل والمعين ومتوازي الأضلاع هي أشكال منفصلة لها خصائصها الخاصة، وإن كانت متشابهة.
interface Shape
{
public function getArea(): int;
}

class Rectangle implements Shape
{
private $width = 0;
private $height = 0;

public function __construct(int $width, int $height)
{
$this->width = $width;
$this->height = $height;
}

public function getArea(): int
{
return $this->width * $this->height;
}
}

class Square implements Shape
{
private $length = 0;

public function __construct(int $length)
{
$this->length = $length;
}

public function getArea(): int
{
       return $this->length ** 2;
   }
}

function printArea(Shape $shape): void
{
echo sprintf('%s has area %d.', get_class($shape), $shape->getArea()).PHP_EOL;
}

$shapes = [new Rectangle(4, 5), new Square(5)];

foreach ($shapes as $shape) {
printArea($shape);
}

هذا كل شيء لليوم 😁 في حال أعجبك هكذا نوع من المنشورات لا تنسا مشاركته مع أصدقائك ☺️
للمزيد من هذه الشروحات يمكنك متابعتي ⬅️ @YhyaNesb 🔥
#php #CleanCode #oop #solid
Please open Telegram to view this post
VIEW IN TELEGRAM