julia_v_iluhina

Untitled

Nov 15th, 2016
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 8.12 KB | None | 0 0
  1. http://joxi.ru/MAj1YoWsvz8gJ2
  2.  
  3. /*
  4.     в именах пекеджей - все буквы должны быть маленькими
  5.     в прошлый раз писала - как это полечить
  6. */
  7. ***************************************
  8. public interface AbstractElement<V> {
  9.     V getWrappedEntity();
  10.     By getLocator();
  11.  
  12. }
  13. /*
  14.     для интерфейса - в имени - не нужно применять Abstract
  15.     это будет - для абстрактного класса
  16.  
  17.     пока рано говорить - что это - элемент или коллекция
  18.     это - сущность, причем ленивая )
  19.     LazyEntity - будет ок
  20.  
  21.     метода getLocator() - не нужно
  22.     мі обойдемся без него
  23.  
  24.     как использовать интерфейс + абстрактный класс + классы-потомки
  25.     http://stackoverflow.com/questions/1932247/abstract-classes-and-interfaces-best-practices-in-java
  26.     http://joxi.ru/E2pdR1lFB1pyM2
  27.  
  28.     дельно по неймингу
  29.     http://www.vertigrated.com/blog/2011/02/interface-and-class-naming-anti-patterns-java-naming-convention-tautologies/
  30.  
  31.     еще на эту же тему
  32.     http://stackoverflow.com/questions/2814805/java-interfaces-implementation-naming-convention
  33.     https://web.archive.org/web/20130331071928/http://isagoksu.com/2009/development/java/naming-the-java-implementation-classes
  34.     http://programmers.stackexchange.com/questions/152759/should-i-add-an-abstract-prefix-to-my-abstract-classes
  35. */
  36. *******************************
  37. public interface Condition<V> {
  38.     V apply(LazyEntity<V> element);
  39. }
  40. /*
  41.     тут все ок
  42.  
  43.     за исключением имени параметра
  44.     точнее будет  - не element, а lazyEntity
  45.     т к мы пока не знаем - что это - элемент или коллекция
  46. */
  47. ****************************
  48. public abstract class AbstractCondition<V> implements Condition<V>{
  49.  
  50.     private By locator;
  51.  
  52.     public V apply(LazyEntity<V> element) {
  53.         this.locator = element.getLocator();
  54.         /*
  55.             ним не нужно тут локатором оперировать
  56.             убирай и поле, и его заполнение
  57.  
  58.             в toString() кондишена - оперировать будем не предствалением локатора
  59.             а строковым представлением нашей лейзи-сущности (а значит - и у лейзи-элемента, и у лейзи-коллекции - должен быть
  60.             реализован метод toString - вот там как раз будет уместно выводить локатор как результат)
  61.  
  62.             во-первых - как ты ранее сохраняла значение локатора в поле - так теперь сохраняй
  63.             лейзи-сущность.
  64.  
  65.             и тут имя параметру LazyEntity<V> element подправь
  66.  
  67.         */
  68. ***************************************
  69.  
  70.  
  71. public <V> V until(Condition<LazyEntity<V>> condition, long timeout){
  72. /*
  73.     у нас кондишены - Condition<WebElement> & Condition<List<WebElement>>
  74.     и это было ок, и по-прежнему ок
  75.     мы уже получили лейзи-сущность  и проверим в ждущей проверке - кондишены - Condition<WebElement> или Condition<List<WebElement>>
  76.  
  77.     меняем тип у Condition<LazyEntity<V>> condition на Condition<V>
  78. */
  79. *************
  80. V apply = condition.apply(element);
  81. /*
  82.     вот тут теперь есть вопросы)
  83.  
  84.     можно конечно - грубо - привести результат к типу V
  85.     V apply = (V) condition.apply(element);
  86.     есть такой вариант - alt + enter
  87.     похоже - вот в этом моменте я тебя в слеке куда-то не дуда завела)
  88.     сорри)
  89.     код уже не самый простой, проще его видеть живьем, а не в картинках
  90.  
  91.     так придется делать - т к тип в <...> не задан для  private LazyEntity element;
  92.     и тут надо бы переименовать этот параметр на lazyEntity
  93.  
  94.     и для второго метода until - тоже подправь тип параметра
  95.  
  96.     если делать не грубо - то нужно дженерик-тип искользовать на уровне класса WaitFor
  97.     а не как сейчас - на уровне метода until
  98.  
  99.     можно пока оставить грубое приведение типа)
  100.     оставь на закуску этот момент
  101.  
  102.     когда по этому ревью будет все проработано - можно будет вернуться опять к этому моменту
  103. */
  104. ******************************
  105. public class LazyElement implements LazyEntity<WebElement> {
  106.  
  107.     /*
  108.         все реализованное - ок
  109.  
  110.         не хватает toString()
  111.         в данном случае  - locator.toString() - будет оптимально
  112.  
  113.  
  114.         метод getLocator() - и отсюда убирай
  115.     */
  116.  
  117.  
  118.     public void click(){
  119.     /*
  120.         уже сейчас с этим методом - проблем не будет - решили вопросы с типами в WaitFor
  121.  
  122.         вызывай вариант until - без таймаута уже
  123.         вызов будет лаконичнее
  124.     */
  125. ***********************************
  126. public class LazyElements implements LazyEntity<List<WebElement>> {
  127. /*
  128.     чтобы сразу бросалась в глаза разница - элемент или коллекция
  129.     предлагаю этот класс назвать LazyCollection
  130. */
  131.    ...
  132.  
  133.     public static List<WebElement> $$(By locator) {
  134.     /*
  135.         это - метод для ConciseAPI
  136.         тут он не нужен
  137.  
  138.         метод будет аналогичный методу $(By locator)
  139.     */
  140.  
  141.     public By getLocator() {
  142.     /*
  143.         и этот метод - не нужен
  144.     */
  145. /*
  146.     еще не хватает toString()
  147.     и тут - locator.toString() - будет оптимально
  148. */
  149. ********************************
  150. public static <V> V assertThat(By locator, Condition<LazyEntity<V>> condition) {
  151. public static <V> V assertThat(By locator, Condition<LazyEntity<V>> condition, long timeout) {
  152. /*
  153.     эти методы уже не нужны
  154.  
  155.     нам для коллекции и для элемента - нужны методы should
  156.  
  157.     для элемента - should(Condition<WebElement> condition)
  158.     или даже should(Condition<WebElement>... conditions)
  159.  
  160.     а для коллекции - should(Condition<List<WebElement>>... conditions)
  161.  
  162.  
  163.     дальше смотрим)
  164.  
  165.     метод $ - возвращает значение LazyEntity<WebElement>
  166.     значит - когда мы получим это значение - мы сможем вызвать лишь методы интерфейса LazyEntity
  167.  
  168.     для коллекции и элемента - у нас разные наборы методов
  169.     отнаследуем от LazyEntity - 2 новых интерфейса - для элемента и коллекции
  170.     и уже в этих интерфейсах - объявляй все методы, которые нужны уже - для элемента и коллекции - соответственно
  171.    
  172.     пройдись по gmail-задаче
  173.     что нужно для работы с коллекцией и элементами - реализуй
  174.    
  175.     с todoMVC - не торопись пока
  176.    
  177.     по идее - уже с этими изменинями gmail-задача будет работоспособной
  178. */
Advertisement
Add Comment
Please, Sign In to add comment