Philocode
کتاب جدیدی که خوندنش رو شروع میکنم. مقدمۀ این کتاب رو قبلاً خونده بودم که توضیحات خوبی دربارۀ شیءگرایی و اصول SOLID داره ولی این بار ان شاء الله تا آخرش میریم که ببینیم واقعاً نویسنده (Alexander Shvets) چقدر به قولش عمل کرده و توی این دیزاینپترنها عمیق…
وقتی ساختن یک آبجکت حالتهای مختلفی داره (مثلاً خونه یه نبش داره، دو نبش داره، ممکنه مغازه داشته باشه یا نداشته باشه، باغچه داشته باشه یا نداشته باشه و...)، یه راه اینه که به ازای حالتهای مختلف، subclass بسازیم. اینجا Builder Pattern وارد صحنه میشه و میگه من راهحلم.
🤩1
Philocode
وقتی ساختن یک آبجکت حالتهای مختلفی داره (مثلاً خونه یه نبش داره، دو نبش داره، ممکنه مغازه داشته باشه یا نداشته باشه، باغچه داشته باشه یا نداشته باشه و...)، یه راه اینه که به ازای حالتهای مختلف، subclass بسازیم. اینجا Builder Pattern وارد صحنه میشه و میگه…
شاید بشه کلاس InlineKeyboard توی پکیج TeleBot رو یه بیلدر به شمار آورد:
$keyboard = new InlineKeyboard()
->addCallbackButton('Help, 'help_callback')
->addUrlButton('FAQ', 'https://example.com/faq')
.
.
.🤔2👍1
Philocode
کتاب جدیدی که خوندنش رو شروع میکنم. مقدمۀ این کتاب رو قبلاً خونده بودم که توضیحات خوبی دربارۀ شیءگرایی و اصول SOLID داره ولی این بار ان شاء الله تا آخرش میریم که ببینیم واقعاً نویسنده (Alexander Shvets) چقدر به قولش عمل کرده و توی این دیزاینپترنها عمیق…
حتی یک تغییردادن ساده در یک کدبیس monolithic بسیار سخت است؛ زیرا باید تمام سیستم را به خوبی درک کرده باشید. اما تغییردادن ماژولهای کوچکتر که به خوبی تعریف شده باشند، بسیار آسانتر است.
👍2🔥2
پرسیدن از دیزاینپترنها توی مصاحبه (به شکلی که رایجه) صرفاً نشون میده که طرف مطالعۀ تئوریک داشته یا نه.
مثلاً میپرسی: دربارۀ دیزاینپترن wrapper توضیح بدید!
این بندهخدا هم برای اولینبار اسم wrapper به گوشش خورده! البته بلده، ولی اون رو با اسم decorator میشناسه!
یک دیزاینپترن ممکنه اسمهای مختلفی داشته باشه (کتاب GoF به اسمهای مختلف اشاره میکنه) و اینکه کسی یک اسم رو یادش نیاد یا ندونه، دلیل نیست که طراح خوبی نباشه.
به جای این کارها، براشون یه مسئله طرح کنید و ببینید چهطوری حلش میکنند!
مثلاً میپرسی: دربارۀ دیزاینپترن wrapper توضیح بدید!
این بندهخدا هم برای اولینبار اسم wrapper به گوشش خورده! البته بلده، ولی اون رو با اسم decorator میشناسه!
یک دیزاینپترن ممکنه اسمهای مختلفی داشته باشه (کتاب GoF به اسمهای مختلف اشاره میکنه) و اینکه کسی یک اسم رو یادش نیاد یا ندونه، دلیل نیست که طراح خوبی نباشه.
به جای این کارها، براشون یه مسئله طرح کنید و ببینید چهطوری حلش میکنند!
👍3
تفاوت Decorator و Strategy: اولی به شما امکان این را میدهد که پوستۀ آبجکت را تغییر دهید، اما با دومی میتوان هسته را تغییر داد.
👍3
Philocode
تفاوت Decorator و Strategy: اولی به شما امکان این را میدهد که پوستۀ آبجکت را تغییر دهید، اما با دومی میتوان هسته را تغییر داد.
وقتی از Facade pattern استفاده کنید که میخواهید رابط (interface) محدود اما سرراستی برای یک subsystem پیچیده ایجاد کنید. این پترن یک میانبر (shortcut) برای پراستفادهترین قابلیتهای subsystem که نیازمندیهای client را برآورده میکنند به وجود میآورد.
👍1
تفاوت Proxy و Decorator: غالباً اولی خودش آبجکتش را با life cycle آن مدیریت میکند، اما در Decorator این مدیریت توسط client انجام میشود.
❤1
چند سؤال مصاحبه:
- در PHP، چگونه میتوانیم از subclass به superclass دسترسی داشته باشیم؟
- برای یک ادیتور، ساختاری طراحی کنید که بدون تغییر، تگهای جدیدی معرفی شود.
- در Laravel، یک دستور به artisan اضافه کنید که لیست routeها را در یک فایل html قرار دهد.
- تفاوت overloading و overriding را توضیح دهید.
- در PHP، چگونه میتوانیم از subclass به superclass دسترسی داشته باشیم؟
- برای یک ادیتور، ساختاری طراحی کنید که بدون تغییر، تگهای جدیدی معرفی شود.
- در Laravel، یک دستور به artisan اضافه کنید که لیست routeها را در یک فایل html قرار دهد.
- تفاوت overloading و overriding را توضیح دهید.
👍3🔥1
توی جاواسکریپت،
()Date یه string بهمون میده، اما خروجی ()new Date یه آبجکته.👍2
سوال: چرا توی Typenoscript نباید از any به عنوان type استفاده کرد؟
جواب: بیکاز ما از typeها استفاده میکنیم تا به باگهای کمتری بخوریم و توسعه، راحتتر و مطمئنتر بشه. اگه قراره از any (هرچی!) استفاده کنیم، دیگه چرا از Typenoscript استفاده میکنیم؟! میریم همون Javsacriptمون رو مینویسیم!
جواب: بیکاز ما از typeها استفاده میکنیم تا به باگهای کمتری بخوریم و توسعه، راحتتر و مطمئنتر بشه. اگه قراره از any (هرچی!) استفاده کنیم، دیگه چرا از Typenoscript استفاده میکنیم؟! میریم همون Javsacriptمون رو مینویسیم!
👍3🔥2
const something = undefined
if (!something) { console.log('Yep') } else { console.log('Nope') }
if (!something) { console.log('Yep') } else { console.log('Nope') }
Anonymous Quiz
56%
Yep
44%
Nope
🔥3
🔥3
Philocode
console.log(typeof [1, 2, 3])
پس فهمیدیم که
typeof ['chiz', 'another chiz']میشه 'object'، اگه خواستید آرایهبودن رو چک کنید، یه کار ساده اینه که بفرمایید:
Array.isArray(['chiz', 'another chiz'])
اون چند نفری که گزینۀ اول رو انتخاب کردن رو هم زنده میخوام!👍1
کلاسهایی که دپندنسی کلاسهای دیگه هستن، باید خیلی خوب و واضح نوشته بشن. اگه مشکلی باشه، باید یه Exception بدن تا رفتارشون مارو فریب نده. مثلاً جایی که درست کار نکرده، null برنگردونید، تا کدی که ازش استفاده میکنه، متوجه خطا بشه. کلید اینه که خطاها باید داد بزنن، نه اینکه پنهان بشن.
👍2🤔1
نوشتن این مقاله، انرژی زیادی گرفت. اگه تا الآن LSP رو درک نکردید، امیدوارم این مقاله بهتون کمک کنه.
https://virgool.io/@WebPajooh/liskov-substitution-principle-in67fgqwv8ir
https://virgool.io/@WebPajooh/liskov-substitution-principle-in67fgqwv8ir
ویرگول
فهمیدن LSP - یکبار برای همیشه!
در این مقاله به توضیح اصل سوم SOLID یعنی LSP میپردازیم و با مثالهای متعدد، دید بهتری از قوانین آن ارائه میکنیم
❤6