این پکیج لاراولی، کد و ساختار پروژۀ شمارو تحلیل میکنه!
https://github.com/nunomaduro/phpinsights
#laravel
https://github.com/nunomaduro/phpinsights
#laravel
🔥2
Philocode
ماتیاس نوباک میگه که آبجکتها دو نوع هستند: + Services + Other objects: - Value objects - Entities (models) نوع اول باید immutable باشه، بر خلاف نوع دوم که میتونه دستکاری بشه.
میفرماید که ما کلاسی داریم که با پول سر و کار داره:
class Converterاما ممکنه که مقادیر غیر مجاز برای این دو پارامتر داده بشه، مثلاً برای amount عددی منفی بیاد یا اینکه برای currency مقدار "ABC" بیاد که واحد پول هیچ کشوری نیست! برای اینکه ولیدیشن رو داخل constructor انجام ندیم، اینهارو به عنوان تایپ مستقلی در میاریم:
{
public function __construct(float $amount, string $currency) { ... }
}
class Converterخیلی خوب شد، اما مثلاً خروجی ما میتونه Amount باشه درحالیکه به Currency هم نیاز داریم؛ به یه عبارت دیگه، این دو مقدار به هم ارتباط دارند و نمیخواییم جداشون کنیم، از طرفی توی بخشهای دیگۀ سیستم ممکنه به هرکدومشون به تنهایی نیاز پیدا کنیم، پس هر دو رو داخل تایپ جدیدی به اسم Money میذاریم:
{
public function __construct(Amount $amount, Currency $currency) { ... }
}
class Converterو خود Money هم اینطوری ساخته میشه:
{
public function __construct(Money $money) { ... }
}
class Money
{
public function __construct(Amount $amount, Currency $currency) { ... }
}👍2
Philocode
میفرماید که ما کلاسی داریم که با پول سر و کار داره: class Converter { public function __construct(float $amount, string $currency) { ... } } اما ممکنه که مقادیر غیر مجاز برای این دو پارامتر داده بشه، مثلاً برای amount عددی منفی بیاد یا اینکه برای currency…
مقالهای از مارتین فولر دربارۀ Value Objectها:
https://martinfowler.com/bliki/ValueObject.html
https://martinfowler.com/bliki/ValueObject.html
👍2
I can do it this way:
#HusseinNasr
http://localhostAnd if I want it to be fancy I can do it this way:
http://127.0.0.1And if I want it to be even fancier:
http://[::1] 😵💫😂#HusseinNasr
🔥2
امشب فکر میکردم که قدیمها هرچی فحش داشتیم، الآن یا تبدیل به شغل شده، یا گرایش! خدا عاقبت مارو به خیر کنه. 🤔
😁4
Philocode
مقالهای از مارتین فولر دربارۀ Value Objectها: https://martinfowler.com/bliki/ValueObject.html
میفرماید که Value Objectها ویژگیهایی دارن، از جمله این دو ویژگی:
1. اینکه immutable هستند، قرار نیست تغییرشون بدیم.
2. اینکه یکتا نیستند. بر خلاف entity که برای ذخیرهسازی و... نیاز داریم identifiable باشه، اینها نیاز نیست که identifiable باشند.
1. اینکه immutable هستند، قرار نیست تغییرشون بدیم.
2. اینکه یکتا نیستند. بر خلاف entity که برای ذخیرهسازی و... نیاز داریم identifiable باشه، اینها نیاز نیست که identifiable باشند.
👍2
Philocode
میفرماید که Value Objectها ویژگیهایی دارن، از جمله این دو ویژگی: 1. اینکه immutable هستند، قرار نیست تغییرشون بدیم. 2. اینکه یکتا نیستند. بر خلاف entity که برای ذخیرهسازی و... نیاز داریم identifiable باشه، اینها نیاز نیست که identifiable باشند.
یکی از دلایلی که نویسنده برای این آورده که value objectها بايد immutable باشند.
به اتفاق غیر منتظرهای که با تغییردادن پراپرتی acc1 (که یک value object ــه) افتاده توجه کنید.
به اتفاق غیر منتظرهای که با تغییردادن پراپرتی acc1 (که یک value object ــه) افتاده توجه کنید.
👍3
Philocode
یکی از دلایلی که نویسنده برای این آورده که value objectها بايد immutable باشند. به اتفاق غیر منتظرهای که با تغییردادن پراپرتی acc1 (که یک value object ــه) افتاده توجه کنید.
توی Javanoscript میشه اینطوری آبجکتهارو clone کرد. اگه به جای این کار (بهش میگیم spread) میاومدیم obj1 رو به obj2 اساین میکردیم، تغییر obj1 روی obj2 هم اعمال میشد چون بهش reference داشت.
👍2
Philocode
توی Javanoscript میشه اینطوری آبجکتهارو clone کرد. اگه به جای این کار (بهش میگیم spread) میاومدیم obj1 رو به obj2 اساین میکردیم، تغییر obj1 روی obj2 هم اعمال میشد چون بهش reference داشت.
حاصل کد زیر کدام است؟
console.log({ name: "John" } == { name: "John" })
console.log({ name: "John" } == { name: "John" })
Anonymous Quiz
45%
true
45%
false
11%
An error occuers
👍2
Philocode
یکی از دلایلی که نویسنده برای این آورده که value objectها بايد immutable باشند. به اتفاق غیر منتظرهای که با تغییردادن پراپرتی acc1 (که یک value object ــه) افتاده توجه کنید.
Inside an immutable object:
public withPassword (string plainTextPassword): UserInside a mutable object:
public setPassword (string plainTextPassword): void
Philocode
حاصل کد زیر کدام است؟
console.log({ name: "John" } == { name: "John" })
console.log({ name: "John" } == { name: "John" })
جواب درست: false
چرا؟ چون جناب Javanoscript آبجکتهارو بر اساس اون value که دارن مقایسه نمیکنه، به جای اون به reference دقت میکنه؛ برای همین هیچوقت دو آبجکت جدا مساوی نیستند، حتی اگه value یکسان داشته باشند.
به این مثال هم توجه کنید:
چرا؟ چون جناب Javanoscript آبجکتهارو بر اساس اون value که دارن مقایسه نمیکنه، به جای اون به reference دقت میکنه؛ برای همین هیچوقت دو آبجکت جدا مساوی نیستند، حتی اگه value یکسان داشته باشند.
به این مثال هم توجه کنید:
const obj1 = { age: 24 }
const obj2 = obj1
console.log(obj1 == obj2) // true
const obj3 = { ...obj1 }
console.log(obj3 == obj1) // false👍2
Philocode
Inside an immutable object: public withPassword (string plainTextPassword): User Inside a mutable object: public setPassword (string plainTextPassword): void
توی لاراول یه کلاس به اسم Builder داریم که کار ساختن کوئریهای دیتابیس رو انجام میده.
متد select این کلاس رو ببینیم:
چیزی که باعث گیجی ما شده، اینه که خروجی متدها شبیه immutableهاست (پست ریپلایشده رو ببینید)، ولی ساختار آبجکت و رفتار این متد به mutableها شباهت داره! چیزی که باعث گیجی ما شده، اینه که این کلاس میخواسته یه راه سرراست در اختیار ما بذاره که هر بار instance این آبجکت رو صدا نزنیم و به صورت زنجیرهوار از متدها استفاده کنیم.
متد select این کلاس رو ببینیم:
public function select($columns = ['*'])این متد داره this$ رو برمیگردونه، و از اینجا حدس میزنیم: آها، این یه immutable object ـــه! اما پیادهسازی متدهای این کلاس از جمله خود select یه چیز دیگه به ما میگن؛ مثلاً روی این کلاس یه پراپرتی به اسم columns داریم که متد select تغییرش میده!
{
// 13 lines removed
return $this;
}
چیزی که باعث گیجی ما شده، اینه که خروجی متدها شبیه immutableهاست (پست ریپلایشده رو ببینید)، ولی ساختار آبجکت و رفتار این متد به mutableها شباهت داره! چیزی که باعث گیجی ما شده، اینه که این کلاس میخواسته یه راه سرراست در اختیار ما بذاره که هر بار instance این آبجکت رو صدا نزنیم و به صورت زنجیرهوار از متدها استفاده کنیم.
👍2🔥2
Philocode
توی لاراول یه کلاس به اسم Builder داریم که کار ساختن کوئریهای دیتابیس رو انجام میده. متد select این کلاس رو ببینیم: public function select($columns = ['*']) { // 13 lines removed return $this; } این متد داره this$ رو برمیگردونه، و از اینجا حدس…
همیشه آبجکتهای immutable را ترجیح دهید؛ یعنی آنهایی که بعد از ساختهشدن نمیتوانند تغییر کنند. اگر واقعاً در شرایطی نیاز داشتید که چیزی را تغییر دهید، ابتدا یک کپی بسازید و بعد تغییرات را روی کپی اعمال کنید.
#ObjectDesignStyleGuide
#ObjectDesignStyleGuide
Philocode
همیشه آبجکتهای immutable را ترجیح دهید؛ یعنی آنهایی که بعد از ساختهشدن نمیتوانند تغییر کنند. اگر واقعاً در شرایطی نیاز داشتید که چیزی را تغییر دهید، ابتدا یک کپی بسازید و بعد تغییرات را روی کپی اعمال کنید. #ObjectDesignStyleGuide
🧐 A template for methods
[scope] function methodName(type name, ...): void | [return-type]
{
[preconditions checks]
[failure scenarios]
[happy path]
[postcondition checks]
[return void|specific-return-type]
}
#ObjectDesignStyleGuide
Philocode
🧐 A template for methods [scope] function methodName(type name, ...): void | [return-type] { [preconditions checks] [failure scenarios] [happy path] [postcondition checks] [return void|specific-return-type] } #ObjectDesignStyleGuide
به متد شمارۀ یک میگیم command method که قراره کاری انجام بده، که اینجا تغییردادن پراپرتیه.
به متد شمارۀ دو میگیم query method که برای برگردوندن اطلاعات ازش استفاده کردیم؛ واضحه که return type مشخصی باید داشته باشه، و لازمه که side effect (عوارض جانبی) نداشته باشه.
به متد شمارۀ دو میگیم query method که برای برگردوندن اطلاعات ازش استفاده کردیم؛ واضحه که return type مشخصی باید داشته باشه، و لازمه که side effect (عوارض جانبی) نداشته باشه.
🔥1
Philocode
به متد شمارۀ یک میگیم command method که قراره کاری انجام بده، که اینجا تغییردادن پراپرتیه. به متد شمارۀ دو میگیم query method که برای برگردوندن اطلاعات ازش استفاده کردیم؛ واضحه که return type مشخصی باید داشته باشه، و لازمه که side effect (عوارض جانبی) نداشته…
بشنویم از مارتین فولر که راجع به جداسازی Query/Command methodها افاضه فرموده:
https://martinfowler.com/bliki/CommandQuerySeparation.html
https://martinfowler.com/bliki/CommandQuerySeparation.html
martinfowler.com
bliki: Command Query Separation
a bliki entry for Command Query Separation