У меня есть общий вопрос, касающийся ООД, ООП и моделирования, и я не знаю, как его задать. Самый простой способ с примером. Я вообще использую PHP, но это может быть на любом другом языке. Допустим, я являюсь банком и хочу создать программу, которая обрабатывает снятие средств. Так что я буду делать вывод 2 класса и аккаунт. Теперь, что лучше иметь функцию, которая делает вывод.
Я имею в виду:
$account = getAccountById(1); //account->balance = 200.00
$withdrawal = new Withdrawal(50,'USD');
$withdrawal->setAccount($account); // $withdrawal->account_id=1
$withdrawal->make(); //SQL changes account where id=1 and set balance to 150
//Also save a row in withdrawal tables with withdraw details
или же
$account = getAccountById(1); //account->balance = 200.00
$withdrawal = new Withdrawal(50,'USD');
$account->processesWithdraw($withdrawal); //SQL changes account where id=1 and set balance to 150
//Also save a row in withdrawal tables with withdraw
//$withdrawal->account_id=1
Одно известно, что аккаунт более «важен», чем вывод средств и может «жить» без него. Также могут быть депозиты или другие действия.
Вероятно, есть много других способов сделать это действие. Какой путь вы считаете лучшим?
Я постараюсь привести более простой пример веб-сайта университета, который должен позволить студенту записаться на курс.
Итак, когда пользователь нажмет на кнопку регистрации, что вы выберете? Это:
$student = new Student('John Smith');
$course = new Course('Math');
$student->enrollToCourse($course);
Или это:
$student = new Student('John Smith');
$course = new Course('Math');
$course->addStudent($student);
Или, может быть, третий вариант:
$student = new Student('John Smith');
$course = new Course('Math');
EnrollmentService::enrollStudentToCourse($student,$course);
Может быть, все варианты одинаково жизнеспособны?
более вероятно
$withdrawal = $account->withdraw(50, 'USD');
$withdrawal->completeTransaction();
или же
$transfer = $account->transfer(50, 'USD', $transferToAccount);
$transfer->completeTransaction();
действия учетной записи должны приводить к транзакциям. транзакции должны знать, как сохранить себя, или выполнить откат, если все обновления не были успешными
для меня в ООП ключевым моментом является ясность.
Я бы сделал это так
$account = new Account(1);
$withdrawal = new Withdrawal($account, 50,'USD');
$withdrawal -> makeTransaction();
или же
$account = new Account(1);
$withdrawal = new Withdrawal($account);
$withdrawal ->setAmmount(50);
$withdrawal ->setCurrency('USD');
$withdrawal -> makeTransaction();
Я знаю, что это долго, но такой подход поможет вам следовать принципу «единой ответственности»