LINUX.ORG.RU

Объектно-ориентированный дизайн

 , , , ,


0

1

ЛОР, а как ты предпочитаешь реализовывать подобного рода конструкции?

Казалось бы doSpecificComplexTask() нужно сделать методом Link и переопределить его в каждом наследнике, но что если в этом методе может быть довольно нетривиальной код, который хочется держать отдельно от данных (например, работа с сетью, базой, etc...). Т.е. хочется, чтобы класс Link был скорее структурой?

Visitor - очень громоздко, instanceof - в Java говорят плохой стиль. Хотя если разобраться, то чем Pattern Matching из Scala не instanceof?

Да, это ООП головного мозга.

Java:

public interface Entity {
    String getId();
    String getMessaage();
    Link getLink();
}

public interface Link {
    
    void accept(Visitor visitor);

    static interface Visitor {
        visit(UrlLink link);
        visit(SomethingElseLink link);
        visit(EvenMoreLink link);
    }    

    static abstract class UrlLink() implements Link {
        void accept(Visitor visitor) { visitor.accept(this); }
        URL getURL();
    }

    static abstract class SomethingElseLink() implements Link {
        void accept(Visitor visitor) { visitor.accept(this); }
        SomethingElse getSomethingElse();
        AndSomethingElse getAndSomethingElse();
    }

    static abstract class EvenMoreLink() implements Link {
        void accept(Visitor visitor) { visitor.accept(this); }
        EvenMore getEvenMore();
    }

}

// Variant 1

class SpecificVisitor implements Link.Visitor { ... }

SpecificVisitor visitor = new SpecificVisitor();
entity.getLink().accept(visitor);

// Variant 2

Link link = entity.getLink();
if (link instanceof UrlLink) { doSpecificComplexTask(...); }
if (link instanceof SomethingElseLink) { doSpecificComplexTask(...); }
if (link instanceof EvenMoreLink) { doSpecificComplexTask(...); }

Scala:

class Entity(id: String, message: String, link: Link)

trait Link
case class UrlLink(url: URL)
case class SomethingElseLink(se: SomethingElse, ase: AndSomethingElse)
case class EvenMoreLink(em: EvenMore)

entity match {
    case UrlLink(url) => doSpecificComplexTask(url)
    case SomethingElseLink(se, ase) => doSpecificComplexTask(se, ase)
    case EvenMoreLink(em) => doSpecificComplexTask(em)
}
★★
Ответ на: комментарий от yoghurt

У меня к визиторам довольно скептическое отношение. Вроде все хорошо, но смотрятся они довольно чужеродно в коде. IMHO, конечно.

Ian ★★
() автор топика

Однозначно visitor, без вариантов.

anonymous
()

У меня для такой задачи был бы

Map<Class<?>, Callback<Link>>

и есть утилитка которая в карте ищет значение сначала ищет по классу, потом по интерфесам, потом по суперклассу, потом по его интерфейсам и т.п.

ну а дальше, хоть грузи в рантайме из конфига

Deleted
()
Ответ на: комментарий от yoghurt

ага поэтому ентим интерпрайзом пользуются только банки и то из-за сертификатов

Deleted
()
Ответ на: комментарий от Deleted

Интересный вариант, но там где нет динамики (загрузки из конфига) это скорее оверхед.

Ian ★★
() автор топика

Уважаемый топикстартер. Ты выбрал не совсем подходящий ресурс для обсуждения вопросов объектно-ориентированного дизайна. Вернее, совсем не подходящий.

Дело в том, что /development/ ЛОРа не является сообществом профессиональных разработчиков. Профессионалы (то есть те, кто владеет технологиями на высоком уровне и зарабатывает на жизнь разработкой ПО) здесь в подавляющем меньшинстве и, я бы сказал, на птичьих правах. Абсолютное большинство — это тролли, диванные теоретики, доморощенные гуру, форумные трепачи, лисперы, хаскелисты и прочие ёбнутые на голову адепты маргинальщины, фрики, школьники, хипсторы, петросяны, IT-эзотерики, IT-шарлатаны, IT-небыдло и так далее. Здесь в воздухе густо пахнет мамкиным борщом и нонконформизмом. Здесь модно поливать говном все практические, промышленные технологии и подходы (к которым, несомненно, относится и ООП). Поэтому вместо экспертного мнения ты получишь здесь 100500 тонн говна на ООП и 9000 советов учить лисп, хаскель, Smalltalk, Brainfuck, Agda2 и Coq. Собственно, в этот тред уже набежали ебанутые на голову лиспотролли со своим CLOS. Разве это то, чего ты хочешь?

