|
|
|
Ставлю под сомнение полезность private, public и protected
|
|||
|---|---|---|---|
|
#18+
maXmoпро кирпич, имхо подразумевалось следующее: если строишь дом из кирпичей, то их можно ложить друг на друга, а можно по спирали (в этом случае всё развалится), Отнюдь. Недалено от меня есть весь из себя закругленный в завитках кирпичный дом. maXmo а если ты строишь панельный дом, вероятность напортачить снижается. Отнюдь :)) Вопрос в том, что из кирпичей можно сложить практически любую заданную поверхность, в то время как из панелей - вариантов довольно мало. Зато панельный дом строится.. заметно быстрее, назовем так. Задачей программиста является выбрать подходящий стройматериал; выбрать так, чтобы с одной стороны он не ограничивал больше, чем надо, с другой - не тормозил больше, чем надо. maXmoкстати, интересная штука с протектедом. Вот, скажем, определяем мы метод протектедом. Другой прогер берёт, наследует наш класс и зеркалит протектед методы с свои паблик. Просто тупо зеркалит. И смысл тогда в протектеде? Все нормально. Тот, другой прог принимает ответственное решение. Он отвечает за то, что этот метод входит в интерфейс его класса, безопасен итп. Вполне возможно, для его потомка - более узкого класса - это нормально и правильно, в то время как для широкого базового - недопустимо. Возможно, он не просто публикует, а снабжает дополнительными проверками. Итп. Это уже его зона ответственности; в том числе если через этот метод сломают работу его объекта, бить будут именно его. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2006, 22:28 |
|
||
|
Ставлю под сомнение полезность private, public и protected
|
|||
|---|---|---|---|
|
#18+
я не отрицаю, что баги можно победить, но при использовании инструментов, позволяющих много что делать и тормозящих производство, приходится постоянно много всего помнить и много за чем следить и очевидно, что тут легче за чем-нибудь не уследить. И если явные ошибки можно поправить, не отходя от кассы, то есть свести их к нулю, то число ускользнувших ошибок так просто не уменьшить. В свете факта, что в раздробленном проекте легче допустить ошибку, получаем, что в таком проекте больше багов при прочих равных условиях. softwarerесли через этот метод сломают работу его объекта, бить будут именно его.это тоже часть идеологии ооп? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2006, 23:28 |
|
||
|
Ставлю под сомнение полезность private, public и protected
|
|||
|---|---|---|---|
|
#18+
maXmo softwarerесли через этот метод сломают работу его объекта, бить будут именно его.это тоже часть идеологии ооп? Именно. ООП - прямое развитие концепции модульного программирования, где собственно и была выдвинута мысль об отделении интерфейса от реализации и в том числе об ответственности каждого за свой модуль (и свободе выбирать/менять его реализацию) при сохранении заранее спроектированного интерфейса взаимодействия. Разумеется, с точки зрения "идеальной защиты" любая возможность "залезть внутрь" нехороша. Но protected с моей точки зрения является удачным компромиссом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.05.2006, 16:07 |
|
||
|
Ставлю под сомнение полезность private, public и protected
|
|||
|---|---|---|---|
|
#18+
maXmoприходится постоянно много всего помнить и много за чем следить Не хотелось бы соглашаться. С моей точки зрения ключевой вопрос технологии разработки - как раз максимальная ликвидация таких вот "нервных узлов". Нужно делать так, чтобы в каждом конкретном месте, в каждый конкретный момент времени не требовалось "много помнить и много следить". Да, суммарно конечно много - но в каждом конкретном случае достаточно думать о минимуме "соседей". Если подход не обеспечивает - неизбежно (имхо) будет выстроено "перманентно разваливающееся приложение". Цитируя одного из экс-коллег - "За последний год мы ни разу не смогли сделать серьезное изменение, ничего при этом не сломав". Я помню несколько случаев, когда приходилось тратить кучу времени на отлов очень неочевидных проблем, возникавших на стыке нескольких "и так сойдет" решений. maXmoВ свете факта, что в раздробленном проекте легче допустить ошибку, получаем, что в таком проекте больше багов при прочих равных условиях. Я не очень представляю себе "равные условия", о которых можно говорить в таком контексте. С моей точки зрения, для проекта существует некоторая "оптимальная по сложности схема реализации", определяемая набором критериев типа "сложность компонент", "сложность связей между компонентами", "степень совместимости", "наличие скрытых связей", "наличие дальних зависимостей" и наверняка еще много что. Аналогия со строительством тут получается достаточно условной, но: если Ваша задача - сложить избу-пятистенку (прямоугольник со внутренней стеной), то спроектировать ее строительство из кирпича будет легче, нежели из бревен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.05.2006, 16:27 |
|
||
|
Ставлю под сомнение полезность private, public и protected
|
|||
|---|---|---|---|
|
#18+
авторНужно делать так, чтобы в каждом конкретном месте, в каждый конкретный момент времени не требовалось "много помнить и много следить". давно както встречал исследование психологов. Там был вывод, что человек (в смысле средний, разброс характеристик есть, конечно) не может держать в голове более 8 -10 сущностей. В принципе, требование описать решаемую задачу /* "описать решаемую задачу" на русский переводится как написать программу. очень желательно, чтобы сущности были согласованны с предыдущим образованием и другими областями жизни программиста. пример. симметричная операция сравнения в клиппере является примером не согласованной сущности, которая тянет необходимость "помнить много". одновременно может выполняться а=б and б != а */ за минимальное количество сущностей (уже существующих или созданных) /* на текущем языке сущность можно читать как обьект */ и есть требование, из которого будет следовать не нужность много помнить. язык, который позволяет описывать более широкий класс задач минимальным количеством сущностей и есть хороший язык программирования. задача решается тщательным проэктированием и правильной архитектурой системы. в силу размытости понятия сущность - в качестве приблизительной оценки можно использовать другие характеристики - такие как количество строчек или количество лексем в программе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.05.2006, 21:32 |
|
||
|
Ставлю под сомнение полезность private, public и protected
|
|||
|---|---|---|---|
|
#18+
softwarerНе соглашусь. С одной стороны, легче использовать каждый конкретный кубик, с другой стороны время решения задачи (aka построения дома) при черезчур мелких кубиках стремительно растет. Именно поэтому необходимо искать некий наиболее удачный промежуточный размер. Между строительством домика и складыванием кубиков программистами есть существенная разница. Каменщик не может сложить из 5 кирпичей блок и дальше использовать только его, а программист может. Поэтому черезмерное дробление не представляет фатальной проблемы. softwarerХм. "Использовать кубик неправильно" - имхо несколько бессмысленное словосочетание, приобретающее смысл только в неправильных кубиках. Хм. Кубики ака микросхемы существенно большим количеством способов можно использовать не правильно, чем правильно. А что бы использовать их правильно, нужно _знать как_. Мне кажется аналогия с программированием здесь уместа. softwarerЭто другая грань той же проблемы; правильный кубик, используя в соответствии с публикуемым им интерфейсом, просто невозможно использовать "неправильно". Если публикуемым интерфейсом называть public члены класса, то не согласен. В этом случае кубиков, которых невозможно использовать неправильно, либо не существует, либо существует очень мало. Пользованию _любым_ компонентом нужно учиться. Особенно если скакать с языка на язык, т.к. приёмы принятые в различных коммунити различаются. Называть кубик "правильным" только из-за того, что на интуитивном уровне понятно как его использовать не совсем правильно, поскольку это сугубо субъективная оценка. Каждый кубик реализует некий интерфейс (в широм смысле этого слова). Интерфейс включает в себя пред и пост условия методов, инварианты класса, ограничения на возможные значения параметров методов и полей класса. Сюда же можно добавить предполагавшиеся при разработке сценарии использования. Если программист начинает делать с компонентом что-то, что не описывается в интерфейсе, он использует компонент _неправильно_. softwarer Мало того, в правильном кубике вообще говоря стоит минимизировать предположения о том, как он будет использоваться - иначе кубик получится неуниверсальным. Допустим, кирпич. Его интерфейс - это габариты, прочность и прочее. И хотя Вы можете полагать, что из него правильно складывать дома, на самом деле его ничуть не хуже можно использовать как гнет для квашенья капусты. Отрицаю Такой Подход. Универсальность может быть только следствием хорошего проектирования. Хорошего проектирование включает в себя - объявление интерфейса удобного для решения определённых (но всех на свете) задач - отделение деталей реализации от реализуемого интерфейса, если в этом есть необходимость - объявление точек расширения Разарботка "простого" кода и "универсального" требует существенно разного вклада труда и времени. На этом разрыве кормятся refactoring и паттерны ооп, развивающие идею повторного использования уже написанного кода через copy-paste. Про SQL: softwarer Кроме того, существует определенная иерархия инкапсуляции внутри объекта-схемы - скажем, таблица предоставляет свой интерфейс (поля, методы для запроса-изменения), но скрывает детали реализации (индексы, ограничения). Наконец, существует естественный уровень абстрагирования, интерфейсы "по имени" - скажем, я в любой момент могу переименовать таблицу, создать view с тем же именем, и все ранее табличные операции будут работать с этим view. Ну, пакеты предоставляют просто-таки классическую инкапсуляцию (и без них программировать уже.. очень тоскливо). Речь шла именно об этом (хотя акробатические упражнения с view'ками, ролями и сторед процедурами дело, безусловно, занимательное): интерфейс таблицы это все её поля + констрейнты на эти поля. Сокрытие данных и построение эффективных sql запросов вступают друг с другом в конфликт. Так? softwarer NotGonnaGetUsЕсли требуется открыть доступ только наследникам класса, что вполне "правильное"(?) желание, то сделать этого не получится. Ну, это всего лишь дружественность, которую, с моей точки зрения, стоило бы выбросить и из дельфы, и из явы, и из плюсов. Т.е. это было плохое желание и видимость должны быть только public и private? softwarerЕсли я решил взять пакет X.Y.Z и отрефакторить его на X.Y.Z.T1, X.Y.Z.T2 и X.Y.Z.T3, это запросто приведет к вороху ошибок недоступности. Пакеты отдельная песня. softwarerПозволю себе указать на то, что проблема в Вашем случае возникает из-за одного несоответствия: Вы хотите сделать команду (операцию редактирования) членом класса, методом, а вот в реализации отката применить нечто внешнее. Небольшое уточнение. Речь идёт о визуальном редакторе html документов (кем и когда писался не знаю). В наличии имелись сильно связанные классы Workspace и Container. Workspace имеет нескольких наследников и содержит код манипулирующий Container'ом (модификация и отрисовка). Contianer скрывает хитро организованную структуру из двусвязных индексированных списков двухсвязных индексированных списков :)(параграф/строка/слово/символ/element+style) . Нужно было заменить реализацию операции undo c полного сохранения содержимого контейнера на сохранение только изменившейся части (из-за out of memory). Стоит заметить, что кроме операций вставки/удаления были такие операции как форматирование и изменение шрифтов, обратные операции для которых тесно связаны с внутренним устройством контейнера. Как обычно, искалось решение минимизирующее наведённые ошибки и время на реализацию. Я согласен, "идеалогически верный паттерновый вариант" более качественное решение, но вопрос был не в этом. Описанное мной решение имеет право на жизнь (как минимум в виде эволюционного шага на пути к высшему идеалу) и ппп не может его обслужить. softwarerЯ не понимаю, зачем здесь нужно "передачи закрытых данных". Вся суть этого паттерна - я бы его скорее назвал "Алгоритм" - в абстрагировании от закрытых данных обрабатываемого объекта. Я, в свою очередь, не понимю зачем ограничиваться только этим вариантом. Суть паттерна - использовать для выбора "алгоритма" полиморфизм вместо условных операторов. C какими данными будет работать алгоритм, закрытыми или открытыми, уже не важно. softwarer Не согласен. Например, можно сделать класс "алгоритм сортировки", работающий с интерфейсом типа [getCount();compare(int,int)]. И после этого можно сделать стратегию "Сортировка", параметризуемую алгоритмом и коллекцией Comparable объектов. Решительно не вижу, где здесь "один правильный класс" из объединения этих объектов. Гхм. Стратегия это метод превращённый в объект. Так же как метод - часть класса, так же и стратегия - часть класса. Понятно, можно вывернуть данный патерн наизнанку превратив в вариацию на тему template method, где не стратегия выбирается под контекст, а контекст под стратегию, но суть останется той же: всех участники взаимодействия связаны друг с другом. Я использовал слова "один правильный класс" для обозначения этой связности, не более того. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2006, 14:37 |
|
||
|
Ставлю под сомнение полезность private, public и protected
|
|||
|---|---|---|---|
|
#18+
NotGonnaGetUsМежду строительством домика и складыванием кубиков программистами есть существенная разница. Каменщик не может сложить из 5 кирпичей блок и дальше использовать только его, а программист может. Если программист так поступит, и это окажется уместным - он именно что "найдет удачный стройматериал", как я и предлагаю. Мало того, каменщик тоже может. Один из вариантов такого блока и называется панелью ;) NotGonnaGetUsПоэтому черезмерное дробление не представляет фатальной проблемы. Фатальной - нет. Но представьте себе, что каждый дом нужно начинать со сборки кирпича из крошек, и только потом этот кирпич можно будет использовать.... Не думаю, что Вам понравится такая технология. Полагаю, Вам сразу захочется собрать кирпич один раз и использовать его во всех проектах. NotGonnaGetUsЕсли публикуемым интерфейсом называть public члены класса, то не согласен. В этом случае кубиков, которых невозможно использовать неправильно, либо не существует, либо существует очень мало. Разумеется, получить от кубика нужный результат не так-то легко - нужно как минимум знать соответствующий метод. Я о том, что любой результат, полученный от правильного кубика, будет корректным. Если кирпичи класть не в той последовательности, домик получится не той формы, но не развалится - примерно так (хотя для кирпичей это правильно не выполняется - слишком уж свободный у них интерфейс). NotGonnaGetUsт.к. приёмы принятые в различных коммунити различаются. Я не думаю, что "правильность" определяется "принятым в данном коммьюнити". Максимум, что этим определяется - "читаемость" кода; это не единственный критерий качества. NotGonnaGetUsИнтерфейс включает в себя пред и пост условия методов, инварианты класса, ограничения на возможные значения параметров методов и полей класса. И методы проверяют эти условия-ограничения, выкидывая исключения. Все корректно. NotGonnaGetUsСюда же можно добавить предполагавшиеся при разработке сценарии использования. А вот с этим нужно очень аккуратно. Понятно, что в любом случае предполагается какой-то сценарий, но если программист закладывается на "здесь играем, здесь переворачиваем", получается автоматически рассыпающийся код. Собственно, если в класс заложен один или несколько узких сценариев, можно (и нужно) сделать метод(ы) с соответствующим (большим) количеством параметров, выполняющий этот сценарий. NotGonnaGetUsЕсли программист начинает делать с компонентом что-то, что не описывается в интерфейсе, он использует компонент _неправильно_. Сценарий использования не входит в интерфейс хорошего кубика. Хотя, разумеется, полезна информация вида "если хотите получить А, не забудьте в какой-то момент сделать Б". NotGonnaGetUs softwarerИ хотя Вы можете полагать, что из него правильно складывать дома, на самом деле его ничуть не хуже можно использовать как гнет для квашенья капусты. Отрицаю Такой Подход. Значит, остается мало тем для разговора. NotGonnaGetUsУниверсальность может быть только следствием хорошего проектирования. Нет. Хорошее проектирование недостаточно для универсальности; рискну даже сказать, что оно необязательно. Хотя безусловно полезно. NotGonnaGetUsРазарботка "простого" кода и "универсального" требует существенно разного вклада труда и времени. Нет. Разработка универсального кода требует более высокого уровня разработчика при мало отличающихся затратах времени. NotGonnaGetUsинтерфейс таблицы это все её поля + констрейнты на эти поля. Сокрытие данных и построение эффективных sql запросов вступают друг с другом в конфликт. Так? Давайте посмотрим аналогию этого в традиционном ООП. Допустим, у Вас есть интерфейс "контейнер" и два варианта его реализации; один с O(n) добавлением и O(log n) поиском, другой O(1)/O(n) соответственно. Есть некий код, использующий контейнер. В зависимости от специфики его операций Вы выбираете ту или другую реализацию. И где здесь нарушение инкапсуляции? NotGonnaGetUs softwarerНу, это всего лишь дружественность, которую, с моей точки зрения, стоило бы выбросить и из дельфы, и из явы, и из плюсов. Т.е. это было плохое желание и видимость должны быть только public и private? Ээ... я, кажется, просил выбросить дружественность, а не protected. NotGonnaGetUsКак обычно, искалось решение минимизирующее наведённые ошибки и время на реализацию. Я согласен, "идеалогически верный паттерновый вариант" более качественное решение, но вопрос был не в этом. Описанное мной решение имеет право на жизнь (как минимум в виде эволюционного шага на пути к высшему идеалу) и ппп не может его обслужить. Иначе говоря, Вы ставите в упрек ппп то, что в нем нельзя "очень хорошо" сделать "не очень хорошее решение". Согласитесь, это выглядит почти комплиментом в его адрес :) Да, можно искать идеал. И даже нужно. Но с моей точки зрения в первую очередь нужно, чтобы технология позволяла "очень хорошо" делать "очень хорошие" решения. Это то, чем нельзя жертвовать. Если получается без потерь здесь облегчить еще что-то - еще лучше. Нет? Так нет. NotGonnaGetUsЯ, в свою очередь, не понимю зачем ограничиваться только этим вариантом. Потому что это как минимум будет другой паттерн. И я его не то чтобы понимаю. NotGonnaGetUsСуть паттерна - использовать для выбора "алгоритма" полиморфизм Безусловно. Полиморфизм - то есть виртуальные методы - это открытая часть объекта, интерфейс. Или мы о виртуальных приватных методах? :) NotGonnaGetUsвместо условных операторов. C какими данными будет работать алгоритм, закрытыми или открытыми, уже не важно. Как раз важно. Если алгоритм пытается работать с закрытыми данными - значит, в нем не удастся обойтись без условного оператора типа "если класс X, то берем его закрытое данное Y, иначе Z". Почему: потому что реализация может быть изменена. Даже если в далеком потомке Xn есть данное Y - не факт, что оно используется; возможно, что оно тупо унаследовано, а реализация давно опирается на Yn. То есть алгоритм, паттерн "Стратегия" теряет свою универсальность, теряет возможность работать с произвольным подставляемым потомком. NotGonnaGetUsСтратегия это метод превращённый в объект. Допустим. Хотя это несколько отдает в философию. NotGonnaGetUsТак же как метод - часть класса, так же и стратегия - часть класса. Нет, не так же. Стратегия - это обобщенный алгоритм, метод - максимум конкретная реализация обобщенного алгоритма. Давайте снова посмотрим на стратегию "Сортировка". Ее можно применить очень много к чему; это не есть, допустим, "часть класса ResultSet" или "часть класса DefaultListModel". NotGonnaGetUsно суть останется той же: всех участники взаимодействия связаны друг с другом. "Связаны" вовсе не обязательно значит "лазают друг другу в приват". NotGonnaGetUsЯ использовал слова "один правильный класс" для обозначения этой связности, не более того. Хм. С этой точки зрения любая программа является "одним правильным классом". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2006, 22:22 |
|
||
|
Ставлю под сомнение полезность private, public и protected
|
|||
|---|---|---|---|
|
#18+
softwarerМало того, каменщик тоже может. Один из вариантов такого блока и называется панелью ;) ... представьте себе, что каждый дом нужно начинать со сборки кирпича из крошек, и только потом этот кирпич можно будет использовать.... Не думаю, что Вам понравится такая технология. Полагаю, Вам сразу захочется собрать кирпич один раз и использовать его во всех проектах. Каменщик не делает новых материалов, он использует готовые. Программист может создавать материалы под себя и использовать без повторного процесса сборки. Если бы нас читали молдоване-строители, они оценили бы. softwarer Я о том, что любой результат, полученный от правильного кубика, будет корректным. Если кирпичи класть не в той последовательности, домик получится не той формы, но не развалится - примерно так (хотя для кирпичей это правильно не выполняется - слишком уж свободный у них интерфейс). Ещё как развалится. Сколько в Москве сооружений уже рухнуло (сделанных не из кирпичей)? softwarer NotGonnaGetUsИнтерфейс включает в себя пред и пост условия методов, инварианты класса, ограничения на возможные значения параметров методов и полей класса. И методы проверяют эти условия-ограничения, выкидывая исключения. Все корректно. Если в комментарии к методу написано "проверь ограничения прежде чем меня дёргать", то метод НИЧЕГО НИКОМУ не должен. Мы уже об этом говорили раньше и так не пришли к взаимному понимаю :) Если программист привык к опередлённым шаблонам, ожидал встретить их же в другой среде и не встертил, виноват он сам. softwarer NotGonnaGetUsСюда же можно добавить предполагавшиеся при разработке сценарии использования. А вот с этим нужно очень аккуратно. Понятно, что в любом случае предполагается какой-то сценарий, но если программист закладывается на "здесь играем, здесь переворачиваем", получается автоматически рассыпающийся код. Собственно, если в класс заложен один или несколько узких сценариев, можно (и нужно) сделать метод(ы) с соответствующим (большим) количеством параметров, выполняющий этот сценарий. Ну и хрен с этими параметрами, если код будет работать, т.к. работать он начнёт существенно быстрее. После этого 10 минут на рефакторинг и методы с большим количеством параметров превратятся несколько классов с небольшими, понятными методами. Если культурный уровень программиста высок, то он никогда не пропустит последний шаг. Если пропустит - уволить. softwarer Сценарий использования не входит в интерфейс хорошего кубика. Хотя, разумеется, полезна информация вида "если хотите получить А, не забудьте в какой-то момент сделать Б". Это информация не "полезна", а "обязательна". В интерфейс входит всё, что не обходимо для корректной работы с компонентом. Интерфейс может быть _не удобным_, но это уже абсолютно другая тема для разговора: "как сделать интерфейс удобным". softwarer Нет. Хорошее проектирование недостаточно для универсальности; рискну даже сказать, что оно необязательно. Хотя безусловно полезно. Нет. Разработка универсального кода требует более высокого уровня разработчика при мало отличающихся затратах времени. Кто-нибудь ещё в это верит? softwarer Давайте посмотрим аналогию этого в традиционном ООП. Я разве просил привести аналогию? softwarer NotGonnaGetUs softwarerНу, это всего лишь дружественность, которую, с моей точки зрения, стоило бы выбросить и из дельфы, и из явы, и из плюсов. Т.е. это было плохое желание и видимость должны быть только public и private? Ээ... я, кажется, просил выбросить дружественность, а не protected. Ну объясните же мне, глупому, что такое дружественность? А то все мои догадки о том, что же вы вмещаете в это слово не находят подтверждения. softwarer Иначе говоря, Вы ставите в упрек ппп то, что в нем нельзя "очень хорошо" сделать "не очень хорошее решение". Согласитесь, это выглядит почти комплиментом в его адрес :) Я ставлю в упрёк ппп только одно: это очень грубый механизм сокрытия реализации. Эффективно удаётся только полное открытие или сокрытие информации. Промежуточные варианты не обслуживаются в должной мере. Возмите простую библиотеку. Пусть она состоит из двух пакетов. Один пакет содержит ссылку на другой пакет, являсь своего рода фасадом для него. Все что этот фасад скрывает (ссылки на объекты из другого пакета), будут доступны для третьего пакета. Только не надо предлагать всё засунуть в один пакет. softwarer NotGonnaGetUsЯ, в свою очередь, не понимю зачем ограничиваться только этим вариантом. Потому что это как минимум будет другой паттерн. И я его не то чтобы понимаю. Это будет ровно тот же паттерн. softwarer NotGonnaGetUsСуть паттерна - использовать для выбора "алгоритма" полиморфизм Безусловно. Полиморфизм - то есть виртуальные методы - это открытая часть объекта, интерфейс. Или мы о виртуальных приватных методах? :) А? Вы про что? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Код: plaintext 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. softwarer NotGonnaGetUsвместо условных операторов. C какими данными будет работать алгоритм, закрытыми или открытыми, уже не важно. Как раз важно. Если алгоритм пытается работать с закрытыми данными - значит, в нем не удастся обойтись без условного оператора типа "если класс X, то берем его закрытое данное Y, иначе Z". Ерунда. Где этот условный оператор в примере выше? softwarer То есть алгоритм, паттерн "Стратегия" теряет свою универсальность, теряет возможность работать с произвольным подставляемым потомком. C чего ради деталь реализации должнать обладать мистической универсальностью, простирающейся за границы реализации? softwarer NotGonnaGetUsТак же как метод - часть класса, так же и стратегия - часть класса. Нет, не так же. Стратегия - это обобщенный алгоритм, метод - максимум конкретная реализация обобщенного алгоритма. Давайте снова посмотрим на стратегию "Сортировка". Ее можно применить очень много к чему; это не есть, допустим, "часть класса ResultSet" или "часть класса DefaultListModel". Обобщённый алгоритм - это template method. Никто не мешает скрестить Strategy и Template method, для того чтобы осуществлять выбор конкретного template method'a не условными операторами, а за счёт полиморфизма, но почему это должно быть единственным способом использовать паттерн strategy? softwarer "Связаны" вовсе не обязательно значит "лазают друг другу в приват". "Связаны" вовсе не обязательно значит "не лазают друг другу в приват". softwarer NotGonnaGetUsЯ использовал слова "один правильный класс" для обозначения этой связности, не более того. Хм. С этой точки зрения любая программа является "одним правильным классом". Связь классами бывает разная. Бывают сильно связанные, бывают слабо. Сильное связывание одно из явлений, с которым надлежит бороться (grasp). Паттерны ООП, в частности strategy, command, visitor, composite приводят к сильному связыванию, но им это не ставится в вину, т.к. они решают технические задачи, которые не возможно решить стандартными средствами, не ударившись в жёсткий copy-past. "один правильный класс" это набор таких сильно связаных классов. Если программа является "одним правильным классом", то модифицировать её задача для сильных духом садомазахистов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.05.2006, 14:43 |
|
||
|
Ставлю под сомнение полезность private, public и protected
|
|||
|---|---|---|---|
|
#18+
NotGonnaGetUsПрограммист может создавать материалы под себя и использовать без повторного процесса сборки. И? Вы повторили ровно то же, что я сказал в том, на что Вы отвечаете. Не понял, что из этого следует. NotGonnaGetUsЕсли в комментарии к методу написано "проверь ограничения прежде чем меня дёргать", то метод НИЧЕГО НИКОМУ не должен. Даже если в комментарии ничего не написано, метод тоже НИЧЕГО НИКОМУ НЕ ДОЛЖЕН. Вопрос ровно в одном - хороший ли это метод, класс итп. И тут существует простая аналогия: с "Вашей" точки зрения в документации к программе можно написать "не надо нажимать кнопку X в ситуации Y" - и если пользователь таки нажмет ее, программа НИЧЕГО НИКОМУ НЕ ДОЛЖНА. Я согласен с тем, что такая постановка вопроса в принципе имеет право на существование. Но она - неудобна. И я (да и не только я) полагаю, что ХОРОШАЯ программа ДОЛЖНА обрабатывать ошибки и в целом создавать пользователю максимально простой и удобный контекст работы. Любой стандартный код - точно такая же программа, которой пользуется "конечный программист". И требования к ней принципиально те же. NotGonnaGetUsЕсли программист привык к опередлённым шаблонам, ожидал встретить их же в другой среде и не встертил, виноват он сам. Не надо лирики. Если мусоропровод соседской квартиры заканчивается над Вашей кроватью - это не означает, что Вы привыкли к другим шаблонам и сами виноваты. Это означает хреново спроектированный дом. NotGonnaGetUsНу и хрен с этими параметрами, если код будет работать, Безусловно. Просто это уже не класс в его нормальном смысле. Это частный случай сомнительной разумности. NotGonnaGetUs softwarer Сценарий использования не входит в интерфейс хорошего кубика. В интерфейс входит всё, что не обходимо для корректной работы с компонентом. Интерфейс может быть _не удобным_, но это уже абсолютно другая тема для разговора: "как сделать интерфейс удобным". Вы случайно не обратили внимания на слово "хорошего"? Как разрабатывать плохие интерфейсы - тема, мне неинтересная, и я ее здесь старательно избегаю. Везде - и в большинстве случаев явно - я говорю о хорошем интерфейсе. Что означает в том числе и "удобный". NotGonnaGetUs softwarerДавайте посмотрим аналогию этого в традиционном ООП. Я разве просил привести аналогию? Я предлагаю Вам ее посмотреть. Этого мало? NotGonnaGetUsНу объясните же мне, глупому, что такое дружественность? "Черный ход", благодаря которому можно получить доступ к закрытой информации неродственного класса. В C++ можно явно объявить классы дружественными, после чего они получают возможность лазить друг другу в приват. В дельфе для этого нужно описать классы в одном файле, в яве - в одном пакете. Собственно, по тому, что Вы говорите, у меня складывается ощущение, что сиплюсплюсная реализация дружественности Вам очень понравится. NotGonnaGetUs softwarer Иначе говоря, Вы ставите в упрек ппп то, что в нем нельзя "очень хорошо" сделать "не очень хорошее решение". Согласитесь, это выглядит почти комплиментом в его адрес :) Я ставлю в упрёк ппп только одно: это очень грубый механизм сокрытия реализации. На декларативном уровне - да. И приводите "не очень хороший" пример этого, в то время как пример хорошего решения той же задачи не упирается в упрекаемую Вами суровость ппп. NotGonnaGetUsВозмите простую библиотеку. Пусть она состоит из двух пакетов. Один пакет содержит ссылку на другой пакет, являсь своего рода фасадом для него. Все что этот фасад скрывает (ссылки на объекты из другого пакета), будут доступны для третьего пакета. Только не надо предлагать всё засунуть в один пакет. ППП тут совершенно не при чем. Я не понимаю, нафига может потребоваться описанная конструкция, но если нужна - это претензия к отсутствию в языке понятия "приватного пакета". Да, нет такого. По мне - так и хорошо, что нет. Но в любом случае "классовые" ппп тут ни к селу, ни к городу. NotGonnaGetUsЕрунда. Где этот условный оператор в примере выше? Там же, где работа с чужими скрытыми данными. NotGonnaGetUs softwarerТо есть алгоритм, паттерн "Стратегия" теряет свою универсальность, теряет возможность работать с произвольным подставляемым потомком. C чего ради деталь реализации должнать обладать мистической универсальностью, простирающейся за границы реализации? Хм. "На предыдущем допросе" (с) Вы сказали, что суть этого паттерна - в использовании полиморфизма для выбора реализации. Нельзя ли тогда пояснить, в чем с Вашей точки зрения состоит смысл полиморфизма, если при этом желание использовать потомка вместо предка объявляется "мистической универсальностью"? NotGonnaGetUsТак же как метод - часть класса, так же и стратегия - часть класса. Обобщённый алгоритм - это template method. Никто не мешает скрестить Strategy и Template method, для того чтобы осуществлять выбор конкретного template method'a не условными операторами, а за счёт полиморфизма, но почему это должно быть единственным способом использовать паттерн strategy? Хм. Чтобы сократить объем: даже если это "не единственный" метод, первое процитированное здесь утверждение - на которое я отвечал - уже не верно. Поскольку существует контрпример. NotGonnaGetUs softwarer "Связаны" вовсе не обязательно значит "лазают друг другу в приват". "Связаны" вовсе не обязательно значит "не лазают друг другу в приват". Безусловно. "Не лазают друг к другу в приват" - означает "нормально спроектированные классы", не более того. NotGonnaGetUsПаттерны ООП, в частности strategy, command, visitor, composite приводят к сильному связыванию, но им это не ставится в вину, т.к. они решают технические задачи, которые не возможно решить стандартными средствами, не ударившись в жёсткий copy-past. Пока что это как минимум бездоказательное утверждение. Судя по всему, Вы сейчас употребляете "сильно связанные" в смысле "может понадобиться лазить друг к другу в приват". Это так? NotGonnaGetUs"один правильный класс" это набор таких сильно связаных классов. OK, терминология принимается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.05.2006, 16:52 |
|
||
|
Ставлю под сомнение полезность private, public и protected
|
|||
|---|---|---|---|
|
#18+
softwarer NotGonnaGetUsПрограммист может создавать материалы под себя и использовать без повторного процесса сборки. И? Вы повторили ровно то же, что я сказал в том, на что Вы отвечаете. Не понял, что из этого следует. Э... В таком случае, вы повторили ровно тоже, что я сказал, перед тем как вы сказали то, на что я отвечаю :) softwarer Я согласен с тем, что такая постановка вопроса в принципе имеет право на существование. Но она - неудобна. ... Не надо лирики. Если мусоропровод соседской квартиры заканчивается над Вашей кроватью - это не означает, что Вы привыкли к другим шаблонам и сами виноваты. Это означает хреново спроектированный дом. Не удобна не постановка вопроса, а интерфейс компонента. А удобство интерфейса, как я уже сказал, отдельная тема. Если его и обсуждать, то в отдельном топике. softwarer NotGonnaGetUsНу и хрен с этими параметрами, если код будет работать, т.к. работать он начнёт существенно быстрее. После этого 10 минут на рефакторинг и методы с большим количеством параметров превратятся несколько классов с небольшими, понятными методами. Если культурный уровень программиста высок, то он никогда не пропустит последний шаг. Если пропустит - уволить. Безусловно. Просто это уже не класс в его нормальном смысле. Это частный случай сомнительной разумности. А что такое класс в нормальном смысле? Я думал, что класс это то, что начинется со слов "class Name {" :) softwarer NotGonnaGetUs softwarer Сценарий использования не входит в интерфейс хорошего кубика. В интерфейс входит всё, что не обходимо для корректной работы с компонентом. Интерфейс может быть _не удобным_, но это уже абсолютно другая тема для разговора: "как сделать интерфейс удобным". Вы случайно не обратили внимания на слово "хорошего"? Это слово отражает объективную характеристику класса или субъективную? Если субъективную, к каковым относится и удобство, то не вижу смысла обращать на него внимание. softwarer Как разрабатывать плохие интерфейсы - тема, мне неинтересная, и я ее здесь старательно избегаю. Везде - и в большинстве случаев явно - я говорю о хорошем интерфейсе. Что означает в том числе и "удобный". Как раз это лирика + отдельная тема. softwarerЯ предлагаю Вам ее посмотреть. Этого мало? Посмотрел. Инкапсуляция не нарушается. Просто пример не удобного интерфейса. Программиста обязывают подставлять только определённый тип структуры данных. Это вызвано, скорее всего, плохим проектированием иерархии интерфейсов для этой структуры данных. Если бы были интерфейсы XXX, YYY, ... уточняющие врменные характеристики, то забота о выполение условия перешла бы с плеч программиста на компилятор. Я не вижу связи с тем, о чём я спрашивал. softwarer "Черный ход", благодаря которому можно получить доступ к закрытой информации неродственного класса. В C++ можно явно объявить классы дружественными, после чего они получают возможность лазить друг другу в приват. В дельфе для этого нужно описать классы в одном файле, в яве - в одном пакете. В java файлы из одного пакета не будут лазить друг другу в приват. Тогда проясните ещё один момент. Я выявил желание определить компонент класса доступным _только_ в нём и его наследниках и оказалось, что это не возможно. Вы сослались на дружественность, что звучит фактически как приговор: моё желание плохой дизайн. Я поперхнулся и дважды переспросил, пытаясь понять, правильно я трактовал эту ссылку, но тема ушла куда-то в сторону. Какова всё-таки ваша точка зрения? NotGonnaGetUs Собственно, по тому, что Вы говорите, у меня складывается ощущение, что сиплюсплюсная реализация дружественности Вам очень понравится. Нет. Мне нравится вариант предложенный Мейером и реализованный в Eiffel. Видимости связанной с пакетами не существует. Компонент может быть видим всем, никому или наследникам кого-то (при этом наследник может отказаться от наследства и никто не сможет его после этого прикастить к предку). softwarer На декларативном уровне - да. И приводите "не очень хороший" пример этого, в то время как пример хорошего решения той же задачи не упирается в упрекаемую Вами суровость ппп. ППП тут совершенно не при чем. Я не понимаю, нафига может потребоваться описанная конструкция, но если нужна - это претензия к отсутствию в языке понятия "приватного пакета". Да, нет такого. По мне - так и хорошо, что нет. Но в любом случае "классовые" ппп тут ни к селу, ни к городу. Как только появляется модификатор видимости связанный с пакетом (т.е. protected и default в java), пакет становится одним из действующих лиц в борьбе за обеспечение инкапсуляции. Очевидно, что это не единственная функция пакетов, другая это раширение имён классов. Безусловно эти две функции вступают в конфликт. Я уже упоминал о видимых, но не публикуемых компонентах. В любой библиотеке найдутся "недокументированные возможности", все те детали реализации, что неудаётся скрыть, используя стандартные механизмы. Примером могут служить пакеты sun.*/com.* в jdk. softwarer NotGonnaGetUsЕрунда. Где этот условный оператор в примере выше? Там же, где работа с чужими скрытыми данными. Работа с чужими данными в вызовах методов yyy и zzz. А где условный оператор в классах стратегии - не вижу. (В примере оказались пропущены extends MegaMethod и не обзначен тот факт, что эти классы обхявлены внутри класса-контекста, хотя полагаю это и так понятно) softwarer Хм. "На предыдущем допросе" (с) Вы сказали, что суть этого паттерна - в использовании полиморфизма для выбора реализации. Нельзя ли тогда пояснить, в чем с Вашей точки зрения состоит смысл полиморфизма, если при этом желание использовать потомка вместо предка объявляется "мистической универсальностью"? У полиморфизма нет смысла. Полиморфизм это природное явление, при котором определение какой именно метод будет вызван происходит в зависимости от динамического типа объекта, т.е. без статической привязки на этапе компиляции. Разве в примере, который я привёл, не видно использования полиморфизма в самой явной его форме? softwarer NotGonnaGetUsТак же как метод - часть класса, так же и стратегия - часть класса. первое процитированное здесь утверждение - на которое я отвечал - уже не верно. Поскольку существует контрпример. Это утверждение использовалось в том же контексте, в котором использовались слова "один правильный класс". С этой метафорой вы согласились, какие проблемы вызывает эта? Второе процитированное утверждение кажется мне более интересным. softwarer Безусловно. "Не лазают друг к другу в приват" - означает "нормально спроектированные классы", не более того. "Хоть горшком назови, только в печку не суй" :) softwarer NotGonnaGetUsПаттерны ООП, в частности strategy, command, visitor, composite приводят к сильному связыванию, но им это не ставится в вину, т.к. они решают технические задачи, которые не возможно решить стандартными средствами, не ударившись в жёсткий copy-past. Пока что это как минимум бездоказательное утверждение. В чём его бездоказательность? Допустим у вас стратегия с десятью методами и 256 вызовами этих методов. Отказавшись от данного паттерна вы получите 256 строчек подобного вида if () {...} else if () {...} ... , где вместо "..." вызовы методов утильного класса с параметром ввиде объекта-контекста. К чему приводит такое дублирование всем известно. Это объективный недочёт, в отличии от субъективных оценок, таких как красота расстановки фигурных скобок. softwarer Судя по всему, Вы сейчас употребляете "сильно связанные" в смысле "может понадобиться лазить друг к другу в приват". Это так? Я употребляю это выражение противоположном смысле к "low coupling", одному из шаблонов GRASP. http://ooad.asf.ru/patterns/patterninfo.asp?id=31 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.05.2006, 18:12 |
|
||
|
Ставлю под сомнение полезность private, public и protected
|
|||
|---|---|---|---|
|
#18+
NotGonnaGetUs softwarerЯ предлагаю Вам ее посмотреть. Этого мало? Посмотрел. Инкапсуляция не нарушается. Просто пример не удобного интерфейса. Программиста обязывают подставлять только определённый тип структуры данных. Это вызвано, скорее всего, плохим проектированием иерархии интерфейсов для этой структуры данных. Если бы были интерфейсы XXX, YYY, ... уточняющие врменные характеристики, то забота о выполение условия перешла бы с плеч программиста на компилятор. Я не вижу связи с тем, о чём я спрашивал. Отвечал по памяти, пример в ней исказился и ответ оказался несколько вне темы, хотя суть это не меняется ^) Ситуация, когда разработчик выбирает между, скажем, ArrayList и LinkedList не содержит в себе ничего противозаконного. "Противозаконное" начинается, когда выбрав подходящий для себя вараинт, он делает каст в List и дальше обращается с коллекцией через этот интерфейс. Противозанонность заключена в том, что он сам должен контролировать, что в переменной типа List не окажется лист не того вида. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.05.2006, 19:08 |
|
||
|
Ставлю под сомнение полезность private, public и protected
|
|||
|---|---|---|---|
|
#18+
NotGonnaGetUsЭ... В таком случае, вы повторили ровно тоже, что я сказал, перед тем как вы сказали то, на что я отвечаю :) Не совсем, если не совсем не. Вы сказали: Между строительством домика и складыванием кубиков программистами есть существенная разница. Каменщик не может сложить из 5 кирпичей блок и дальше использовать только его, а программист может. Я возразил: сказал, что разницы нет, и панель - как раз такой вот "заранее сложенный каменщиком кубик", который он использует. Вы по сути проигнорировали это возражение, снова сказав "молдавские строители оценили бы, что программист может использовать свои материалы". Я выделил из этого "программист может использовать" и указал, что это не содержит новой мысли :) Спор о том, использует ли новые материалы каменщик, предлагаю не развивать как сильно оффтопичный и ненужный. NotGonnaGetUsНе удобна не постановка вопроса, а интерфейс компонента. Постановка вопроса - "хороший кубик". Поставлена она, если мне не изменяет память, мной. В "мой хороший кубик" "хороший интерфейс" входит, и является одним из двух-трех важнейших факторов. NotGonnaGetUsА что такое класс в нормальном смысле? Я думал, что класс это то, что начинется со слов "class Name {" :) Со слов "class Name {" может начинаться любая хрень К примеру, Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. NotGonnaGetUs softwarerВы случайно не обратили внимания на слово "хорошего"? Это слово отражает объективную характеристику класса или субъективную? Если субъективную, к каковым относится и удобство, то не вижу смысла обращать на него внимание. Хм. Я не очень понимаю, зачем Вам разговаривать со мной, если Вы при этом предпочитаете не обращать внимания на мой слова. В этом случае я бы предпочел, чтобы Вы адресовали свои монологи в пространство, не отвлечая меня. NotGonnaGetUsКак раз это лирика + отдельная тема. Безусловно. И поэтому я предлагаю не тратить на "плохие интерфейсы" время. NotGonnaGetUsПосмотрел. Инкапсуляция не нарушается. Позволю себе вставить в это месте последнюю версию Вашего ответа. NotGonnaGetUsСитуация, когда разработчик выбирает между, скажем, ArrayList и LinkedList не содержит в себе ничего противозаконного. "Противозаконное" начинается, когда выбрав подходящий для себя вараинт, он делает каст в List и дальше обращается с коллекцией через этот интерфейс. Противозанонность заключена в том, что он сам должен контролировать, что в переменной типа List не окажется лист не того вида. Я скорее не согласен с такой постановкой вопроса. Соображение резонно, но в определенном контексте - если предположить, что некоторое решение, например ArrayList, заведомо лучше и является единственным возможным вариантом. Есть другой контекст, когда выбор реализации диктуется не нами, а тем, кто пользуется нашим решением - скажем, тот же класс "сортировщик" должен работать через List, в то время как пользователь нашего класса - выбирать реализацию исходя из своих данных и своих задач. Если помните, мы пришли к этому примеру от БД. Что у нас есть в случае БД? В этом случае у нас есть некие объективные данные. Есть методы, запрашивающие эти данные. Характерно, что методы отделены от данных, являются внешними сущностями. Эти самые "методы" не являются жестко заданным множеством, а добавляются по мере развития задачи, то есть меняются требования к данным. Что из этого следует: из этого следует, что в какой-то момент может потребоваться (для решения вновь поставленной задачи) изменить реализацию данных, например сделать из обычной таблицы партиционированную. И если от этого изменения "накроются" все другие методы, работающие с этой таблицей.... Что Вы там говорили про сильно связанные программы? Именно тот случай. И альтернативы "использованию List" в данном случае имхо нет. NotGonnaGetUsВ java файлы из одного пакета не будут лазить друг другу в приват. Да. Но тем не менее, это практически та же дружественность, со всеми ее минусами. Если угодно, можно считать "чуть менее страшная". NotGonnaGetUsЯ выявил желание определить компонент класса доступным _только_ в нём и его наследниках и оказалось, что это не возможно. Вы сослались на дружественность, что звучит фактически как приговор: моё желание плохой дизайн. Ровно наоборот, и это явно указано. Я сказал, что с моей точки зрения концепцию дружественности следует выкинуть к чертям собачьим. В дельфе и в яве я вообще не знаю ни одного примера правильного желания, в котором нужна дружественность; это костыль для скрепления плохого проектирования. В плюсах есть один пример хорошего желания, который язык не дает реализовать иначе, чем дружественностью. Имхо, из этого следует "выкинуть дружественность, реализацию желания сделать возможной другим способом". Названное Вами желание с моей точки зрения разумно и правильно. NotGonnaGetUsНет. Мне нравится вариант предложенный Мейером и реализованный в Eiffel. Видимости связанной с пакетами не существует. Компонент может быть видим всем, никому или наследникам кого-то Не знаю Eiffel, но в сказанном наши вкусы полностью совпадают. NotGonnaGetUs(при этом наследник может отказаться от наследства и никто не сможет его после этого прикастить к предку). Смысла вот этого я не понимаю. Есть подозрение, что такое желание есть следствие желания применить наследование как замену включению. Впрочем, это отдельная и наверное не столь важная тема. NotGonnaGetUsКак только появляется модификатор видимости связанный с пакетом (т.е. protected и default в java), пакет становится одним из действующих лиц в борьбе за обеспечение инкапсуляции. Хм. Я не хочу комментировать эту фразу - имхо она не очень относится к сказанному мной. Просто еще раз, аккуратнее сформулирую: С моей точки зрения, приведенный Вами пример (если предположить, что такой дизайн зачем-то нужен - я смысла в этом не вижу) никак не относится к модификаторам видимости членов класса (то, о чем идет речь в топике). На самом деле он требует введения в язык модификатора видимости пакета [то есть что-то типа protected package] либо доработки модификаторов видимости класса в целом. . NotGonnaGetUsЯ уже упоминал о видимых, но не публикуемых компонентах. В любой библиотеке найдутся "недокументированные возможности", все те детали реализации, что неудаётся скрыть, используя стандартные механизмы. Примером могут служить пакеты sun.*/com.* в jdk. Я уже достаточно отошел от java, чтобы не суметь поддержать дискуссию о конкретных решениях в ее библиотеке. Могу сказать так: мне ни разу в жизни не приходилось делать такие вот "вынужденно открытые" решения. Каждый раз, когда я натыкался на чье-либо желание такого решения, оказывалось, что причина его кроется в недостаточной продуманности, плохом дизайне предыдущих решений. Исходя из этого я склонен и неизвестные мне "неудается скрыть" предполагать относящимися к этой категории. NotGonnaGetUsРабота с чужими данными в вызовах методов yyy и zzz. Где? Они, я так надеюсь, работают со своими собственными данными каждый. То, что эти данные - чужие для того megaMethod, который метод, имхо по барабану всем, включая его самого. NotGonnaGetUs(В примере оказались пропущены extends MegaMethod и не обзначен тот факт, что эти классы обхявлены внутри класса-контекста, хотя полагаю это и так понятно) Хм. И с чьими все-таки закрытыми данными они работают? Контекста? А зачем им это? NotGonnaGetUsУ полиморфизма нет смысла. Полиморфизм это природное явление Протестую. Полиморфизм придумали люди, для решения вполне определенных задач. Говорить "сделано ради полиморфизма" и при этом отбрасывать эти задачи.... можно, конечно. И тогда становится неудивительной претензия "имеющиеся механизмы не подходят". Это все равно, что жаловаться "лыжи не катят", стоя на лестнице. NotGonnaGetUsЭто утверждение использовалось в том же контексте, в котором использовались слова "один правильный класс". С этой метафорой вы согласились, какие проблемы вызывает эта? Я привел пример. Сортировка - точно не является частью конкретного класса. Либо мы считаем ее размазанной по куче самых разных классов, либо - что имхо правильнее - считаем ее отдельной сущностью, применимой к разным классам. NotGonnaGetUsВ чём его бездоказательность? В отсутствии доказательств :) Сделано сомнительное утверждение, скорее несколько утверждений, и они не обоснованы. По ходу предыдущей дискуссии попытка дать пример такого обоснования... пока не очень успешна, во всяком случае единственный пример был опровергнут. NotGonnaGetUsДопустим у вас стратегия с десятью методами и 256 вызовами этих методов. Отказавшись от данного паттерна вы получите 256 строчек подобного вида if () {...} else if () {...} ... , Хм. Знаете, "страшные if-ы" по моим ощущениям давно стали некоторой страшилкой, которую повторяют на все лады, не особо думая о смысле. Я готов показать, что даже при использовании Fortran IV (который, назовем так, небогат языковыми возможностями, и в том числе не содержит классов) эту задачу можно решить без подобных case-ов. И? Да, в принципе можно считать любую реализацию "без if-ов" более или менее изуродованным вариантом этого паттерна. Мало того, это часто правильно; к сожалению, очень часто молодые программисты не понимают, что видят перед собой очередную перелицовку проверенных, выведенных из давнего опыта подходов, и считают их революцией, которая спасет мир (и которая позволяет писать как угодно плохо - главное, чтобы звучали слова Strategy, Visitor и прочие). Однако, эта философия имхо не относится к случаю обоснования либо необоснования конкретного утверждения. NotGonnaGetUsК чему приводит такое дублирование всем известно. Это объективный недочёт Хм. Он настолько же объективен, насколько объективен "хороший интерфейс". Однако, тот Вы ранее назвали субъективным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2006, 14:11 |
|
||
|
Ставлю под сомнение полезность private, public и protected
|
|||
|---|---|---|---|
|
#18+
softwarerЯ возразил: сказал, что разницы нет, и панель - как раз такой вот "заранее сложенный каменщиком кубик", который он использует. Вы по сути проигнорировали это возражение Я как раз на него и ответил :) Каменщик, в отличии от программиста, не делает эту панель, ему её ДАЮТ, так же как и кирпич. Да, давайте не будем о строителях. softwarerПостановка вопроса - "хороший кубик". Вы говорите: "'Хорошим' классам хватает возможностей ппп для организации сокрытия реализации, а остальные классы - не интересны". Я говорю: "Возможности ппп ограничены и там где их не хватает мы разделяем открытые и публикуемые интерфейсы". Таким образом, с фактом ограниченности ппп и тем, что это не фатальная проблема согласны мы оба (хоть и по разным причинам). Собственно об этом и шла речь с самого начала. Что такое хорошие классы и интерфейсы и как их создавать в абстрактных и реальных проектах тема другого обсуждения. Про инкапсуляцию всё. ---- softwarer Если помните, мы пришли к этому примеру от БД. Что у нас есть в случае БД? ... И если от этого изменения "накроются" все другие методы, работающие с этой таблицей.... Что Вы там говорили про сильно связанные программы? Именно тот случай. И альтернативы "использованию List" в данном случае имхо нет. ... класс "сортировщик" должен работать через List, в то время как пользователь нашего класса - выбирать реализацию исходя из своих данных и своих задач. Аналогию с листом не уловил. Про БД я начал говорить именно из-за этого "случая". Никто в здравом уме не станет заменять классы на бины с public геттерами и сеттерами и создавать классы со статическими утильными методами (хотя есть и такие примеры реализации ORM :)), но в бд именно это и имеет место, потому что за счёт этого покупается возможность писать эффективные запросы. Лист. С каждым листом связан итератор позволяющий перебирать его элементы наиболее эффективным способом. Поэтой причине сортировщик может быть реализован без знания конкретной реализации листа (так сделано в java). Если слово "сортировщик" заменить на другое (которому не достаточно итератора), то получится "плохой" дизайн (в лучшем случае использование instanceOf, в худшем всё опять должен делать программист и кругом связывание, связывание, связывание... и без оправдания), который вы не хотите рассматривать. softwarer NotGonnaGetUs(при этом наследник может отказаться от наследства и никто не сможет его после этого прикастить к предку). Смысла вот этого я не понимаю. Это от желания наследовать реализацию, а не интерфейс. Делегирование, обычно применяющееся в таких случаях, требует больше ресурсов и не может обеспечить всё тоже самое, что и наследование (доступ к protected компонентам предка). Согласен, отдельная тема. softwarer С моей точки зрения, приведенный Вами пример никак не относится к модификаторам видимости членов класса (то, о чем идет речь в топике). На самом деле он требует введения в язык модификатора видимости пакета [то есть что-то типа protected package] либо доработки модификаторов видимости класса в целом. . Пакет является ограничителем видимости членов класса (protected, default). При необходимости сделать какой-то член класса видимым в классе из другого пакета нужно сделать его public, при этом возникает side эффект в виде видимости для всех классов, всех пакетов. В java избежать этого эффекта практически не возможно. (так же как delphi нельзя закрыть внтуренности пакета x.y.z от членов пакета x.y) Мне кажется связь с модификаторам видимости членов класса прямая. softwarer Хм. И с чьими все-таки закрытыми данными они работают? Контекста? А зачем им это? Так вЫшло. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. softwarer Протестую. Полиморфизм придумали люди, для решения вполне определенных задач. Говорить "сделано ради полиморфизма" и при этом отбрасывать эти задачи.... можно, конечно. И тогда становится неудивительной претензия "имеющиеся механизмы не подходят". Полиморфизм это один из механизмов реализованных в ОО языках. Кто и как его использует зависит от фантазии. Можно заменять им условную логику, можно рассматривать как часть механизма наследования. > при этом отбрасывать эти задачи Невозможно все "задачи" решить одновременно. Паттерны ООП пример того, как решениями одних задач жертвуется ради решения других задач. В любой описании паттерна есть описание и тех и других задач. softwarer Я привел пример. Сортировка - точно не является частью конкретного класса. Либо мы считаем ее размазанной по куче самых разных классов, либо - что имхо правильнее - считаем ее отдельной сущностью, применимой к разным классам. Плохой пример. Универсальная сортировка не является стратегий. Это template method. Можно скрестить его со стратегий, позволив выбирать подходящий template независимо от того, какой лист будет подан на вход алгоритма сортировки. Классы стратегии в таком случае превратятся в "методы" класса сортировщика (а не листа). Я не вижу смысла в измывании над этим высказыванием. softwarer NotGonnaGetUsВ чём его бездоказательность? В отсутствии доказательств :) случае единственный пример был опровергнут. Очень трудно доказывать очевидное :) Какой пример? Не заметил опровержения. softwarer Хм. Знаете, "страшные if-ы" по моим ощущениям давно стали некоторой страшилкой, которую повторяют на все лады, не особо думая о смысле. Я говорю об if-ах, потому что передомной сейчас проект, где они есть, и мне не надо ничего выдумывать об их смысле. softwarer Я готов показать, что даже при использовании Fortran IV (который, назовем так, небогат языковыми возможностями, и в том числе не содержит классов) эту задачу можно решить без подобных case-ов. И? Мне тоже интересно, какой из этого факта нужно сделать "И?". softwarer Да, в принципе можно считать любую реализацию "без if-ов" более или менее изуродованным вариантом этого паттерна. Мало того, это часто правильно; к сожалению, очень часто молодые программисты не понимают, что видят перед собой очередную перелицовку проверенных, выведенных из давнего опыта подходов, и считают их революцией, которая спасет мир (и которая позволяет писать как угодно плохо - главное, чтобы звучали слова Strategy, Visitor и прочие). Однако, эта философия имхо не относится к случаю обоснования либо необоснования конкретного утверждения. Вы, кажется, слегка увлеклись. Проверенные и выведенные из опыта подходы родили ООП, шаблоны GRASP и GoF, как средства позволяющие их использовать. Уходить в прошлое и смотреть как эти подходы когда-то пытались реализовывать, интересно только с научно-позновательной точнки зрения. softwarer NotGonnaGetUsК чему приводит такое дублирование всем известно. Это объективный недочёт Хм. Он настолько же объективен, насколько объективен "хороший интерфейс". Однако, тот Вы ранее назвали субъективным. [/quot] Неа. Пытаться найти и исправить фрагмент логики дублирующийся в 256 местах объективно сложнее, чем сделать исправление в одном единственном месте. Про один и тот же интерфейс могут быть противоположные точки зрения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2006, 14:00 |
|
||
|
Ставлю под сомнение полезность private, public и protected
|
|||
|---|---|---|---|
|
#18+
NotGonnaGetUsТаким образом, с фактом ограниченности ппп и тем, что это не фатальная проблема согласны мы оба (хоть и по разным причинам). Это не совсем та формулировка, которая меня устраивает. Я согласен с тем, что можно придумать пример, в котором ппп не подходит. Мало того, я уверен в возможности "придумать пример" на абсолютно любую схему. В то же время я не натыкался на ситуации, в которых именно ппп (недостаточность ппп) была виновата в том, что нельзя сделать хорошо. NotGonnaGetUsНикто в здравом уме не станет заменять классы на бины с public геттерами и сеттерами и создавать классы со статическими утильными методами (хотя есть и такие примеры реализации ORM :)), но в бд именно это и имеет место, потому что за счёт этого покупается возможность писать эффективные запросы. Хм. Боюсь, я вроде как знаю все слова, но вот полностью понять смысл фразы не смог. Нельзя ли объяснить более доступно? NotGonnaGetUsС каждым листом связан итератор позволяющий перебирать его элементы наиболее эффективным способом. Поэтой причине сортировщик может быть реализован без знания конкретной реализации листа (так сделано в java). Вы здесь забываете, что кроме эффективного перебора, нужно еще эффективное перестроение. Хотя в java эта проблема относительно неостра из-за "объект есть указатель на объект". Но вопрос не в этом. Вопрос в том, что я - как программист - сильно обижусь, если стандартный сортировщик не сможет отсортировать нужный мне класс, обладающий стандартным интерфейсом. Эффективность этой операции - следующий вопрос, второй по счету, но первый - возможность. Соответственно, если у нас есть, условно говоря, классы "Эффективно Сортируемый Список" и "Неэффективно Сортируемый Список", хороший сортировщик таки должен уметь работать с обоими. В противном случае для сортировки семи строк комбобокса мне придется делать что-нибудь типа Код: plaintext что вряд ли "хорошо". NotGonnaGetUsЕсли слово "сортировщик" заменить на другое (которому не достаточно итератора), то получится "плохой" дизайн Я бы не стал утверждать столь однозначно. NotGonnaGetUsЭто от желания наследовать реализацию, а не интерфейс. Примерно это я и имел в виду в своей формулировке. Аналог private наследования. В принципе... скажем так, отсутствие такой фичи мне никогда не мешало. Хотя наличие не мешает еще больше :) Вопрос пожалуй в том, что она адекватна только для языков, поддерживающих множественное наследование. Если говорить об идеале, то я бы его искал в другом направлении. Если я правильно помню, Вы присутствовали в той дискуссии, в которой я рассказывал о некоторых возможностях интерфейсов в дельфе, в частности о делегировании реализации. В идеале я бы предпочел подобный механизм, но более развитый и обобщенный для работы не только с интерфейсами, но и с классами (объектными членами класса). NotGonnaGetUsи не может обеспечить всё тоже самое, что и наследование (доступ к protected компонентам предка). Ну, это-то элементарно обходится созданием публикующего нужные вещи потомка. NotGonnaGetUsПри необходимости сделать какой-то член класса видимым в классе из другого пакета нужно сделать его public, при этом возникает side эффект в виде видимости для всех классов, всех пакетов. Да. Я поэтому упомянул и дружественность, и protected; фактически Вы хотите нечто типа Код: plaintext NotGonnaGetUsМне кажется связь с модификаторам видимости членов класса прямая. См. выше. Это наиболее простой путь реализовать то, что Вы хотите, и модификаторы видимости членов класса тут не роляют. NotGonnaGetUsТак вЫшло. Говорить о разумности примера бесполезно, это просто иллюстрация того, как могут стратегии использовать прайвет данные. Хм. В возможности подобрать искусственный пример я нисколько не сомневаюсь. Именно поэтому я говорил о "хорошести" и о реальных задачах. Знаете, это как лиловая корова - я не готов вставить соответствующую строку в справочник возможных раскрасок только потому, что теоретически ее могут искупать в марганцовке. На практике.. я не сталкивался, и привести пример видимо не так просто. NotGonnaGetUs private abstract class (or interface) S { abstract int eval(); } Код: plaintext 1. NotGonnaGetUs softwarer Протестую. Полиморфизм придумали люди, для решения вполне определенных задач. ...... Полиморфизм это один из механизмов реализованных в ОО языках. Кто и как его использует зависит от фантазии. Верно. Но если используешь его "от фантазии", неуместно критиковать его за то, что он "не подходит". Например, велосипед - один из транспортных механизмов, реализованных людьми. Но это не повод осуждать недостаточность в его реализации подводных крыльев и затруднения с набором четвертой космической скорости. NotGonnaGetUsЯ не вижу смысла в измывании над этим высказыванием. OK. NotGonnaGetUsОчень трудно доказывать очевидное :) Но надо :) NotGonnaGetUsКакой пример? Не заметил опровержения. С undo-контейнером. NotGonnaGetUsМне тоже интересно, какой из этого факта нужно сделать "И?". Следующий: не нужно по каждому случаю обсуждения ООП вспоминать про "страшные if-ы". Это такая же страшилка, как goto в структурном программировании. NotGonnaGetUsПроверенные и выведенные из опыта подходы родили ООП, шаблоны GRASP и GoF, как средства позволяющие их использовать. Уходить в прошлое и смотреть как эти подходы когда-то пытались реализовывать, интересно только с научно-позновательной точнки зрения. Хотелось бы согласиться, но к сожалению не получится. Специфика моего жизненного опыта в том, что я встречал много людей, способных сказать довольно много умных слов на модные темы, но при этом не понимающих сути того, о чем говорят и что страшнее - что вроде бы используют в работе. Скажем, лет дцать назад, когда паттернов еще не было, а модной темой был C++, я беседовал с одним юношей, который влез в тему сверхстандартного учебного задания на полиморфизм - класс "фигура" с наследниками "круг", "квадрат" итп - и начал рассказывать, что все надо делать на template-ах, поскольку только они способны решить эту задачу. В ходе беседы до меня постепенно дошло, что человек просто не понимает классов, для него это скорее записи - благо, если помните, в C++ class и struct весьма похожи. По моим представлениям, наличие и прискорбная обширность слоя таких людей - следствие изрядной однобокости доступной литературы. Не говоря уже о склонности рекомендовать к чтению "самое крутое", но даже в книгах для начинающих много внимания уделяется "крутым" темам без достаточно глубокого объяснения, без перспективы. С другой стороны, авторы - рассказывающие умные и толковые вещи - чаще всего опускают очевидные с их точки зрения детали, не являющиеся таковыми для не слишком опытного читателя. В результате получаются программисты, не обладающие достаточным кругозором, тем, что в обычной жизни называется интеллигентностью, а в нашей работе ближе всего к "культуре программирования". NotGonnaGetUsПытаться найти и исправить фрагмент логики дублирующийся в 256 местах объективно сложнее, чем сделать исправление в одном единственном месте. Точно так же, например, "вызвать 256 методов в единственно правильном порядке" объективно сложнее, чем вызвать их в произвольном порядке. NotGonnaGetUsПро один и тот же интерфейс могут быть противоположные точки зрения. Хм. Не так сложно построить пример, где применение паттерна "Стратегия" будет явно неуместным усложнением программы, в то время как условный оператор будет оптимальным решением. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2006, 00:17 |
|
||
|
Ставлю под сомнение полезность private, public и protected
|
|||
|---|---|---|---|
|
#18+
softwarer NotGonnaGetUsТаким образом, с фактом ограниченности ппп и тем, что это не фатальная проблема согласны мы оба (хоть и по разным причинам). Это не совсем та формулировка, которая меня устраивает. Я согласен с тем, что можно придумать пример, в котором ппп не подходит. Мало того, я уверен в возможности "придумать пример" на абсолютно любую схему. В то же время я не натыкался на ситуации, в которых именно ппп (недостаточность ппп) была виновата в том, что нельзя сделать хорошо. Это напоминает какую-то странную игру в слова... Вы согласны, что protected, открывающий внутренности класса всему пакету, является примером ограниченности ппп? Согласны, но называете это дружественностью и тут же говорите, что к ппп это не имеет отношения. Разве есть какие-то возражения против того, что инкапсуляция это ппп + п(акет), т.к. два из четырёх модификаторов видимости связаны с пакетами? softwarer Хм. Боюсь, я вроде как знаю все слова, но вот полностью понять смысл фразы не смог. Нельзя ли объяснить более доступно? Бин с гетерами и сеттерами + класс/ы работающие с этим бином. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. Про ORM тоже самое. Делается бин один к одному по табличке из бд. Создаются *манагеры, которые делают тоже самое, что и YYYHelper. Полагаю, найдутся ситуации, где такая "архитектура" уместа, но в общем случае это ахтунг. softwarer NotGonnaGetUsС каждым листом связан итератор позволяющий перебирать его элементы наиболее эффективным способом. Поэтой причине сортировщик может быть реализован без знания конкретной реализации листа (так сделано в java). Вы здесь забываете, что кроме эффективного перебора, нужно еще эффективное перестроение. Хотя в java эта проблема относительно неостра из-за "объект есть указатель на объект". Разве это я о чём-то забываю? Мы говорим об алгоритме сортировке. Итератор в java позволяет выполнять операцию set в текущую позицию. softwarer Но вопрос не в этом. Вопрос в том, что я - как программист - сильно обижусь, если стандартный сортировщик не сможет отсортировать нужный мне класс, обладающий стандартным интерфейсом. Эффективность этой операции - следующий вопрос, второй по счету, но первый - возможность. Не знаю о чём вы сейчас пишите... Если стандартный интерфейс отдать стандартному сортировщику, то он его стандартно отсортирует, при условии, что вы - как программист - не подсунете ему не корректную реализацию стандартного интерфейса (н-р, Read-Only List). softwarer Соответственно, если у нас есть, условно говоря, классы "Эффективно Сортируемый Список" и "Неэффективно Сортируемый Список", хороший сортировщик таки должен уметь работать с обоими. В противном случае для сортировки семи строк комбобокса мне придется делать что-нибудь типа Код: plaintext что вряд ли "хорошо". Я уже не знаю, чего вы хотите добиться :) Следуя вашей традиции, хочется назвать всё это "плохим" дизайном и попросить не приставать к сортировщику, который честно делает то, что должен - сортирует списки, естественно со всеми теми ограничениями, которые присущи любому template method'y (плата за универсальность, которую вы так любите). "Плохой" вариант: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. "Хороший" вариант: Код: plaintext 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. softwarer NotGonnaGetUsЕсли слово "сортировщик" заменить на другое (которому не достаточно итератора), то получится "плохой" дизайн Я бы не стал утверждать столь однозначно. А я бы стал. Могу ещё раз: Если решим написать "универсальный" метод работающий с объектом реализующим "универсальный" интерфейс, но интерфейс окажется недостаточно продуман (или слишком универсален :)), то получится плохой дизайн, т.к. без костылей в таком случае не обойтись. softwarer NotGonnaGetUsи не может обеспечить всё тоже самое, что и наследование (доступ к protected компонентам предка). Ну, это-то элементарно обходится созданием публикующего нужные вещи потомка. Ключевое слово "обходится". Прямой путь всегда короче. offtopic: Собственно, прелесть Мейера в последовательном подходе к изучении оо метода. Но у этой прелести есть обратная сторона, его идеи нельзя рассматривать раздельно друг от друга - так они теряют смысл. softwarer Да. Я поэтому упомянул и дружественность, и protected; фактически Вы хотите нечто типа Код: plaintext Неа. Я хочу, чтобы пакеты перестали играть роль в обеспечении инкапсуляции, но хочу этого пассивно. Сделают - хорошо, не сделают - ещё лучше, т.к. более тонкое управление идентификаторами видимости требует большей квалификации, а квалифицированных кадров всегда не хватает. softwarer NotGonnaGetUsМне кажется связь с модификаторам видимости членов класса прямая. См. выше. Это наиболее простой путь реализовать то, что Вы хотите, и модификаторы видимости членов класса тут не роляют. См.выше. Это не путь, это костыль. Такой же как ООП в скриптовых языках. softwarer Хм. В возможности подобрать искусственный пример я нисколько не сомневаюсь. Именно поэтому я говорил о "хорошести" и о реальных задачах. Давайте ещё раз. Между "абстрактным" хорошо и "реальным" хорошо есть разница. В самом начале нашей дискуссии, я привёл пример решения реальной задачи (только речь там шла о командах, а не стратегиях). По сравнению с вашем решением оно требует меньше времени на реализацию и является безопасным, т.к. а) не требует преписывания контейнера с целью выделения обобщённых интерфейсов б) не затрагивает классы взаимодействующие с контейнером Предложенное вами решение включает моё как предварительный шаг. Делать этот шаг или нет вопрос сугубо практический. Я принял решение остановиться на достигнутом. В следущем шаге не было небходимости, зачем было тратить на него деньги заказчика? Я оказался прав, т.к. за два с небольшим года необходимости в следующем шаге так и не возникло. Если бы играла роль "абстрактная" хорошесть, надо было бы переписать весь html editor с верху до низу. softwarer NotGonnaGetUs private abstract class (or interface) S { abstract int eval(); } Код: plaintext 1. Я тоже хочу задать вопрос Код: plaintext 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. vs Код: plaintext 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. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. Я полагаю, что второй вариант для вас более "хорош"? softwarer NotGonnaGetUsМне тоже интересно, какой из этого факта нужно сделать "И?". Следующий: не нужно по каждому случаю обсуждения ООП вспоминать про "страшные if-ы". Это такая же страшилка, как goto в структурном программировании. Повторюсь: я вижу эти if-ы в текущем проекте. Это реальность (в отличии от goto, которые я видел последний раз в qbasic'e 10 лет назад). Речь идёт о if-ах тесно связаных с дублированием логики. Как от них избавляться - заменять полиморфными вызовами или выделять повторяющиеся структуры - зависит от конкретной ситуации. softwarer В результате получаются программисты, не обладающие достаточным кругозором, тем, что в обычной жизни называется интеллигентностью, а в нашей работе ближе всего к "культуре программирования". Из ваших уст это звучит как приговор ООП :) softwarer Точно так же, например, "вызвать 256 методов в единственно правильном порядке" объективно сложнее, чем вызвать их в произвольном порядке. Объективно сложенее сделать так, чтобы вызов произвольном порядке был равнозначен вызову в правильном порядке, чем сделать вызов в правильном порядке (мы ведь не допустим, чтобы "правильный порядок" дублировался в коде?) :) softwarer NotGonnaGetUs Про один и тот же интерфейс могут быть противоположные точки зрения. Хм. Не так сложно построить пример, где применение паттерна "Стратегия" будет явно неуместным усложнением программы, в то время как условный оператор будет оптимальным решением. Безусловно. А как это связано с тем, что один и тот же интерфейс может быть одновременно удобным и не удобным для разных людей? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2006, 17:25 |
|
||
|
Ставлю под сомнение полезность private, public и protected
|
|||
|---|---|---|---|
|
#18+
lockyиногда хочется не перекрыть, а тупо вызвать protected метод... а то мли в каком-то DevEx метод определения высоты строки (кажись) - protected, и значитца чтобы таки эту высоты посчитать - пиши давай, по образу и подобию (благо сорцы под руками). Дык эта падла ж считает данные на основании опять-таки protected свойств! туды его в качель.... Недавно столкнулся с аналогичной хренью в Infragistics для .NET. Очень нужное свойство для исправления какого-то бага было internal. Слава Аллаху за наличие в .NET пространства имён System.Reflection и класса System.Type ;o) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2006, 17:17 |
|
||
|
Ставлю под сомнение полезность private, public и protected
|
|||
|---|---|---|---|
|
#18+
misheloshiЗаходите! Просто дочитайте все до конца. Все не сложно. здесь все описано.не пожелейте 5 минут. вчера 54 бакса заработал. doxodgold.ru Лучше ты к нам. Почитай про public, protected, private. Доход 150 баксов в день обеспечен! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2008, 13:26 |
|
||
|
Ставлю под сомнение полезность private, public и protected
|
|||
|---|---|---|---|
|
#18+
SarinНачинайте бить. Только не больно. Надеюсь найдутся соратники. В чём полезность этих директив?Ты декларируешь открытые методы своего API, оставляя реализацию private на свое усмотрение. Если, конечно, твой API используется где-то кем-то еще. Если ты тихо программируешь сам с собою, то можешь делать это со всеми членами объявленными как public ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2008, 21:18 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=33705154&tid=1345367]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
162ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
| others: | 241ms |
| total: | 499ms |

| 0 / 0 |
