yashaka

Untitled

Jan 29th, 2017
169
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.78 KB | None | 0 0
  1. ***
  2.  
  3. @Test
  4. public void testDelete() {
  5. givenAtCompleted(COMPLETED,"1", "2");
  6. filterCompleted();
  7. delete("2");
  8. assertVisibleTasksAre("1");
  9. assertItemsLeft(0);
  10. }
  11.  
  12. возможно здесь бы я "более сложный случай семулировал", типа когда на комплитед не только комплитед, но и ектив таски есть, просто их не видно...
  13.  
  14. ну то такое уже... мелочи... и субьективно... зависит от того в чем мы именно заинтересованы на проекте...
  15.  
  16. ***
  17.  
  18. такс, теперь по твоим гивенам)
  19.  
  20. @Step
  21. public void givenAtActive(TaskType taskType, String... taskTexts) {
  22. given(taskType, taskTexts);
  23. filterActive();
  24. }
  25.  
  26.  
  27. @Step
  28. public void givenAtCompleted(TaskType taskType, String... taskTexts) {
  29. given(taskType, taskTexts);
  30. filterCompleted();
  31. }
  32.  
  33. вот здесь поскольку идея гивенов - быть быстрыми, и использовать разные трюки вместо реальных юай действий,
  34. то вместо filterActive
  35. можно напрямую грузить нужный урл, обрати внимание что там есть свои урлы для каждого из фильтра... они заканчиваются на что то типа #/completed
  36.  
  37. оно по факту именно в нашем случае сильно на скорость не повлияет, но типа будет более "Феншуйно"... мы ведь в прекондишенах не тестируем переходы по фильтрам через реальные элементы юайа...
  38.  
  39. ***
  40. а так то в общем получилось неплохо, это примерно то что мы от тебя ожидали "для первого этапа"
  41.  
  42. но это была разминка:) Что бы помучать тебя и заставить пописать более сложный код со всеми этими форами и так далее...
  43.  
  44. Теперь же мы напишем более лаконичный и структурный код, использовав некоторые уже имеющиеся в джаве методы, и использовав более ООП стиль.
  45.  
  46. Смотри.
  47.  
  48. public class Task {
  49. String taskText;
  50. TaskType taskType;
  51.  
  52. public Task(TaskType taskType, String taskText) {
  53. this.taskText = taskText;
  54. this.taskType = taskType;
  55. }
  56. }
  57.  
  58. @Step
  59. public String prepareGivenCommand(Task... tasks) {
  60. String results = "localStorage.setItem('todos-troopjs', '[";
  61. for ( Task task : tasks) {
  62. results = results +
  63. "{\"completed\":" + (task.taskType == TaskType.COMPLETED) + ",\"title\":\"" + task.taskText + "\"}, "; // вот эта часть кода по сути ведь описывает нашу задачу - просто "в ее текстовом представлении"...
  64.  
  65. Отсюда вопрос: почему тогда вещь которая касается описания задачи живет за границами класса задачи Task который как бы и существует для того что бы описывать все аспекты задачи?
  66.  
  67. тем более у обьектов обычно есть даже специальный метод - toString - целью которого и есть возвращать "текстовое представление обьекта"
  68.  
  69. Это тебе одна наводка ;)
  70.  
  71. а вот вторая: кроме вот этой части текстовой которая описывает задачу, у тебя в алгоритме присутствует код "склейки текстовых представлений задач" с помощью запятых, и "обрамления" их в квадратные скобки...
  72.  
  73. так вот... в джаве есть уже метод который делает это же, вот он: Arrays.toString(...)
  74.  
  75. ты просто ему передаешь масив обьектов, и он сам их трансполирует в строки, склеит их с помощью запятых, и в начале и в конце добавит квадрытные скобки ;)
  76.  
  77. ***
  78. и еще одна идея, которую тебе реализовывать не обязательно...
  79. но мне например она нравиться:)
  80.  
  81. у тебя вот такой стиль:
  82.  
  83. givenAtCompleted(COMPLETED,"1", "2");
  84.  
  85. он вполне норм)
  86.  
  87. но мне больше нравиться так:
  88.  
  89. givenCompleted("1", "2");
  90. givenAtComplitedFilter();
  91.  
  92. хотя получилось две строки вместо одной... но зато "параметров на одну строку" стало меньше ...
  93. и получается код "более простой для понимания", хотя и менее лаконичный...
  94. а помнишь ведь правило: "лаконичность для ридабилити"...
  95. типа всегда стремимся писать код полаконичней но только до тех пор пока не ухудшается читабельность...
  96.  
  97. правда поскольку читабельность это вещь субьективная - то и я тебя не буду заставлять переписывать в таком стиле...
  98.  
  99. но... если перепишешь таки, то получишь приятный бонус:) - сама реализация гивенов станет проще.
  100.  
  101. Во первых тебе уже не нужен будет твой енум.
  102.  
  103. Во вторых реализация логики текстового представления задач станет проще...
  104.  
  105. вместо (task.taskType == TaskType.COMPLETED)
  106.  
  107. вот здесь "{\"completed\":" + (task.taskType == TaskType.COMPLETED) + ",\"title\":\"" + task.taskText + "\"}"
  108.  
  109. ты сможешь просто писать task.taskType если сделаешь этот taskType типа boolean
  110. ну и конечно тогда стоит его переименовать на isCompleted
  111.  
  112. а для того что бы вот этот синтаксис:
  113.  
  114. given(new Task(ACTIVE, "1"),new Task(COMPLETED, "2"));
  115.  
  116. не стал при этом таким вот уродским:
  117.  
  118. given(new Task(false, "1"),new Task(true, "2"));
  119.  
  120. достаточно добавить - либо статические методы active и комплитед которые скроют этот "false/true" ужос:
  121.  
  122. given(Task.active("1"), Task.completed("2"));
  123.  
  124. либо добавить дополнительные классы типа:
  125.  
  126. class ActiveTask extends Task {
  127.  
  128. public ActiveTask(String text) {
  129. super(false, text)
  130. }
  131. }
  132.  
  133. что бы потом писать:
  134.  
  135. given(new ActiveTask("1"),new CompletedTask("2"));
  136.  
  137. что в принципе тоже неплохо выглядит :)
  138. Такие дела ;)
  139.  
  140. Все это делать конечно не сильно обязательно... Но это сделает твой код проще, чище, и более структурирование. Ну и научит тебя более обьектно ориентированному стилю... Который более популярный среди разработчиков.
  141.  
  142. P.S.
  143. кстати... мы пока что не все делали обьектно ориентировано... мы даже до пейджобджектов еще не дошли... Но это уже вот вот начнется...
  144.  
  145. но так, на вырост...
  146. Вот этот код:
  147.  
  148. givenCompleted("1", "2");
  149. givenAtComplitedFilter();
  150.  
  151. в скором будущем, если сильно захочется, можно будет писать и в таком стиле:
  152.  
  153. given.completedTasks("1", "2").atCompletedFilter()
  154.  
  155. что тоже проще чем givenAtCompleted(COMPLETED,"1", "2");
  156. именно изза того, что мы "разбили длинную цепочку параметров" на меньшие куски...
  157.  
  158. обычно "по чуть чуть" - проще чем "все сразу", даже пускай "все сразу" кажется "быстрей"...
Advertisement
Add Comment
Please, Sign In to add comment