Надежды Макскома на превращение ЛОРа в «русскоязычный StackOverflow» не оправдались, разбившись о безответственную политику модерирования и, как следствие, полную маргинализацию ЛОРа. Поэтому лично я бы советовал обратиться к англоязычным сайтам и литературе.

anonymous
()

ЛОР, а как ты предпочитаешь реализовывать подобного рода конструкции?

Дженериков обычно хватает практически для всего. В данном случае, не понятно что надо в итоге, поэтому не понятно, как делать.

instanceof нормальная конструкция, просто она опасная, легко забыть дописать код, если добавляется новая сущность. Обычное делают так

if (link instanceof UrlLink) {  }
else if (link instanceof SomethingElseLink) { }
else if (link instanceof EvenMoreLink) { }
else throw new RuntimeError(link.getClass().getName() + " error");
тогда хоть в рантайме ошибку получишь.

Код с визитерами ужасно громоздкий, если это не центральный код, и не предполагает частое изменение сторонними людьми, я бы не стал городить сей огород. Надо быть проще :-)

vtVitus ★★★★★
()
Ответ на: комментарий от Ian
(defgeneric do-secific-complex-task (link resource))

(defmethod do-secific-complex-task ((link url-link) (resource http))
  ;; fetch data from HTTP server
  )

(defmethod do-secific-complex-task ((link url-link) (resource samba))
  ;; fetch data from Samba server
  )

(defmethod do-secific-complex-task ((link db-location) (resource sql-database))
  ;; fetch data from SQL database
  )

(defmethod do-secific-complex-task ((link db-location) (resource nosql-database))
  ;; fetch data from NoSQL database
  )

(defmethod do-secific-complex-task ((link filename) (resource file-system))
  ;; fetch data from a disk
  )

(defmethod do-secific-complex-task ((link filename) (resource encrypted-file-system))
  ;; fetch data from a disk
  )
anonymous
()
Ответ на: комментарий от vtVitus

Спасибо за развернутый ответ по делу. В общем, я тоже склоняюсь в простых случаях к instanceof + throw.

Ian ★★
() автор топика
Ответ на: комментарий от anonymous

Очень похоже на pattern matching, которого в Java, к сожалению, нет ни в каком виде. Пример на Scala чем-то похож, разве что он не на уровне методов работает.

Ian ★★
() автор топика
Последнее исправление: Ian (всего исправлений: 1)
Ответ на: комментарий от Ian

На самом деле на ЛОРе есть еще очень грамотные люди, например, mv. На них и надеюсь.

mv сейчас обзовёт тебя быдлокодером и приведёт полурабочее решение на мёртвом языке 50-летней давности. Оно тебе надо? Ведь тебе требуется писать работающие программы, а не заниматься некромантией и прочей чёрной IT-магией.

anonymous
()
Ответ на: комментарий от vtVitus

Кстати, а если использовать enum для тега типа и потом switch по этому тегу, javac не выдаст предупреждение, что в switch не все значения enum'а обрабатываются? Компиляторы С++ такое умеют.

Begemoth ★★★★★
()
Ответ на: комментарий от anonymous

Ведь тебе требуется писать работающие программы, а не заниматься некромантией и прочей чёрной IT-магией.

Да, желательно писать рабочие программы и, к сожалению, на Java.

Но мне, кстати, интересно посмотреть на альтернативные подходы к решению такой задачи. Сейчас тренд - это смесь функционального и объектно-ориентированного подходов. Много фич из мертвых языков 50-летней давности переползает в промышленные языки. Взять ту же Scala и Groovy.

Ian ★★
() автор топика
Последнее исправление: Ian (всего исправлений: 1)
Ответ на: комментарий от Begemoth

Насколько я знаю не выдаст. Я видел еще интересные примеры (в Java это Stax API), когда в самый верхнеуровневый интерфейс добавляются методы-проверки на конкретный тип, например, isUrlLink(), isSomethingElseLink(), isEvenMoreLink(), ну а в каждом наследнике этот метод реализуется.

Ian ★★
() автор топика
Ответ на: комментарий от Begemoth

нет ничего такого нету, но это и не надо можно самому кидать исключение какое-надо в default: т.е. один в один с выше написанным.

vtVitus ★★★★★
()
Ответ на: комментарий от Ian

Ну, вот ты сам и ответил на свой вопрос!

Для Java естественным и стандартным решением является visitor, для Scala — pattern matching. Юзай и наслаждайся!

