Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Паттерн билдер / 22 сообщений из 22, страница 1 из 1
08.09.2016, 10:02
    #39305643
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Паттерн билдер
Всем привет. Есть цепочка вызовов методов:
Код: java
1.
methodOne().methodTwo().methodThree() 


1. Как правильно прервать выполнение цепочки, например, на methodTwo(), пока что приходят в голову варианты с исключением или используя некий булеан флаг
2. Как запретить перестановку методов в цепочке вызовов, т.е. чтобы вот так:
Код: java
1.
methodOne().methodThree().methodTwo() 

нельзя было написать
Спасибо
...
Рейтинг: 0 / 0
08.09.2016, 10:10
    #39305650
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Паттерн билдер
JulT,

Зачем исключение? Безопаснее разные типы возвращать.
...
Рейтинг: 0 / 0
08.09.2016, 10:16
    #39305656
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Паттерн билдер
BlazkowiczJulT,

Зачем исключение? Безопаснее разные типы возвращать.
а можно с примерчиком?
и по второму вопросу могли бы что-то подсказать?
...
Рейтинг: 0 / 0
08.09.2016, 10:21
    #39305662
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Паттерн билдер
JulT,
Не понял. Разве паттерн о цепочке вызовов?
- любую цепочку можно написать без цепочки в несколько строк. Поэтому первый вопрос непонятен. Прогер может написать 3 строки, а может в одну. Его дело.
...
Рейтинг: 0 / 0
08.09.2016, 10:26
    #39305666
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Паттерн билдер
Petro123JulT,
Не понял. Разве паттерн о цепочке вызовов?
- любую цепочку можно написать без цепочки в несколько строк. Поэтому первый вопрос непонятен. Прогер может написать 3 строки, а может в одну. Его дело.
как программно задать последовательность вызовов методов? чтобы было так и никак иначе:
methodOne().methodTwo().methodThree()
как программно сделать так, чтобы если написать methodOne().methodTwo() происходил некий алерт, мол нет вызова methodTwo()
или это из области моих фантазий?:)
...
Рейтинг: 0 / 0
08.09.2016, 10:31
    #39305671
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Паттерн билдер
JulTили это из области моих фантазий?:)
да. IMHO
Если вы у объекта возврата функции methodOne() не напишите метод methodTwo(), то после точки НЕ будет подсказки с методом. Не скомпилируется.
По простому - компилятор просто разворачивает вашу одну строку в 3 строки. Это понятно?
...
Рейтинг: 0 / 0
08.09.2016, 10:34
    #39305674
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Паттерн билдер
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
class Builder {

public Second methodOne() {
...
}


public static interface Second {
public Third methodTwo();
}


public static interface Third {
public void methodThree();
}

}
...
Рейтинг: 0 / 0
08.09.2016, 10:38
    #39305679
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Паттерн билдер
no56892,
не знаю про что ТС. Я говорил про ООП (без интерфейсов).
...
Рейтинг: 0 / 0
08.09.2016, 10:44
    #39305683
schi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Паттерн билдер
JulTкак программно задать последовательность вызовов методов? чтобы было так и никак иначе:
methodOne().methodTwo().methodThree()
как программно сделать так, чтобы если написать methodOne().methodTwo() происходил некий алерт, мол нет вызова methodTwo()
или это из области моих фантазий?:)

Очевидно, поменять архитектуру, так как в ней что-то не то, если функциональность зависит от последовательности вызовов.

Программно - объединить три метода в один и вызывать его извне.
Если же методы настолько ценны, что должны вызываться вне класса, то в классе завести поле для состояния и отмечать, какой метод (какие методы) были вызваны, в методах, перед которыми что-то должно быть вызвано, проверять эти предусловия.
...
Рейтинг: 0 / 0
08.09.2016, 10:49
    #39305691
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Паттерн билдер
schiОчевидно, поменять архитектуру, так как в ней что-то не то, если функциональность зависит от последовательности вызовов.
+1
именно это меня и поразило.
Какого фига я должен писать так а не иначе цепочку. Цепочку составляет программист САМ).
ЗЫ.
Паттерн в сабже вообще не про цепочки.
...
Рейтинг: 0 / 0
08.09.2016, 10:51
    #39305694
RocknRolla
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Паттерн билдер
no56892
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
class Builder {

public Second methodOne() {
...
}


public static interface Second {
public Third methodTwo();
}


public static interface Third {
public void methodThree();
}

}



