|
|
|
Тест по Java на собеседовании
|
|||
|---|---|---|---|
|
#18+
Недавно приятель был на собеседовании в на вакансию java-разработчик. Ему там предложили за 15 минут оптимизировать код вот такой простенькой игры. Что смог он за 15 минут изменил, но тест не прошел. Я, если честно, с налета тоже ничего бы существенного не поменял. Вот выношу на суд сообщества. Интересно, чего они от него ждали. Код: 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. Код: 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. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2012, 12:50:24 |
|
||
|
Тест по Java на собеседовании
|
|||
|---|---|---|---|
|
#18+
За 15 минут у меня получился примерно следующий список замечаний: 1. Дублирование кода в roll(), там в if (penalty)-else ветках одинаковый кусок вроде. 2. В currentCategory() возможно удобнее было бы использовать Map. Похоже заполнить её можно алгоритмом, там смещение по 4. 3. В askQuestion() тоже можно использовать Map. 4. Дублирование кода в wasCorrectlyAnswered if-else ветках (3 места вроде). 5. Вынести весь penaltyBox handling в отдельный метод для повышения читаемости. 6. Радикальное изменение - применить ООП и сделать нормальный класс Player. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2012, 13:07:13 |
|
||
|
Тест по Java на собеседовании
|
|||
|---|---|---|---|
|
#18+
rrrrrrrr, автор2. В currentCategory() возможно удобнее было бы использовать Map. Похоже заполнить её можно алгоритмом, там смещение по 4. 3. В askQuestion() тоже можно использовать Map. Да, я бы там предложил switch-case, ну и стринговые константы заменить на константы из enum В wasCorrectlyAnswered() еще можно обойтись без локальной переменной winner. В отношении радикальных изменений, меня еще тянуло спроектировать игру нескольких игроков в виде параллельных потоков. НО за 15 минут, я могу это от силы увидеть и назвать, но никак не переписать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2012, 13:37:11 |
|
||
|
Тест по Java на собеседовании
|
|||
|---|---|---|---|
|
#18+
roll % 2 на roll & 1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2012, 15:01:01 |
|
||
|
Тест по Java на собеседовании
|
|||
|---|---|---|---|
|
#18+
Заменить LinkedList на ArrayDeque ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2012, 15:06:36 |
|
||
|
Тест по Java на собеседовании
|
|||
|---|---|---|---|
|
#18+
rus_sun, А сравнение if (currentCategory() == "Pop") теперь явой называется? С какой версии явы? Я-то знаю, что с пятой (тигр, по-моему). На четвёрке такое не сработало бы. Интересно, а задавальщики задачи об этом знают? Ну, а по сабжу - конечно переключатель. Однозначно. За 15 минут прекрасно сумеете переписать все ифы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2012, 15:48:32 |
|
||
|
Тест по Java на собеседовании
|
|||
|---|---|---|---|
|
#18+
rus_sun, А что значит оптимизировать, ваш приятель не уточнял? По мне так подобные вопросы на собеседовании могут выявить только телепатические способности соискателя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2012, 18:18:20 |
|
||
|
Тест по Java на собеседовании
|
|||
|---|---|---|---|
|
#18+
ShSergerus_sun, А сравнение if (currentCategory() == "Pop") теперь явой называется? С какой версии явы? Я-то знаю, что с пятой (тигр, по-моему). На четвёрке такое не сработало бы. Интересно, а задавальщики задачи об этом знают? Ну, а по сабжу - конечно переключатель. Однозначно. За 15 минут прекрасно сумеете переписать все ифы. ни с какой версии ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2012, 21:18:34 |
|
||
|
Тест по Java на собеседовании
|
|||
|---|---|---|---|
|
#18+
Michael PonomarevShSergerus_sun, А сравнение if (currentCategory() == "Pop") теперь явой называется? С какой версии явы? Я-то знаю, что с пятой (тигр, по-моему). На четвёрке такое не сработало бы. Интересно, а задавальщики задачи об этом знают? Ну, а по сабжу - конечно переключатель. Однозначно. За 15 минут прекрасно сумеете переписать все ифы. ни с какой версии Серьёзно что-ли? Я как-то написал программулину, признаюсь, с таким сравнением, по ошибке. Пятёрка съела, и вроде-как, вполне всё работало. А вот на четвёрке и ниже - фиг вам. Вот я и решил, что теперь так строки уже можно сравнивать, хотя сам так никогда не делаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2012, 10:04:10 |
|
||
|
Тест по Java на собеседовании
|
|||
|---|---|---|---|
|
#18+
Michael PonomarevShSergerus_sun, А сравнение if (currentCategory() == "Pop") теперь явой называется? С какой версии явы? Я-то знаю, что с пятой (тигр, по-моему). На четвёрке такое не сработало бы. Интересно, а задавальщики задачи об этом знают? Ну, а по сабжу - конечно переключатель. Однозначно. За 15 минут прекрасно сумеете переписать все ифы. ни с какой версии +1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2012, 10:12:59 |
|
||
|
Тест по Java на собеседовании
|
|||
|---|---|---|---|
|
#18+
Практически в первую же неделю изучения Java наткнулся на сравнение строк и навсегда запомнил, что в java строка это объект и сравнивать их нужно через .equals. И вроде бы в java так было всегда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2012, 11:12:57 |
|
||
|
Тест по Java на собеседовании
|
|||
|---|---|---|---|
|
#18+
ShSergeСерьёзно что-ли? Я как-то написал программулину, признаюсь, с таким сравнением, по ошибке. Пятёрка съела, и вроде-как, вполне всё работало. А вот на четвёрке и ниже - фиг вам. Вот я и решил, что теперь так строки уже можно сравнивать, хотя сам так никогда не делаю. Сработало за счет кеша строк ( ключевое слово intern ). Java пытается переиспользовать строки с одинаковым содержимым. Константы из кода могут совпасть, а вот считанное из фаила и заведенное в коде нет. По ходу текст надо не улучшать, а переписывать с нуля, дешевле будет. Данный класс весь один сплошной набор "антипаттернов" : - нарушение OOP подхода ( отдельные коллекции для свойств вмасто обьектов ) - нарушение принципа "single responsibility" - использование магических цифр/строк - нечитабельно - нет проверок на ошибки - copy/paste - не тестируемо В общем, исправление говнокода. Куда интереснее задача написать такой API для игры ( оригинал был с крестики нолики ) где попытка сделать неверный ход или получить результат от незавершенной игры вызывает ошибку компиляции... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2012, 11:15:49 |
|
||
|
Тест по Java на собеседовании
|
|||
|---|---|---|---|
|
#18+
public class GameRunner { private static boolean notAWinner; public static void main(String[] args) { Game aGame = new Game(); aGame.add("Chet"); aGame.add("Pat"); aGame.add("Sue"); Random rand = new Random(); do { aGame.roll(rand.nextInt(5) + 1); if (rand.nextInt(9) == 7) { notAWinner = aGame.wrongAnswer(); } else { notAWinner = aGame.wasCorrectlyAnswered(); } } while (notAWinner); } } 1) private static boolean notAWinner - may be a local public class Game {...} Все, что можно сделать private - сделать и добавить setter`ы, getter`ы Все, что можно сделать final - сделать и убрать setter`ы Все, что можно сделать static - сделать Все static переменные инициализировать static методами, пример: Код: java 1. 2. 3. 4. 5. Соответственно, вынести логику создания LinkedList из конструктора. Строковые переменные, вроде "Pop" - загнать в enum`ы и по всему коду заменить сравнения Первые поправки, абсолютно не вчитываясь в код класса и его логику ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2012, 15:26:10 |
|
||
|
Тест по Java на собеседовании
|
|||
|---|---|---|---|
|
#18+
+1 к тому что было уже сказано и новенькое метод isPlayable нигде не используется следовательно на фиг он нужен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2012, 16:36:18 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=37733494&tid=2132143]: |
0ms |
get settings: |
14ms |
get forum list: |
23ms |
check forum access: |
6ms |
check topic access: |
6ms |
track hit: |
58ms |
get topic data: |
16ms |
get forum data: |
4ms |
get page messages: |
87ms |
get tp. blocked users: |
3ms |
| others: | 327ms |
| total: | 544ms |

| 0 / 0 |
