|
|
|
Как отрефакторить?
|
|||
|---|---|---|---|
|
#18+
Есть такой тест на знание ООП, называется Iffy Tractor. Задача в том, что есть некая компьютерная игра, управляющая трактором через команды-строки, и надо это дело отрефакторить так, чтобы заложить максимальную гибкость для дальнейшего развития. Вот код класса который надо отрефакторить: http://pastebin.com/s3ABaBqh. Идея взята отсюда: http://www.benstopford.com/2011/05/11/the-iffy-tractor-can-they-code-oo/ В будущем возможны модификации: 1. разные типы юнитов 2. другие типы действий, зависящие от типа юнита 3. логгирование всех действий юнитов Как бы вы это сделали? Если лень писать - а ведь это пятница - то вот мое решение, просьба его злостно обличить. ----- Очевидная вещь - избавиться от if-blocks с направлениями через вектора. Это понятно. Далее: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Landscape инжектится в Land. Как реализовать транляцию строки-команды в действие Трактора внутри `GameOperator`? 1. Простой if-block который, поняв что за команда, рассчитывает позицию Трактора и ставит его в Land через via `setPosition(..)`. 2. Сделать интерфейс Action для единичного действия. Делать новый объект для каждой команды, или "штамповать" объекты из пула нужными параметрами. Все равно if-block. Пример: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Ваше авторитетное мнение! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2014, 14:16 |
|
||
|
Как отрефакторить?
|
|||
|---|---|---|---|
|
#18+
Даже живой дядя Вася тракторист не будет залогом того Dymytry, чтобы заложить максимальную гибкость для дальнейшего развития. А уж любая программа будет ему сливать в разы. Сформулируйте критерии гибкости и пороги пожалуйста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2014, 14:30 |
|
||
|
Как отрефакторить?
|
|||
|---|---|---|---|
|
#18+
Код: java 1. шозабред ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2014, 15:09 |
|
||
|
Как отрефакторить?
|
|||
|---|---|---|---|
|
#18+
Рефакторинг обычно подразумевает неизменность API, так что решить полноценно эту задачу нельзя. Если API сохранять неизменным, то получится вот что: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2014, 15:33 |
|
||
|
Как отрефакторить?
|
|||
|---|---|---|---|
|
#18+
scf, Команды тоже надо рефакторить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2014, 15:39 |
|
||
|
Как отрефакторить?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, В рамках текущего API и текущего набора команд нет смысла... разве что == на equals заменить :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2014, 15:42 |
|
||
|
Как отрефакторить?
|
|||
|---|---|---|---|
|
#18+
Dymytry, Когда реализуешь все свои идеи, посмотри на результат. Сравни количество букв. Пойми, какой код будет проще понять и расширить - твой или исходный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2014, 15:45 |
|
||
|
Как отрефакторить?
|
|||
|---|---|---|---|
|
#18+
scfBlazkowicz, В рамках текущего API и текущего набора команд нет смысла... разве что == на equals заменить :-) В рамках текущего кода вообще рефакторить нет смысла. Задача на будущее расширение во всех смыслах. В том числи и команд. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2014, 15:46 |
|
||
|
Как отрефакторить?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, В таких случаях я обычно предлагаю отложить рефакторинг до момента, когда *действительно* появится необходимость что-то менять :) Текущую реализацию можно обвинять в чем угодно, но точно не в излишней сложности. К тому же, в исходном задании есть юнит-тест на этот API, так что аккуратно надо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2014, 15:50 |
|
||
|
Как отрефакторить?
|
|||
|---|---|---|---|
|
#18+
scf, считаем что указанные выше модификации авторВ будущем возможны модификации: 1. разные типы юнитов 2. другие типы действий, зависящие от типа юнита 3. логгирование всех действий юнитов - уже дописываются аналитиками :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2014, 15:54 |
|
||
|
Как отрефакторить?
|
|||
|---|---|---|---|
|
#18+
Тут какой вопрос главный. 1) можно передвигать юниты снаружи. Так как сделал я, можно через land.moveUnitForward(unit). Юниты двигает сам Land или некий оператор. Тут слабая связанность, и поэтому такой подход мне больше нравится, хотя моя реализация плохая. 2) можно передвигать юниты изнутри. То есть через unit.moveForward(..). Однако получаем большую связанность между объектами: юниту надо провайдить например рельеф, может другие юниты.. непонятно как это красиво написать. Есть вещи, от которых зависит ход юнита, но которых в нем быть не должно - ямы на земле, погода, соседние юниты.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2014, 16:20 |
|
||
|
Как отрефакторить?
|
|||
|---|---|---|---|
|
#18+
ИМХО. Исходная прикладная задача - это тот редкий и классический случай, когда парадигма ООП не очень хороша для всей задачи целиком, но извернуться и сделать можно, в том числе, используя и ООП для части задачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2014, 17:18 |
|
||
|
Как отрефакторить?
|
|||
|---|---|---|---|
|
#18+
pirovindosИМХО. Исходная прикладная задача - это тот редкий и классический случай, когда парадигма ООП не очень хороша для всей задачи целиком, но извернуться и сделать можно, в том числе, используя и ООП для части задачи. ИМХО, ерунда. Во-первых, случай не редкий. Конечно, через Scala всё было бы проще и красивее. Во-вторых даже парадигма ООП здесь вполне подходит. Задача - показать и научить реализовывать очень распространенный прием рефакторинга, который знают, к сожалению, далеко не все. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2014, 17:21 |
|
||
|
Как отрефакторить?
|
|||
|---|---|---|---|
|
#18+
Можно через Visitor Pattern. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Это удобно. Однако придется писать для каждой action реализации методов для всех типов Unit. Что конечно печально. Либо наоборот - для каждого Unit все типы Action. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2014, 19:59 |
|
||
|
Как отрефакторить?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, а что за приём? очень хотелось бы узнать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2014, 20:04 |
|
||
|
Как отрефакторить?
|
|||
|---|---|---|---|
|
#18+
DDiverBlazkowicz, а что за приём? очень хотелось бы узнать По ссылке из вопроса: "Replace Conditional with Polymorphism" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2014, 21:27 |
|
||
|
Как отрефакторить?
|
|||
|---|---|---|---|
|
#18+
Если уж говорить прямо, то каждое решение, использующее типовые приемы ООП и всяких рефакторингов из Мартинов Фаулеров, вообще не масштабируется в игровой предметной области т.к. они плохо справляются с высокой сложностью связей и количествами типов взаимодействий между игровыми объектами. Если интересно как эта проблема будет решаться в настоящей игре, гуглите Game Component Hierarchy. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2014, 23:19 |
|
||
|
Как отрефакторить?
|
|||
|---|---|---|---|
|
#18+
schwa, Вот +1. Выскажу два соображения: - чем сложнее объектная модель, тем прочнее она прибита гвоздями к тому, как ее задумывал использовать проектировщик. - было дело, я ковырял исходники крупной браузерной MMORPG. Там рулит подход "данные отдельно, алгоритмы обработки данных отдельно". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.09.2014, 11:24 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38745312&tid=2126604]: |
0ms |
get settings: |
7ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
56ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
| others: | 205ms |
| total: | 352ms |

| 0 / 0 |