Плюсую!
...
Рейтинг: 0 / 0
08.09.2016, 10:52
    #39305695
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Паттерн билдер
Petro123schiОчевидно, поменять архитектуру, так как в ней что-то не то, если функциональность зависит от последовательности вызовов.
+1
именно это меня и поразило.
Какого фига я должен писать так а не иначе цепочку. Цепочку составляет программист САМ).
ЗЫ.
Паттерн в сабже вообще не про цепочки.
всем спасибо, разобралась. про билдер да, это я погорячилась)
...
Рейтинг: 0 / 0
08.09.2016, 10:53
    #39305697
lleming
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Паттерн билдер
Код: 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.
package org.javatutorial;

public class MyBuilderFactory {

	public class MyBuilderClass implements MethodOne, MethodTwo , MethodThree {
		
		private SomeResult someResult;

		@Override
		public SomeResult methodThree() {
			return someResult;
			
		}

		@Override
		public MethodThree methodTwo() {
			// some operation
			return this;
			
		}

		@Override
		public MethodTwo methodOne() {
			//some operation 
			return this;
		}} 
	public interface MethodOne{
		MethodTwo methodOne();
	}
	
	public interface MethodTwo{
		MethodThree methodTwo();
	};
	
	public interface MethodThree{
		SomeResult methodThree();
	}
}



можно и в отдельные файлы повыносить.
...
Рейтинг: 0 / 0
09.09.2016, 19:47
    #39306850
chabapok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Паттерн билдер
как-то оно многословно выходит. Возможно, автору надо посмотреть на монады, и попытаться реализовать нужный функционал через них.
...
Рейтинг: 0 / 0
09.09.2016, 21:55
    #39306895
rdm
rdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Паттерн билдер
Например цепочка Страна-Город-Улица

Код: 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.
class Country {
String name;

pulbic Country (String name) {
 this.name = name;
}

 public City city(String name) {
  retrun new City(name);
}
}


class City {
String name;

 public City street(String name) {
  retrun new Street(name);
}

class Street {
String name;

}

new Country("Россия").city("Москва").street("Ленина");
...
Рейтинг: 0 / 0
09.09.2016, 22:02
    #39306899
rdm
rdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Паттерн билдер
Чтобы и в обратном порядке

Код: 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.
class Country {
String countryName;

pulbic Country (String countryName) {
 this.countryName= countryName;
}

 public City city(String cityName) {
  retrun new City(countryName, cityName);
}
}


class City {
String countryName;
String cityName;

pulbic City (String countryName, String cityName) {
 this.countryName= countryName;
 this.cityName= cityName;
}

 public Street street(String streetName) {
  retrun new Street(countryName, cityName, streetName);
}

 public Country country() {
  retrun new Country(countryName);
}


}

class Street {
String countryName;
String cityName;
String steetName;

pulbic Street (String  steetName, String countryName, String cityName) {
 this.countryName= countryName;
 this.cityName= cityName;
 this.steetName= steetName;
}

public City city() {
return new City(countryName, cityName)
}

}

Street street = new Country("Россия").city("Москва").street("Ленина");
City city = street.city();
...
Рейтинг: 0 / 0
09.09.2016, 22:32
    #39306910
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Паттерн билдер
Билдер нужно сделать FSM. И чтобы на каждый сеттинг страны-города-улицы
включались флажки или менялся счетчик и дальше соотв. разруливать
рулы так как автору надо. Запорол бок - получи IllegalState.
...
Рейтинг: 0 / 0
10.09.2016, 08:32
    #39306983
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Паттерн билдер
...
Рейтинг: 0 / 0
13.09.2016, 10:24
    #39308176
lleming
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Паттерн билдер
maytonБилдер нужно сделать FSM. И чтобы на каждый сеттинг страны-города-улицы
включались флажки или менялся счетчик и дальше соотв. разруливать
рулы так как автору надо. Запорол бок - получи IllegalState.

какие будут за и против билдер паттерна и конроля с помощью флагжков ?
...
Рейтинг: 0 / 0
13.09.2016, 10:26
    #39308179
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Паттерн билдер
llemingкакие будут за и против билдер паттерна и конроля с помощью флагжков ?
Смысл контролировать в run-time, если можно в compile-time?
...
Рейтинг: 0 / 0
13.09.2016, 10:28
    #39308182
lleming
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Паттерн билдер
у бидера стремно чтобы протестировать логику надо в любом случае собирать весь объект может быть непросто если много полей
exception если вдруг посередине сборки объекта
и дебажить неудобно надо в уме держать что было ранее.
...
Рейтинг: 0 / 0
13.09.2016, 11:09
    #39308217
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Паттерн билдер
lleming,
легко уйти в оверхед. И вместо кодирования БЛ по простому, делать БЛ не там где надо.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Паттерн билдер / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]