Должен ли я вызывать все методы из одного основного метода или вызывать следующий метод в конце текущего? - PullRequest
0 голосов
/ 10 октября 2019

Если я вызываю метод makeDinner(), и у этого метода есть подметоды prepareTomatoes() и prepareMeat(), я должен

а) вызвать их обоих из makeDinner() или

б)вызовите prepareTomatoes() и в конце этого метода вызовите prepareMeat()?

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

edit: Это был плохой пример, на самом деле, как я вижу, он очень ситуативный. Мой конкретный случай состоял в том, что я должен был выполнить 3 задачи - нарисовать планку здоровья в соответствии со здоровьем, позвонить died(), если health == 0.0f, и, наконец, нарисовать планку здоровья. Я разбил его на 3 метода - я назвал drawHealthBar() - внутри этого метода, который я назвал paintHealthBar() - и внутри этого метода я вызываю died() (если, конечно, health == 0.0f).

ТеперьВы можете ожидать, что если вы позвоните drawHealthBar(), метод также проверяет состояние и отображает полосу состояния определенным цветом. Но я боюсь, что если я собираюсь позвонить по номеру died() из paintHealthBar(), это может смутить кого-то другого, смотрящего на код, или даже меня через 6 месяцев.

Это может быть намного сложнее, чем это, но даже в этом «простом» случае я не знаю, должен ли я вызывать paintHealthBar(), затем drawHealthBar(), затем checkDeath() все из «основного» метода, или, если это правильно, назвать это так, как я это сделалэто (по убыванию), или если вызов draw() и внутри этого метода paint() в порядке, но я должен вызвать checkDeath() из основного метода?

Ответы [ 2 ]

2 голосов
/ 10 октября 2019

Как правило, вы хотите, чтобы в вашем коде была хорошая читабельность, так что это действительно сложный вопрос. В вашем конкретном примере мое личное мнение было бы иметь методы prepareTomatoes и prepareMeat ВНУТРИ метода makeDinner.

Тем не менее, это очень обобщенно, потому что, если вам нужно приготовить мясо во время приготовления помидоров? Это зависит от того, будете ли вы ВСЕГДА готовить мясо во время приготовления помидоров и так далее ... Это действительно ситуативно.

На самом деле не существует правила, говорящего вам делать то или это. Вы обычно чувствуете это. Как правило, вы хотите, чтобы ваши методы были максимально точными, чтобы вы могли разделить свои makeTomatoes на «cutTomatoes», «cleanTomatoes», «cookTomatoes», ...

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

0 голосов
/ 11 ноября 2019

Закон Деметры гласит, что вам не следует разговаривать с незнакомцами, это означает, что следует избегать цепного вызова, например car.getEngine().turnOn(), и carg.turnOn() предпочтительнее. Теперь предположим, что у вас есть бизнес-логика, позволяющая включать двигатель, когда в автомобиле нет топлива, и выдавать предупреждение водителю:

if (car.hasFuel()){
  car.getEngine().turnOn();
}else{
  car.alertDriver();
}

Желательно, чтобы эта логика была заключена в cart.turnOn() метод, а не снаружи автомобиля. Вы можете лучше создать юнит-тест и избежать ошибки при включении автомобиля без проверки бизнес-правил. Упростите вызовы методов улучшите читабельность вашего кода.

...