Поиск истины в лиспах и прочей маргинальщине — тупиковый вариант. Причём, чтобы пройти его до конца, тебе придётся переписать твой проект на лиспе, написать LISP OS и создать LISP-компьютер. (Может, я описал немного гротескно, но суть «вирусности» лиспа, надеюсь, я передал.)

anonymous
()
Ответ на: комментарий от vtVitus

Вопрос был в обнаруживаемости ошибки при компиляции, а это полезно.

Begemoth ★★★★★
()
Ответ на: комментарий от Ian

Сейчас тренд - это смесь функционального и объектно-ориентированного подходов

ты удивишся(?), но в тренде (даже причина появления С++ согласно «дизайну и эволюции»)(как и заказчику(телефоная но не AT&T) (согласно интервью из mastermind..) objective-C)(причина появления версии юникс(11?) переименованую в plan-9)(как и обоснование golang)(и даже рудименты многоИсполнителей в жабке)- организация «распределённой» системы средствами обьектного императивизма в нутри и функциональности между обьектами.

qulinxao ★★☆
()
Ответ на: комментарий от anonymous

Надежды Макскома на превращение ЛОРа в «русскоязычный StackOverflow» не оправдались

Ты видимо из тех «специалистов», которые копипастят код из StackOverflow и без него не могут. Интерпрайз-специалист такой специалист.

anonymous
()
Ответ на: комментарий от anonymous

Вообще-то, идея о «русском StackOverflow» принадлежит Макскому, дословно.

Так что обосрался ты, друг мой борщевик.

anonymous
()
Ответ на: комментарий от anonymous

Так что обосрался ты, друг мой борщевик.

Нет ты.

anonymous
()
Ответ на: комментарий от Begemoth

По крайней мере в eclipse в этом случае будет предупреждение.

orm-i-auga ★★★★★
()
Ответ на: комментарий от Ian

Mv - скобканутый борщехлеб, а не «грамотный».

anonymous
()

