|
|
|
Нужен паттерн
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток, уважаемые! Не успел освоить еще паттерны, а задача уже есть. Надо создать класс/интерфейс, который в зависимости от входящего объекта будет возвращать тоже объект, но с определенным методами в нем. Пример: Интерфейс - рабочий Классы: слесарь, сантехник, плотник нужно что-то типа: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. Вот. Чтобы handler1-у была доступна только ф-ция "сваркаПерекрытий()" и ничего большего. Через какой паттерн это реализовывается.... Ну или можно без паттерна? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2013, 11:06 |
|
||
|
Нужен паттерн
|
|||
|---|---|---|---|
|
#18+
Нельзя управлять из кода тем, что определяется на этапе компиляции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2013, 12:11 |
|
||
|
Нужен паттерн
|
|||
|---|---|---|---|
|
#18+
Код: sql 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2013, 12:14 |
|
||
|
Нужен паттерн
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2013, 13:25 |
|
||
|
Нужен паттерн
|
|||
|---|---|---|---|
|
#18+
Лагман Код: sql 1. 2. 3. 4. 5. 6. спасибо, за отклик, но мне тут посоветовали паттерн Visitor... вроде по первому впечатлению то, что я хотел... щас посмотрю реализацию подробнее... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2013, 13:57 |
|
||
|
Нужен паттерн
|
|||
|---|---|---|---|
|
#18+
NDAlekseyспасибо, за отклик, но мне тут посоветовали паттерн Visitor... вроде по первому впечатлению то, что я хотел... щас посмотрю реализацию подробнее... Вообще не из этой оперы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2013, 14:09 |
|
||
|
Нужен паттерн
|
|||
|---|---|---|---|
|
#18+
NDAleksey, я тащемта визитер и написал) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2013, 15:47 |
|
||
|
Нужен паттерн
|
|||
|---|---|---|---|
|
#18+
ЛагманNDAleksey, я тащемта визитер и написал) Я не спорю, просто я в шаблонах не бельмесу, к сожалению, а в книжке, которая щас под рукой, "Применение шаблонов в Java" С.Стелтинг., там мне визитер несколько иначе показался реализован. Но, пораскинув серым веществом, думаю, что он тут не совсем удобен. К примеру, возвращаемся к вашей "структуре". Я могу сделать так: Код: java 1. 2. 3. 4. 5. 6. 7. Вопрос: как отработает наш дорогой рабочий-Варитель? Коллизии в логике не возникнет? Предлагаю на критику следующую "структуру": Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2013, 16:55 |
|
||
|
Нужен паттерн
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. можно использовать только в самом крайнем случае, если например костылизируете чужой код. Если код пишете Вы сами, стоит избежать. Зачем вообще фабрики и т.п., если вы в коде явно пишете, что делать рабочим? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2013, 17:08 |
|
||
|
Нужен паттерн
|
|||
|---|---|---|---|
|
#18+
Лагман Код: sql 1. можно использовать только в самом крайнем случае, если например костылизируете чужой код. Если код пишете Вы сами, стоит избежать. Зачем вообще фабрики и т.п., если вы в коде явно пишете, что делать рабочим? в самом первом посте я и исходил именно из того, что имя действия я знаю, и именно вызываю то, что определил заранее. У меня же handler1 явно вызывает метод. Нужно было просто оградить варщика от копания, а копателя от варщика. это было нужно. может я просто криво вопрос задал и меня не понять. а что на счет instanceof? кто-то мне говорил, что это трудоемкая операция и нужно избегать, а на другом собеседовании смеялись в лицо, услышав эту фразу. и я назвал "ФабрикаРабочих" не имея подтекстом AbstractFactory, ибо только слышал об этом паттерне и только... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2013, 17:22 |
|
||
|
Нужен паттерн
|
|||
|---|---|---|---|
|
#18+
instanceOf это враг ООП. Что значит "Оградить" ? Чтоб оградить программиста от возможности вызвать метод копать() у варщика, есть жесткая типизация. Если по каким-то причинам оба должны иметь метод копать() и варить(), но не хотят, то вам нужен адаптер, который ничего не делает вместо работы Код: sql 1. 2. 3. 4. а ещё можно сделать так Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2013, 17:34 |
|
||
|
Нужен паттерн
|
|||
|---|---|---|---|
|
#18+
2 Лагман, ценю участие и советы (особенно последний - поразил! в Java я месяца два только и до этого сталкивался с Runnable только с потоками), поэтому если не возражаете помочь, давайте перейдем к реальной предметной области, а то я с переинтерпретированием уже запутался - сам дурак, не нужно было всяких рабочих придумывать) есть сущности: CSV-файл, WebService, DB. пока работаю только с CSV, ибо структуру его только знаю, остальное - потом (сказал начальник) задача: создать интерфейс типа Container, от которого будут имлементиться все сущности. еще задача: создать, как бы, описатель файла - поделить его на таблички в БД. допустим таблицы: Files (id, URI, delimeter, is_title), Columns(id, type, position, file_id, title). к чему это - моя сущность "файл" и, в дальнейшем, "веб-сервис" имплементят "Container". у "файл" должны быть методы create/update/delete Files + Columns, которые в свою очередь через ejb создаются в БД (не суть). так вот начальник требует, чтобы именно был один интерфейс и потомки. мне не пришло ничего умного, как создать то, что показал, где "Рабочий" - это "Container", "Рытель" - "CSV-файл", "Копатель" - "WebService". не зная, как работает сервис и, что в нем будет, я должен иметь объект CSV с только ему доступными вышеуказанными методами. поэтому и хочу, чтобы ему не были видны методы веб-сервиса, и не имплементить их из "Container". извиняюсь за писанину - лаконичность не мой конек, но что скажете по теме?) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2013, 18:04 |
|
||
|
Нужен паттерн
|
|||
|---|---|---|---|
|
#18+
Ну так у Вас уже наверное есть требования к интерфейсу Container? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2013, 18:15 |
|
||
|
Нужен паттерн
|
|||
|---|---|---|---|
|
#18+
ЛагманНу так у Вас уже наверное есть требования к интерфейсу Container? от начальства - лишь только, чтобы его имплементили классы файла и сервиса, ибо потом нужно будет расширить "потомков". а дальнейшее я должен сам надумать. если я сделаю в нем методы create/update/delete, то в классах CSV_Container и WS_Container я должен их реализовать. а реализация у них разная, несмотря на то, что у них должны быть различные входные параметры. да и названия методов как бы думаю будут различные. получив такой аргумент начальник сказал, что я должен Container передавать как параметр в метод и отослал меня. вот я и придумал ту структуру... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2013, 21:09 |
|
||
|
Нужен паттерн
|
|||
|---|---|---|---|
|
#18+
Может что-то такое имеется ввиду, не? Мои навыки телепатии немного слабы.. Код: sql 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2013, 22:58 |
|
||
|
Нужен паттерн
|
|||
|---|---|---|---|
|
#18+
ЛагманМожет что-то такое имеется ввиду, не? ну как же это сказать. моя задача, применительно к CSV - не добавлять строку в файл. мне нужно создать как бы описатель содержимого. отсюда и те таблички Files + Columns. если присмотреться, что я дал выше, то можно. применительно к коду. мне не хотелось бы создавать общие методы create/update/delete - они же "безлики". если я определяю их в интерфейсе, то их же реализовывают оба класса: CSV и WS. а мне хотелось бы, чтобы у одного было что-то типа: create(URI, columnCount, delimiter, isTitle) - создается описатель для файла с определенным URI, числом колонок, разделителем и есть ли заголовки в колонках - показатель. также и для WS - я не знаю, что ему передавать в методы. отсюда вывод - я не могу прописать эти методы в interface Container. отсюда и танцы с бубном. понимаете? P.S. реально очень признателен за то, что вы уделяете внимание моей теме. спасибо! как новичку - очень вдохновляет! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2013, 23:25 |
|
||
|
Нужен паттерн
|
|||
|---|---|---|---|
|
#18+
NDAlekseyбезлики так в этом и суть, клиент (код пользующийся интерфейсом Container) можно написать один раз, и передавать ему какие угодно реализации Container'а ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2013, 00:11 |
|
||
|
Нужен паттерн
|
|||
|---|---|---|---|
|
#18+
ЛагманNDAlekseyбезлики так в этом и суть, клиент (код пользующийся интерфейсом Container) можно написать один раз, и передавать ему какие угодно реализации Container'а Код: 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. типа того? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2013, 00:39 |
|
||
|
Нужен паттерн
|
|||
|---|---|---|---|
|
#18+
NDAlekseyДоброго времени суток, уважаемые! Не успел освоить еще паттерны, а задача уже есть. Надо создать класс/интерфейс, который в зависимости от входящего объекта будет возвращать тоже объект, но с определенным методами в нем. Вот. Чтобы handler1-у была доступна только ф-ция "сваркаПерекрытий()" и ничего большего. Через какой паттерн это реализовывается.... Ну или можно без паттерна? Это реализуется парой паттернов Стратегия и Фабрика (фабричный метод) Вместо Фабрики, по вкусу можно использовать Абстрактную фабрику , или Service Locator (на русском нет), или Внедрение зависимости . Но для начала все же стоит попробовать обычную фабрику. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2013, 11:33 |
|
||
|
Нужен паттерн
|
|||
|---|---|---|---|
|
#18+
NDAlekseyНе успел освоить еще паттерны, а задача уже есть Не надо думать о паттернах, надо думать о задачах. Перекос в сторону паттернов - это классический восходящий подход, заканчивающийся бардаком и развалом проекта под собственной тяжестью. Не читая готов спорить, что дальше будет очень много обсуждения паттернов - причём принципиально разных, несовместимых, и каждый будет говорить, что он прав, а другой предлагает какую-то совсем не подходящую для задачи фигню. И будет очень мало или совсем не будет ничего про задачу - про то, что и зачем Вы вообще хотите сделать. Потому как Ваше описание задачи, мягко говоря, слишком размыто, чтобы советовать какое-то решение. NDAlekseyНадо создать класс/интерфейс, который в зависимости от входящего объекта будет возвращать тоже объект, но с определенным методами в нем. Пример: Судя по описанию, нужно примерно следующее: Код: java 1. 2. 3. 4. 5. 6. 7. Или? Лучше забудьте о слесарях и объясните толком, какую задачу решаете. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2013, 13:36 |
|
||
|
Нужен паттерн
|
|||
|---|---|---|---|
|
#18+
softwarerИли? Лучше забудьте о слесарях и объясните толком, какую задачу решаете. не буду с Вами спорить, по поводу "какой подход лучше"... в реальной ООП разработке я новичок, ИМХО... а вот задачу я может сумбурно описал в своем посте №15300624... посмотрите повнимательнее) 2 Лагман, щас разобрался с Visitor-ом - понравилось... никаких if/instanceof в коде нету) спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2013, 13:46 |
|
||
|
Нужен паттерн
|
|||
|---|---|---|---|
|
#18+
ЛагманЕсли по каким-то причинам оба должны иметь метод копать() и варить(), но не хотят, то вам нужен адаптер, который ничего не делает вместо работы Скорее - судя по описанию - выбрасывает исключение типа operation not supported. Поможет отлаживать ситуации, когда варщика заставляют копать. Но глобально таких ситуаций однозначно стоит избегать. NDAlexeyесть сущности: CSV-файл, WebService, DB. пока работаю только с CSV, ибо структуру его только знаю, остальное - потом (сказал начальник) задача: создать интерфейс типа Container, от которого будут имлементиться все сущности. Сочувствую, задача довольно противная, и вот в таком подходе - сначала что есть, потом натянем на остальное - в ней очень легко наломать дров. Так или иначе, Ваша главная задача - очень вдумчиво и аккуратно специфицировать этот интерфейс. В "обычном стиральном порошке" это выглядит так: - придумываем интерфейс, подходящий для csv, реализуем для csv класс А - реализуем (основной) код, работающий через этот интерфейс - начинаем натягивать на webservice, обнаруживаем, что интерфейс не натягивается - придумываем, как дописать интерфейс, чтобы он "малой кровью" натягивался и туда, и туда - реализуем для webservice класс Б - обычно на этом этапе появляются методы-заглушки в реализациях, ничего не делают, но есть в классе А потому, что через них работает тоже реализующий интерфейс класс Б - допиливаем (основной) код, чтобы он работал с новой версией интерфейса и выполнялся через класс Б - обнаруживаем, что при этом сломали его работу через класс А, правим - начинаем натягивать на DB, обнаруживаем, что не натягивается.... Чтобы не мучиться с таким уродцем, нужно хорошо понять ту абстракцию, которую Вы должны реализовать. Скажем, ИсточникДанных. Отталкиваясь от основного кода (того, который будет использовать эту абстракцию), нужно понять его методы. Требования при этом следующие: - опираясь только на эти методы, вызывающий код сможет решить свои задачи - этих методов достаточно мало, минимальное возможное количество, и они не альтернативны (избегаем ситуации "в классе А эту задачу решает метод АА, в классе Б - метод ББ, а в интерфейсе нужны оба, а в вызывающем коде вызывать оба каждый в своём месте) - эти методы реализуемы для тех объектов, с которыми реально потребуется работать, причём без недопустимых извращений (скажем, БД не потребуется целиком считывать в память) В целом, с первого раза - не получится. Не бывает такого счастья :) Но сразу подойдя правильно, Вы кардинально сократите мучения на последующих этапах. При этом есть одно важное замечание. Если интерфейс сложный, а реализации разнообразны, Вы часто будете натыкаться на ситуацию "не могу достаточно чётко специфицировать какую-то деталь", как, например, говорите, что у методов будут разные наборы параметров. Так вот, фокус в том, что их не обязательно специфицировать. Никто не мешает использовать вспомогательные абстракции. Методы могут ожидать параметром абстрактный класс и возвращать результатом опять же абстрактный класс. Вы просто откладываете "непонятное" на потом, решаете основную задачу - и остаётся решить только более простую, специфицировать этот абстрактный класс. NDAlexeyНужно было просто оградить варщика от копания, а копателя от варщика. это было нужно. Их не нужно ограждать. У них обоих нужно сделать метод работать(), при вызове которого варщик варит, а копатель копает. Пусть этот метод возвращает РезультатРаботы (когда перестаёт хватать boolean). Итп. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2013, 14:54 |
|
||
|
Нужен паттерн
|
|||
|---|---|---|---|
|
#18+
softwarerNDAlexeyНужно было просто оградить варщика от копания, а копателя от варщика. это было нужно. Их не нужно ограждать. У них обоих нужно сделать метод работать(), при вызове которого варщик варит, а копатель копает. Пусть этот метод возвращает РезультатРаботы (когда перестаёт хватать boolean). Итп. да, я это понял, хоть и не сразу... кстати, если у Вас есть желание, могу скинуть код (кусок)... тут приведу UML-ку, что у меня в итоге получилось( Container - это Mapper, Actor - бывший рабочий ). оцените... P.S. рисую UML-диаграмму первый раз, просьба по ушам не бить) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2013, 15:28 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=38503727&tid=1341536]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
422ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
| others: | 235ms |
| total: | 767ms |

| 0 / 0 |
