Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Статические (static) методы где использовать, кокретный пример 
V
    Опции темы
priam220
Дата 4.6.2010, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 4.6.2010

Репутация: нет
Всего: 8



Автоматизированное тестирование. Класс Screen описывает окно Веб-приложения. По определенным причинам, мы не используем конструктор. Но испльзуем  метод open() для создания объекта.


как будет правильно работать с этим методом:

Screen screen = Screen.open();  
 т.е. объявить статическим метод и и возвращать объект типа Screen (public static Screen open(){... return new Screen})

либо:

Screen screen = new Screen ();
screen.open();                                              (public void open(){...})


и самое главное, без чего Ваш ответ, не будет ответом, ПОЧЕМУ?  

Заранее спасибо.

PM MAIL   Вверх
powerOn
Дата 4.6.2010, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 1
Всего: 159



Статический метод нельзя переопределить. А это может понадобиться в юнит тесте для подмены реальной реализации на заглушку. Статический метод это зависимость от реализации, а не от абстракции, т.е. нарушение DIP. Его следует использовать с осторожностью. Какие могут быть альтернативы: шаблон "метод фабрики" или использование IoC. Сам же класс на мой взгляд следует разделить на интерфейс Screen и его реализацию ScreenImpl.


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
priam220
Дата 4.6.2010, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 4.6.2010

Репутация: нет
Всего: 8



powerOn,  спасибо тебе за ответ. Я еще обмозгую твои слова, если появится новый вопрос, буду надеятся на такую же оперативность. Еще раз спасибо.
PM MAIL   Вверх
Старовъръ
Дата 5.6.2010, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.5.2008

Репутация: 2
Всего: 10



1. Вариант со статичеким методом больше похож на SomeClass.getInstance(). 
2. На статические методы так же можно делать заглушки, для этого существуют специальные библиотеки, их работа основана на прокси классах, они используют CGLIB как основу. Но, имхо, это через одно место, лучше использовать best practice приведенные powerOn'ом.
3. Если проводить аналогию с обычным окном, то вполне логично, что оно будет сначала создаваться, а потом (не обязательно сразу) показываться, то есть вызывать open() отдельно - эт нормально.
PM MAIL WWW   Вверх
powerOn
Дата 5.6.2010, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 1
Всего: 159



Цитата(Старовъръ @  5.6.2010,  09:30 Найти цитируемый пост)
На статические методы так же можно делать заглушки, для этого существуют специальные библиотеки, их работа основана на прокси классах, они используют CGLIB как основу. 


угу, PowerMock например умеет, но это, опять же, когда рефакторинг кода по тем или иным причинам невозможен.


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
priam220
Дата 7.6.2010, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 4.6.2010

Репутация: нет
Всего: 8



Спасибо!

Это сообщение отредактировал(а) priam220 - 22.6.2010, 22:34
PM MAIL   Вверх
Sun
Дата 7.6.2010, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Account removed
***


Профиль
Группа: Экс. модератор
Сообщений: 1611
Регистрация: 14.8.2002

Репутация: нет
Всего: 48



priam220, класс Screen можно сделать абстрактным и сделать метод open() абстрактным. Дальше в потомках уже реализовывать его для каждого конкретного экрана.
Код

public abstract class Screen {
  public abstract void open();
}

public class LoginScreen extends Screen {
  public void open() {
    ... some implementation
  }
}

public class MainScreen extends Screen {
  public void open() {
    ... some implementation
  }
}
...
public void someMethod(Screen screen) {
  screen.open();
...
}

LoginScreen loginScreen = new LoginScreen();
someMehtod(loginScreen);
loginScreen.login();
MainScreen mainScreen = new MainScreen();
someMehtod(mainScreen);


Это позволит тебе использовать в качестве параметров методов абстрактный класс Screen и тебе не нужно париться по поводу того какой ты туда скрин передал, у тебя будет всегда вызыватся нужный тебе метод open(). В случае со статическим методом тебе прийдется всегда явно указывать имя класса. Вообщем статический метод для open() - очень плохое решение.


--------------------
Account removed
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Design, Quality, Testing | Следующая тема »


 




[ Время генерации скрипта: 0.0920 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.