Задать вопрос
@iordania

Оцените качество кода?

Решил на codewars задачку и в топе решение которое изначально отличается по концепции от заданного условия.
Задание: Создайте функцию, которая возвращает имя победителя в бою между двумя бойцами.
Каждый боец ​​по очереди атакует другого, и тот, кто убьет другого первым, побеждает. Смерть определяется как наличие здоровья <= 0.

Моё решение:
function declareWinner(fighter1, fighter2, firstAttacker) {
  if (fighter1.name === firstAttacker) {
    return fighter1.attack(fighter2);
  } else {
    return fighter2.attack(fighter1);
  }
}

function Fighter(name, health, damagePerAttack) {
  this.name = name;
  this.health = health;
  this.damagePerAttack = damagePerAttack;
  this.toString = function () {
    return this.name;
  };
}

Fighter.prototype.attack = function (fighter) {
  fighter.health -= this.damagePerAttack;
  if (fighter.health <= 0) {
    return this.toString();
  }
  return fighter.attack(this);
};

declareWinner(
  new Fighter("Jerry", 30, 3),
  new Fighter("Harald", 20, 5),
  "Harald"
);


Решение из топа:
function declareWinner(fighter1, fighter2, firstAttacker) {
  var fac1 = Math.ceil( fighter1.health / fighter2.damagePerAttack );
  var fac2 = Math.ceil( fighter2.health / fighter1.damagePerAttack );
  if(fac1 < fac2) {
    return fighter2.name;
  } else if(fac2 < fac1) {
    return fighter1.name;
  } else {
    return firstAttacker;
  }
}


Прошу оценить качество кода моего решения в сравнении с решением из топа!
Задачка: codewars
P.S. Понимаю что вариант из топа чище, но с точки зрения ооп кажется что нет!
  • Вопрос задан
  • 673 просмотра
Подписаться 3 Простой 1 комментарий
Решения вопроса 2
rpsv
@rpsv
делай либо хорошо, либо никак
А какой ответ хотите? Второе решение это функция которая на вход получает объекты. С точки зрения ООП - все ок, какой по вашему принцип нарушается? То что у вас функция внутри объекта это не значит что это ооп, и также наоборот отсутствия логики внутри объекта не говорит о том что это НЕ ооп.

В вашем коде метод attack ведет себя как раз не совсем адекватно, т.к. либо возвращает имя, либо рекурсивно отправляется атаковать оппонента (то есть нарушается принцип единой ответственности: по хорошему он должен возвращать HP, а declareWinner уже вызывать методы attack или возвращать имя в зависимости от размера HP)
Ответ написан
@WaterSmith
Android-разработчик. Java, Kotlin
Ну, на мой взгляд, с точки зрения ООП и масштабируемости, ваше решение правильнее (хотя не идеально), решение "из топа", прогнозирует победителя, исходя из характеристик здоровья и урона. Но, это будет работать лишь до тех пор, пока не изменятся условия боя, если добавить например блоки, криты, промахи, то решение из топа нужно будет тупо выбросить и переписать. А в вашем решении изменить только функцию attack.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
Rocket Смоленск
от 80 000 до 130 000 ₽
div. Ставрополь
от 40 000 до 90 000 ₽
Wanted. Санкт-Петербург
До 220 000 ₽
18 дек. 2024, в 14:53
30000 руб./за проект
18 дек. 2024, в 14:45
25000 руб./за проект
18 дек. 2024, в 14:43
25000 руб./за проект