Какой класс должен зависеть от какого класса в зависимости от уровня важности

У меня есть общий вопрос, касающийся ООД, ООП и моделирования, и я не знаю, как его задать. Самый простой способ с примером. Я вообще использую 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);

Может быть, все варианты одинаково жизнеспособны?

3

Решение

более вероятно

$withdrawal = $account->withdraw(50, 'USD');
$withdrawal->completeTransaction();

или же

$transfer = $account->transfer(50, 'USD', $transferToAccount);
$transfer->completeTransaction();

действия учетной записи должны приводить к транзакциям. транзакции должны знать, как сохранить себя, или выполнить откат, если все обновления не были успешными

2

Другие решения

для меня в ООП ключевым моментом является ясность.
Я бы сделал это так

$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();

Я знаю, что это долго, но такой подход поможет вам следовать принципу «единой ответственности»

2

По вопросам рекламы [email protected]