Scala элегантнее, несомненно. Но я не знаю Scala :(

amazpyel ★★★
()
Ответ на: комментарий от qulinxao

тебя по-прежнему сложно читать. работай над рэч'ю. её забавно реверсить, но это так когнитивно неэргономичненько.

кстати, одна и та же задача, мультиплексирование и реализация телефонного PBX породила несколько принципиально разных вещей:

1. упоротый С++ на базе костылей симулы и битхакнутого форка BCPL с типами.

2. профессионалы делали Project Mac и MULTIX. любители хакали сначала Unics, а потом когда он скатился таки в СГ, и батька Столман с POSIX подпорками не помог — православный Plan 9 с REST API на уровне файловой системы. в Plan9 был rc шелл с лямбдами и plumbing с правилами регэкспами, вот где мякотка-то была.

присутствующий здеся vtVitus как-то распинался (+1 insightful, +2 visionary) про «True Unix Gui» — до tcl/tk он дошёл, странно что до Plan9 с plumbing — не добрался.

3. Эрланг и протоколы между блекбоксами против развесистого API C++ в говнобоксах.

опять же, почитай Армстронга. «малый шаг для человека, но большой шаг для человечества» — про подход как в шеллах и пайпах, plumbing между блекбоксами, а не развесистый Boost API недостаточно белых говнобоксов.

4. Melange DSL и его попсовый вариант — protobuf. TCP/IP spec как DSL

5. и все эти возрождения процессов Хоара, бритвой Окамма и прочих go вместе с rust — да, это всё тоже об этом.

anonymous
()
Ответ на: комментарий от anonymous

дай пруфлинк на Макскома, интересно. покамест банально огороженный тостер создаёт впечатление более культурного обчества, хотя вопросы там бывают в массе своей недалёкие.

анонимный срыв стека как-то более труъ — каждому у кого есть чё дать сказать по теме, и пусть не уйдут обиженные.

anonymous
()
Ответ на: комментарий от qulinxao

сюда же лимбо в инферне vs. андроед. и там, и там — телефонная звонилка, но сколько же лишнего не нужно во втором случае!

anonymous
()
Ответ на: комментарий от anonymous

тебе придётся переписать твой проект на лиспе

не тебе, а супер-умному компилятору, который безумный лиспер напишет.

не, ну а что, хипстерский node.js на базе JS — недоделанного Scheme с многими костылями — что ли лучше? но хипстеры и на этом пишут, они такие затейники.

или уже готовыми недолиспами — кложурой и кофескриптом.

anonymous
()
Ответ на: комментарий от qulinxao

и такое вот разнообразие язычков и подходов мне навевает мысль, что Страуструп, измученный нарзаномСимулой и сишечкой всё-таки не понимал чего-то более концептуального, дабы составить метатеорию всего и обошёлся сливной затычкою.

да он и объекты-то толком не понимал — скрестил свой геномутанта для Spore на скорую руку, и впирёт. нормальные объекты кому-то приходилось метакомпилятором типа moc или поначалу кодогенераторами с макросами городить.

незамкнуто относительно метаклассов, неаккуратненько, ага.

anonymous
()
Ответ на: комментарий от Ian

Но мне, кстати, интересно посмотреть на альтернативные подходы к решению такой задачи.

да хотя бы глянь на код Martini на Go, где активно пользуются ad-hoc интерфейсами, и посмотри, как там реализованы энкодеры форматов.

вот она, простота и ясность. а развесистое ООП не так чтобы уж сильно нужно.

anonymous
()

Т.е. хочется, чтобы класс Link был скорее структурой?

умные лисперы про это говорят: Interface Passing Style блогозапись

это если тебя действительно интересуют другие языки и подходы.

хотя CPS был известен далеко заранее, его дальныйшее развитие IPS — вещь относительно недавняя.

где-то она относительно просто сочетается с COM-интерфейсами или ad-hoc-интерфейсами в стиле go и даже более, где-то  — надо думать и строгать грубым рашпилем.

язычок Kernel с [Wand98] fexpr-ами — выдвигает этот IPS/CPS/..xPS на уровень языка, его eval/apply

anonymous
()
Ответ на: комментарий от anonymous

некий хипстер пишет интертрепатор православного kernel на поганом JavaScript

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

anonymous
()

(с интересом разглядывая шизофазические выблевы предыдущего оратора) Вот интересно. Это от маргинальщины так крыша едет?

Или же, наоборот, маргинальные технологии притягивают к себе изначально психически нестабильных личностей?

anonymous
()
Ответ на: комментарий от anonymous

хочешь поговорить об этом?

вещи не так просты, как тебе кажется. это твоё довольно поверхностное наблюдение.

не бывает просто так «шизофазических выблевов», бывает скрытая в листве структура, которую ты ниасилил и недозахотел понять.

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

anonymous
()
Ответ на: комментарий от anonymous

Больной: Родился на улице Герцена. В гастрономе № 22. Известный экономист. По призванию своему библиотекарь. В народе — колхозник. В магазине — продавец. В экономике, так сказать, необходим. Это, так сказать, система… эээ… в составе 120-и единиц. Фотографируйте Мурманский полуостров — и получаете te-le-fun-ken. И бухгалтер работает по другой линии. По линии «Библиотека». Потому что не воздух будет, а академик будет! Ну вот можно сфотографировать Мурманский полуостров. Можно стать воздушным асом. Можно стать воздушной планетой. И будешь уверен, что эту планету примут по учебнику. Значит, на пользу физики пойдет одна планета. Величина — оторванная в область дипломатии — дает свои колебания на всю дипломатию. А Илья Муромец дает колебания только на семью на свою. Спичка в библиотеке работает. В кинохронику ходит и зажигает в кинохронике большой лист. В библиотеке маленький лист разжигает. Агония будет вырабатываться гораздо легче, чем учебник крепкий. А крепкий учебник будет весомей, чем гастроном на улице Герцена. А на улице Герцена будет расщепленный учебник. Тогда учебник будет проходить через улицу Герцена, через гастроном № 22, и замещаться там по формуле экономического единства. Вот в магазине 22 она может расщепиться, экономика! На экономистов, на диспетчеров, на продавцов, на культуру торговли… Так что, в эту сторону двигается вся экономика. Библиотека двинется в сторону 120-и единиц, которые будут… эээ… предмет укладывать на предмет. 120 единиц — предмет физика. Электрическая лампочка горит от 120-и кирпичей, потому что структура у нее, так сказать, похожа у нее на кирпич. Илья Муромец работает на стадионе «Динамо». Илья Муромец работает у себя дома. Вот конкретная дипломатия! «Открытая дипломатия» — то же самое. Ну, берем телевизор, вставляем в Мурманский полуостров, накручиваем, там… эээ… все время черный хлеб… Дак что же, будет Муромец, что ли, вырастать? Илья Муромец, что ли, будет вырастать из этого?

Доктор: Обратите внимание на типичный случай шизофазии у больного.

Больной: тебе нужна подпорка-мейнстрим, чтобы кто-то похлопал тебя по плечу и утешил. и ты стабильно в ауте, поздравляю тебя, шарик!

Доктор: (понимающе кивает и делает пометки карандашиком)

anonymous
()
Ответ на: комментарий от anonymous

ты опять у маляров халат стырил, поциентишка?

anonymous
()
Ответ на: комментарий от anonymous

а, это ты, борщехлеб. что жы, опредёлённо есть ремиссия. твои мемы проявляются только со второго поста. это успех, ящитаю. только в дохтура больше не играй, поциент.

не узнал тебя сразу в гриме. думаю, дискуссия бессмысленна. можыт, перестанишь набигать в треды, когда

а) топикстартер интересуется другими, чем тебе известны, подходами

