Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Функция getCustEmail была унаследована от функции getCustName, когда в приложении появилась поддержка email-адресов. Наследование кода подобным образом позволяет избежать случайного введения в программу новых багов.
enum BOOL { FALSE, TRUE, FILENOTFOUND }try
{
....
}
catch
{ }
for (int i = 0; i < sz; ++i) { // цикл от 0 до szvar name1 = name + "1";
var name2 = name + "2";
var name3 = name + "3";
if ( doc.Bookmarks.Exists( name1 ) &&
doc.Bookmarks.Exists( name2 ) &&
doc.Bookmarks.Exists( name3 ) ) {
// ...
}
function SomeFunc(...){
....
return $a ? true : false;
throw new Exception('Пыщь пыщь алярм!');
return false;
}
If(false) {
... 9000 строк кода ...
}
if(false) { ... } иногда может быть полезен, поскольку код в нем все равно проверяется на синтаксическую и семантическую корректность. В результате исключается ситуация, когда код нужно срочно раскомментировать, а он не компилируется, потому что кто-то отрефакторил использованные в нем классы \ методы.Но то, что сделали вы (функциональность 30 классов в одном) — это уже даже слишком плохо, чтобы обсуждать.Откуда вы там функциональность 30ти классов-то взяли и почему нельзя обсуждать?
До моего рефакторинга тем же самым занималось около 30 классов
В одном проекте, который я унаследовал при поступлении на работу была глобальная переменная isUtilCall. На мой вопрос: "зачем она нужна?" — получил ответ, что я пойму позже. В последующий год я всё больше ценил то, что предыдущий коллега не поддался искушению дать мне часть правды, а подготовил к практической непознаваемости всей семантики этого механизма.
// пробуем авторизоваться из запроса
// не получилось, бывает
// тогда попробуем из кук
// та же беда
// используй силу, Люк! перенаправляем на главную
// эта строчка очень нужна, поверь мне, друг
// на поиск этого решения я потратил 6 дней, СДОХНИ, БАГ!
public void ProcessCustomerEntity(CustomerEntity customerEntity, UserEntity userEntity1, UserEntity entity2)
{
...
}
function createInvoice(Account $account, $amount)
{
...
}
createInvoice(Account $customer, Money $amount)
{
...
}
Аккаунт не может быть клиентом.
Плюс, не факт, что мы работаем именно с аккаунтом клиента, а не с любым аккаунтом.
Деньги не могут быть количеством.
Не факт, зависит от потребностей домена.
Потому и принимаем по интерфейсу Account, но в контексте данного метода это не абстрактный аккаунт, а именно клиент, т.к. мы создаем какаю-то счет-фактуру.
martinfowler.com/eaaCatalog/money.html.
в нашей системе любой счёт — клиент.
в нашей системе любой клиент — счёт, но не любой счёт — клиент
Счёт фактуру может создавать кто угодно кому угодно.
конкретную сумму (валют в системе нет)
Это беда разгулявшейся фантазии.
Счёт-фактура выставляется продавцом покупателю. Wiki.
Смысл паттерна как, раз таки в том что программисту без разницы сколько валют в системе. Деньги это никогда не просто количество, это именно количество в определенной валюте. То что она в системе одна и используется по умолчанию никак этого не отменяет.
Я привел абстрактный пример. Вы сделали из него выводы относительно вашей системы.
Я в примере показал только то что именовать аргументы в соответствии с именами их классов, имхо, масло-масленное и дурной тон.
function createInvoice(Account $customer, $amount)
{
$user = $customer->getUser();
Mailer::create()->send($customerUser->getEmail(), 'You have new incoming invoice.');
}
{
$user = $account->getUser();
Mailer::create()->send($user->getEmail(), 'You have new incoming invoice.');
}
А вы говорите, что счёт выставляется клиенту.
Вы в ответ на мой пример привели свой, уточнив, что в моём примере непонятно, что это за аккаунт.
Именовать аргументы классом — это хорошая практика
Прочитать по ссылке вы не удосужились видимо:
Счёт-фактура выставляется (направляется) продавцом (подрядчиком, исполнителем) покупателю (заказчику) после окончательного приема покупателем (заказчиком) товара или услуг. © Wikipedia.
А customer это как подсказывает Google Translate клиент, заказчик, покупатель.
Не понятно аккаунт от которого выставляется счет фактура, аккаунт которому, или может это вообще корреспондент через которого?
interface InvoiceInterface
{
public function createInvoice(Account $account, $amount);
}
class InvoiceToUser implements InvoiceInterface
{
public function createInvoice(Account $account, $amount)
{
...
}
}
class InvoiceFromVendor implements InvoiceInterface
{
public function createInvoice(Account $account, $amount)
{
...
}
}
function createInvoice(Account $issuer, Account $billTo, $amount)
public function createInvoice(Account $payeeAccount, Account $receiverAccount, Currency $currency, $amount)
{
...
}
tbl_objavleniatbl_users
varchar(100)
Ущербно-ориентированное программирование