Помните, выше я говорил, что повторение бизнес-логики всегда является нарушением DRY? Очевидно, что это справедливо для ситуаций, когда повторяется одна и та же бизнес-логика.
Пример:
/** Shipment from the warehouse to the customer */
class Shipment
{
public $deliveryTime = 4; //in days
public function calculateDeliveryDay(): DateTime
{
return new \DateTime("now +{$this->deliveryTime} day");
}
}
/** Order return of a customer */
class OrderReturn
{
public $returnLimit = 4; //in days
public function calculateLastReturnDay(): DateTime
{
return new \DateTime("now +{$this->returnLimit} day");
}
}
Вы уже слышите, как ваш коллега Лёха нежно вопит вам в ухо: «Это очевидное нарушение всего, во что я верю! А как же принцип DRY? У меня сердце сжимается!».
Но Лёха снова ошибается. С точки зрения электронной коммерции, время доставки товара покупателю (Shipment::calculateDeliveryDay()) не имеет отношения к сроку возврата товара покупателем (Return::calculateLastReturnDay).
Это две разные функциональности. То, что выглядит дублированием кода, на самом деле чистое совпадение. Что произойдёт, если вы объедините два метода в один? Если ваша компания решит, что покупатель теперь может вернуть товар в течение месяца, то вам снова придётся разделить метод. Ведь если этого не сделать, то срок доставки товара тоже будет составлять один месяц!
Пример:
/** Shipment from the warehouse to the customer */
class Shipment
{
public $deliveryTime = 4; //in days
public function calculateDeliveryDay(): DateTime
{
return new \DateTime("now +{$this->deliveryTime} day");
}
}
/** Order return of a customer */
class OrderReturn
{
public $returnLimit = 4; //in days
public function calculateLastReturnDay(): DateTime
{
return new \DateTime("now +{$this->returnLimit} day");
}
}
Вы уже слышите, как ваш коллега Лёха нежно вопит вам в ухо: «Это очевидное нарушение всего, во что я верю! А как же принцип DRY? У меня сердце сжимается!».
Но Лёха снова ошибается. С точки зрения электронной коммерции, время доставки товара покупателю (Shipment::calculateDeliveryDay()) не имеет отношения к сроку возврата товара покупателем (Return::calculateLastReturnDay).
Это две разные функциональности. То, что выглядит дублированием кода, на самом деле чистое совпадение. Что произойдёт, если вы объедините два метода в один? Если ваша компания решит, что покупатель теперь может вернуть товар в течение месяца, то вам снова придётся разделить метод. Ведь если этого не сделать, то срок доставки товара тоже будет составлять один месяц!
Remember I said above that repeating business logic is always a DRY violation? Obviously, this is true for situations where the same business logic is repeated.
Example:
/ ** Shipment from the warehouse to the customer * /
class Shipment
{
public $ deliveryTime = 4; // in days
public function calculateDeliveryDay (): DateTime
{
return new \ DateTime ("now + {$ this-> deliveryTime} day");
}
}
/ ** Order return of a customer * /
class OrderReturn
{
public $ returnLimit = 4; // in days
public function calculateLastReturnDay (): DateTime
{
return new \ DateTime ("now + {$ this-> returnLimit} day");
}
}
You can already hear how your colleague Lyokha gently yells in your ear: “This is an obvious violation of everything I believe in! What about the DRY principle? My heart is squeezing! "
But Lyokha is wrong again. From an e-commerce point of view, the delivery time of the item to the customer (Shipment :: calculateDeliveryDay ()) is not related to the time the customer returns the item (Return :: calculateLastReturnDay).
These are two different functionalities. What looks like code duplication is actually a pure coincidence. What happens if you combine two methods into one? If your company decides that the customer can now return the item within a month, you will have to split the method again. After all, if this is not done, then the delivery time of the goods will also be one month!
Example:
/ ** Shipment from the warehouse to the customer * /
class Shipment
{
public $ deliveryTime = 4; // in days
public function calculateDeliveryDay (): DateTime
{
return new \ DateTime ("now + {$ this-> deliveryTime} day");
}
}
/ ** Order return of a customer * /
class OrderReturn
{
public $ returnLimit = 4; // in days
public function calculateLastReturnDay (): DateTime
{
return new \ DateTime ("now + {$ this-> returnLimit} day");
}
}
You can already hear how your colleague Lyokha gently yells in your ear: “This is an obvious violation of everything I believe in! What about the DRY principle? My heart is squeezing! "
But Lyokha is wrong again. From an e-commerce point of view, the delivery time of the item to the customer (Shipment :: calculateDeliveryDay ()) is not related to the time the customer returns the item (Return :: calculateLastReturnDay).
These are two different functionalities. What looks like code duplication is actually a pure coincidence. What happens if you combine two methods into one? If your company decides that the customer can now return the item within a month, you will have to split the method again. After all, if this is not done, then the delivery time of the goods will also be one month!
У записи 1 лайков,
0 репостов,
273 просмотров.
0 репостов,
273 просмотров.
Эту запись оставил(а) на своей стене Владимир Шалимов