б) ему их предъявляют в виде мультиметодов

в) захотелось вдруг расширить и углубить, передать ему, топикстартеру, своё понимание: это ad-hoc интерфейсы, IPS, сообщения в стиле эрланга, Occam-процессы Хоара. это всё об одном, про диспетчеризацию методов. которую можно делать одиночной, множественной, или — вот так извращённо, вплоть до отдельных окружений в вау-выражениях.

г) набигает тут борщехлеб в халате маляра и глубокомыссленно утверждает, «ыыы я ниасил, тут оказывается думать надо, а это слишком сложно, проще зациклиться» . и предсказуемо циклится.

нет бы проходил мимо, писалось ведь не для тебя.

интересно, а так тебе сделать полный buffer overflow?

пруф оф концепт с озаloopливанием похоже работает, глядите-ка. от этой базы можно сделать больше.

anonymous
()
Ответ на: комментарий от anonymous

да, ты слился.

буквы — они такие, их понимать надо по сути, а не по форме возбуждаться.

вот к примеру

[Wand98]

Mitchell Wand. The Theory of Fexprs is Trivial. Lisp and Symbolic Computation, 10:189--199, 1998.

Abstract: We provide a very simple model of a reflective facility based on the pure lambda-calculus, and we show that its theory of contextual equivalence is trivial: two terms in the language are contextually equivalent iff they are alpha-congruent.

«два терма контекстуально эквивалентны тогда и только тогда, когда они альфа-конгруэнтны»

просто, ясно, прозрачно. что может быть проще этого?

но для тебя это немыслимое мумбо-юмбо и вообще шизофазиё.

а разгадка одна: ты и ковариантность и контравариантность ниасилил, куда уж тебе в альфа-конгруэнтность.

anonymous
()
Ответ на: комментарий от anonymous

Профессионал: (пишет программы, разрабатывает, внедряет и сопровождает системы)
Кукаретик: да ты и ковариантность и контравариантность ниасилил, куда уж тебе в альфа-конгруэнтность!
Профессионал: (пожимает плечами)

SRSLY, твоя альфа-конгруэнтность, контекстуальная эквивалентность, метациркулярные вычислители, зигохистоморфные препроморфизмы, анафорические лямбды, пандорические захваты и прочий яйцеголовый крэп неприменимы на практике и, следовательно, не несут пользы человечеству. Единственное, для чего пригоден этот крэп, — повышение ЧСВ для CS-фриков вроде тебя. Вам надо быть «не такими, как все»; это типичный юношеский комплекс, хорошо известный и описанный в литературе. Что там говорить, у многих взрослых есть потребность в том, чтобы выделиться. Только нормальные люди реализуют это за счёт своих персональных качеств: силы, таланта, интеллекта, тяжёлого труда, воли. А те, кому этого не хватает, пытаются выделиться внешней мишурой, например, покупая айфон.

Или вот при помощи лямбда-калькулюса, как ты.

anonymous
()
Ответ на: комментарий от anonymous

а за счёт чего пытаешься выделиться ты? судя по твоим убогим попыткам и стремлению встревать со своей позой, а не позицией, когда тебя не просят — ты пытаешься доказать что всё, что ты ниасилил — не нужно (и ладно бы субъективно только тебе, но ты ведь претендуешь на какую-то объективность?)

когда уж твоё-то мнение так точно можно смело умножать на 0 т.к. ты ниасиливал, ниасилил, и осиливать не собираешься.

забавно, да.

неужели всё так плохо, что ты умеешь выделяться только этим? занудным бормотанием аутотренинга как тот ёжик из анекдота перед зеркалом.

от небесного явления доской не отгородишься. а от прогресса — самоувещеванием --- тем более.

anonymous
()
Ответ на: комментарий от anonymous

а за счёт чего пытаешься выделиться ты?

А зачем мне это надо? Я же не ущербный, как ты. Мне не надо никому ничего доказывать.

А сюда я прихожу постебаться над такими, как ты. Помакать вас мордой в говнецо — одно удовольствие.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.