Refactoring Code#38
Conversation
Styled the code for standards. Changed script names. Changed the content of the scripts.
Add RequireComponents in scripts
|
|
||
| private void OnMove(Vector2 move) | ||
| { | ||
| transform.position += new Vector3(move.x*_speed, move.y*_speed, 0) * Time.deltaTime; |
There was a problem hiding this comment.
Вынеси умножение на _speed из консруктора
| [RequireComponent(typeof(BoxCollider2D))] | ||
| public class Enemy : MonoBehaviour | ||
| { | ||
| public UnityAction<Enemy> DeadEnemy; |
There was a problem hiding this comment.
| public class Enemy : MonoBehaviour | ||
| { | ||
| public UnityAction<Enemy> DeadEnemy; | ||
| [SerializeField] private int _radiusNewPosition; |
There was a problem hiding this comment.
_radius
и может всё-таки float?
| public UnityAction<Enemy> DeadEnemy; | ||
| [SerializeField] private int _radiusNewPosition; | ||
| [SerializeField] private float _speed; | ||
| private Vector2 _targetPosition; |
| } | ||
| } | ||
|
|
||
| private void SetNewTransformPosition() |
There was a problem hiding this comment.
Set неудачный глагол. Почитай про CQRS и что означает Set в этой терминологии
| { | ||
| public UnityAction StopGame; | ||
| [SerializeField] private Enemy _enemy; | ||
| [SerializeField] private int _enemyCount; |
| public UnityAction StopGame; | ||
| [SerializeField] private Enemy _enemy; | ||
| [SerializeField] private int _enemyCount; | ||
| [SerializeField] private float _spawmRaius; |
|
|
||
| public class EnemySpawner : MonoBehaviour | ||
| { | ||
| public UnityAction StopGame; |
There was a problem hiding this comment.
Как спавнер может знать остановить игру или нет? Это не его ответственность. Т.е название во-первых неправильное со смысловой точки зрения а во-вторых вне нашего стиля
There was a problem hiding this comment.
Спаунер должен только спаунить? А отслеживать смерти должен другой объект?
| var enemy = Instantiate(_enemy, enemyPosition, Quaternion.identity,transform); | ||
| enemy.GetComponent<Enemy>().DeadEnemy += OnEnemyDie; | ||
| } |
| if (_enemyCount == 0) | ||
| { | ||
| StopGame?.Invoke(); | ||
| } |
| [SerializeField] private float _time; | ||
| protected override void TakeDamage(PlayerMove playerMove) |
| [SerializeField] private float _time; | ||
| protected override void TakeDamage(PlayerMove playerMove) |
There was a problem hiding this comment.
Приём тут TakeDamage?
Согласен. Некорректное название. Удалил.
| using System.Collections.Generic; | ||
| using UnityEngine; | ||
|
|
||
| public class Booster : Enemy |
There was a problem hiding this comment.
Booster это не враг
Разделил их на 2 отдельного класса. Для того что бы не было дубля кода - вынес схему движения и поиск точки движения в отдельный скрипт.
| [SerializeField] private float _time; | ||
| protected override void TakeDamage(PlayerMove playerMove) | ||
| { | ||
| playerMove.BoostSpeed(_time); |
|
|
||
| public class DefaultEnemy : Enemy | ||
| { | ||
| protected override void TakeDamage(PlayerMove playerMove) { } |
There was a problem hiding this comment.
А это зачем?
Убрал. Этот метод наследовался от родительного класса. Поэтому нужно его было реализовать.
| [SerializeField] private float _radius; | ||
| [SerializeField] private float _speed; | ||
| private Vector2 _target; | ||
| public event UnityAction<Enemy> Dieing; |
There was a problem hiding this comment.
There was a problem hiding this comment.
Понял, если я не имею в виду машину которая служит для резки бумаги, то используем Dying.
| [SerializeField] private List<Enemy> _enemies; | ||
| [SerializeField] private int _enemiesCount; | ||
| [SerializeField] private float _spawnRaius; | ||
| public UnityAction AllEnemiesDied; |
There was a problem hiding this comment.
Событие от полей следует отделить пустой строкой
| private void Start() | ||
| { | ||
| for (int i = 0; i < _enemiesCount; i++) | ||
| { | ||
| Vector2 enemyPosition = Random.insideUnitCircle * _spawnRaius; | ||
| var enemy = Instantiate(_enemies[Random.Range(0,_enemies.Count)], enemyPosition, Quaternion.identity,transform); | ||
| enemy.Dieing += OnEnemyDie; | ||
| } | ||
| } |
There was a problem hiding this comment.
Не надо спавнер выдумывать, его небыло изначально
There was a problem hiding this comment.
Не надо спавнер выдумывать, его небыло изначально
Удалил. Хотел немного привнести свое так сказать)
| { | ||
| if (collision.TryGetComponent(out PlayerMove playerMove)) | ||
| { | ||
| playerMove.BoostSpeed(_time); |
| } | ||
| } | ||
|
|
||
| private void ChangeTarget() |
There was a problem hiding this comment.
Change слишком общий глагол и может создать путаницу: меняется наша цель или мы вносим изменение в объект цели?
Можно прибегнуть к лайф-хаку: "Как скажем при разговоре так и напишем". При обсуждение этого функционала с заказчиком или внутри команды, как бы ты сказал что делает противник?
Например: "Противник выбирает следующую цель" и тогда мы получим метод PickTarget
Например: "Противник ищет следующую цель" и тогда мы получим метод FindTarget
Если ты говоришь "Противник меняет цель" то это ок в разговорной речи но прямой перенос в название будет не ок.
Стоит ли раскрывать детали?
Например: NextRandomTarget, PickRandomTarget
Учитывая приватность метода детали раскрыть можно, но учти что уточняя метод в название мы ограничиваем его.
ChangeTarget настолько общий, что там может происходить что угодно. Это очень абстрактный метод, Change буквально значит любое изменение связанное с целями. Если бы метод назывался просто Change означало, что поменяться может всё что угодно. И это можно и нужно делать в определённых ситуациях, но не здесь.
Например PickRandomTarget сразу берёт несколько обязательств на себя:
- Он поменяет состояние объекта (глагол Pick)
- Он утилитарный и его основная задача это стратегия выбора (Random)
- Это всё произойдёт с сущностью "цель" (Target)
Я бы был удивлён если бы этот метод делал например включение эффектов или какие-нибудь другие вещи.
Это такое бюджетное ООП. В каком-то идеальном мире это было бы так:
class EnemyMovement {
Targets _targets;
SurfaceAgent _agent;
Update()
{
if(_agent.MoveTo(_targets.Current))
_targets.Next();
}
}
Если убрать объекты то получится типа такого:
Next() или NextTarget() #
There was a problem hiding this comment.
Change слишком общий глагол и может создать путаницу: меняется наша цель или мы вносим изменение в объект цели?
Можно прибегнуть к лайф-хаку: "Как скажем при разговоре так и напишем". При обсуждение этого функционала с заказчиком или внутри команды, как бы ты сказал что делает противник?
Например: "Противник выбирает следующую цель" и тогда мы получим метод PickTarget
Например: "Противник ищет следующую цель" и тогда мы получим метод FindTargetЕсли ты говоришь "Противник меняет цель" то это ок в разговорной речи но прямой перенос в название будет не ок.
Стоит ли раскрывать детали?
Например: NextRandomTarget, PickRandomTarget
Учитывая приватность метода детали раскрыть можно, но учти что уточняя метод в название мы ограничиваем его.
ChangeTarget настолько общий, что там может происходить что угодно. Это очень абстрактный метод, Change буквально значит любое изменение связанное с целями. Если бы метод назывался просто Change означало, что поменяться может всё что угодно. И это можно и нужно делать в определённых ситуациях, но не здесь.
Например PickRandomTarget сразу берёт несколько обязательств на себя:
- Он поменяет состояние объекта (глагол Pick)
- Он утилитарный и его основная задача это стратегия выбора (Random)
- Это всё произойдёт с сущностью "цель" (Target)
Я бы был удивлён если бы этот метод делал например включение эффектов или какие-нибудь другие вещи.
Это такое бюджетное ООП. В каком-то идеальном мире это было бы так:
class EnemyMovement { Targets _targets; SurfaceAgent _agent; Update() { if(_agent.MoveTo(_targets.Current)) _targets.Next(); } }Если убрать объекты то получится типа такого:
Next() или NextTarget() #
Change слишком общий глагол и может создать путаницу: меняется наша цель или мы вносим изменение в объект цели?
Можно прибегнуть к лайф-хаку: "Как скажем при разговоре так и напишем". При обсуждение этого функционала с заказчиком или внутри команды, как бы ты сказал что делает противник?
Например: "Противник выбирает следующую цель" и тогда мы получим метод PickTarget
Например: "Противник ищет следующую цель" и тогда мы получим метод FindTargetЕсли ты говоришь "Противник меняет цель" то это ок в разговорной речи но прямой перенос в название будет не ок.
Стоит ли раскрывать детали?
Например: NextRandomTarget, PickRandomTarget
Учитывая приватность метода детали раскрыть можно, но учти что уточняя метод в название мы ограничиваем его.
ChangeTarget настолько общий, что там может происходить что угодно. Это очень абстрактный метод, Change буквально значит любое изменение связанное с целями. Если бы метод назывался просто Change означало, что поменяться может всё что угодно. И это можно и нужно делать в определённых ситуациях, но не здесь.
Например PickRandomTarget сразу берёт несколько обязательств на себя:
- Он поменяет состояние объекта (глагол Pick)
- Он утилитарный и его основная задача это стратегия выбора (Random)
- Это всё произойдёт с сущностью "цель" (Target)
Я бы был удивлён если бы этот метод делал например включение эффектов или какие-нибудь другие вещи.
Это такое бюджетное ООП. В каком-то идеальном мире это было бы так:
class EnemyMovement { Targets _targets; SurfaceAgent _agent; Update() { if(_agent.MoveTo(_targets.Current)) _targets.Next(); } }Если убрать объекты то получится типа такого:
Next() или NextTarget() #
Спасибо. На основании вышеизложенного решил переименовать метод на ChooseRandomDestinationPoint()
| AddEnemiesInWatchList(); | ||
| } | ||
|
|
||
| private void AddEnemiesInWatchList() |
There was a problem hiding this comment.
Можно это назвать не наблюдаемым списком а "Живыми Противниками"
There was a problem hiding this comment.
Можно это назвать не наблюдаемым списком а "Живыми Противниками"
Изменил название на AddAliveEnemies
| if (_enemies.Count == 0) | ||
| { | ||
| AllEnemiesDied(); | ||
| } |
There was a problem hiding this comment.
Это конечно же не в методе отписки должно быть
There was a problem hiding this comment.
Это конечно же не в методе отписки должно быть
Перенес в отдельный метод CheckAliveEnemies
| } | ||
| } | ||
|
|
||
| private void AllEnemiesDied() |
| AddAliveEnemies(); | ||
| } | ||
|
|
||
| private void AddAliveEnemies() |
There was a problem hiding this comment.
Add логично намекает, что данные должны прийти в параметр.
Здесь скорей как раз-таки FindEnemies
Styled the code for standards. Changed script names. Changed the content of the scripts.