![]() |
Модераторы: LSD |
![]() ![]() ![]() |
|
w1nd |
|
|||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: нет Всего: 54 |
Модератор: Вынесено из 5 основных отличий между Java и C++
Вместо примера кода классический пример из книжек: класс Point, класс Size обладают некоторыми полями и методами, класс Square их наследник и в то же время и Point, и Size. К сожалению, на Java этого номально не сделать. Так же нельзя сделать гуишный компонент для ввода строки наследником строки. -------------------- ![]() ![]() |
|||
|
||||
Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 4 Всего: 172 |
Оффтоп:
Какие-то странные примеры наследования. У автора книжки с ООП было явно туговато. -------------------- |
|||
|
||||
w1nd |
|
|||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: нет Всего: 54 |
Первый пример есть во всех книжках по ООП. А в чем странность? -------------------- ![]() ![]() |
|||
|
||||
Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 4 Всего: 172 |
В том, что наследовать Square от Point и Size нельзя - квадрат не есть точка и никак не размер. Впервые такой пример встречаю просто. -------------------- |
|||
|
||||
w1nd |
|
|||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: нет Всего: 54 |
На мой взгляд, вы заблуждаетесь, гражданин начальник. Видимо, просто привыкли к объектной модели Bordand VCL, MFC, JavaBeans и им подобным - а они довольно далеки от ООП. Можно было бы это обсудить где-нить отдельно. -------------------- ![]() ![]() |
|||
|
||||
Domestic Cat |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 4 Всего: 172 |
Наследование - это отношение is-a, вот и все.
http://en.wikipedia.org/wiki/Inheritance_%...uter_science%29 Наследовать квадрат от неправильно, тк квадрат не есть точка, тем более не "размер". -------------------- |
||||
|
|||||
w1nd |
|
|||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: нет Всего: 54 |
Именно так. Но вы (как и многие) допускаете распространенную ошибку - отождествляете эти классы с объектами реального мира. Для квадрата свойственны все поля и методы координаты и размера - именно это (все поля и методы) определяет наличие отношения is-a для классов. Это сообщение отредактировал(а) w1nd - 11.5.2006, 19:09 -------------------- ![]() ![]() |
|||
|
||||
Domestic Cat |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 4 Всего: 172 |
Простой пример:
ООП и постоено на объектах реального мира, просто в каждой ситуации програмист рассматривает лишь отдельные стороны объектов, важные в данной ситуации. С точки зрения геометрии квадрат не есть точка. Да, он унаследует два поля точки, но за выигрыш двух строк кода придется платить - например, можно будет откастить объект квадрата к объекту точки или размера, что будет приводить к появлению багов, непонятному коду. К примеру, у точки есть метод Paint, который мы перегружаем в Square. Тогда метод DrawPoint(Point point) приведет к изображению не точки, а квадрата при вызове DrawPoint(square). Согласно такой логике мне нужно наследовать класс Company от класса Contact, поскольку последний содержит все поля (адрес, имя, телефон, емейл, итп). К чему такой наследование приведет нетрудно догадаться. -------------------- |
||||||
|
|||||||
w1nd |
|
|||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: нет Всего: 54 |
ООП построено не на объектах реального мира, а на принципе инкапсуляции и полиморфизма ![]() Само существование методов вроде DrawPoint или CreatePolygon полностью противоречит принципам ООП. Только сам объект может себя рисовать или создавать. И если бы класс Контакт не обладает атрибутом Пол или Возраст, он подойдет для Компании; в ином случае нужно просто выделить общие для них поля и методы в отдельный(е) класс(ы) и назвать соответствующе. Это сообщение отредактировал(а) w1nd - 11.5.2006, 20:28 -------------------- ![]() ![]() |
|||
|
||||
Domestic Cat |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 4 Всего: 172 |
Замените DrawPoint на метод Point.Paint, и проблема останется. CreatePolygon вполне может относиться к классу, занимающемуся проецированием полигонов из 3D на экран, тогда полигон сам себя прорисовать не сможет, так как ему будет необходимо знать ряд других параметров, возможно, выполнить к-л оптимизации при прорисовке, итп.
Предположим, что пол и возраст не важен и мы унаследовали Company от Contact. Бизнес-логика приложения очень сложная, где-то я по ошибке передал Company в метод, ожидающий Contact. На дебаге я потрачу раз в 30 больше времени, чем если бы я потратил 2 минуты на создание общего класса Entity. -------------------- |
||||
|
|||||
w1nd |
|
||||||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: нет Всего: 54 |
Какая проблема? Проблема здесь только в том, что пользователь класса Point хочет знать, каким образом этот класс себя нарисует, а знать ему (пользователю) этого не положено.
И снова я вижу грубое нарушение принципа инкапсуляции. Если полигон не может, следует либо расширять функционал полигона, либо расширять функционал канвы (преобразования, оптимизации и прочее).
Какая-такая ошибка может возникнуть, если метод, рассчитывающий на контакт его и получил? -------------------- ![]() ![]() |
||||||
|
|||||||
Domestic Cat |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 4 Всего: 172 |
Какое ж тут нарушение инкапсуляции? Инкапсуляция - это information hiding, если мне достаточно для отрисовки знать координаты вершин многоугольника, то я могу их получить из пропертей (геттеров) и инкапсуляции не нарушу. В контексте задачи может не иметь смысла перегружать подобные классы функционалом, писать Квадраты, которые себя рисуют, трансформируют, сериализуют да еще и в базу сами пишутся.
Да какая угодно. Например, создается репорт, содержащий к-л статистику по посещениям сайта (скажем, Контакт/Компания содержат поля MonthlyHits и IP). В данный метод передается массив Контактов, в который по ошибке попала одна Компания. У всех этих объектов вызывается проперти MonthlyHits, IP. Такой баг и заметить сложно. -------------------- |
||||
|
|||||
w1nd |
|
||||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: нет Всего: 54 |
Мы про ООП или про что? Инкапсуляция подразумевает не сокрытие информации (это как самоцель не имеет смысла), а сокрытие способа хранения, реализации, взаимодействия. Это необходимо для того, чтобы не переписывать клиентский код при внесении изменений в реализацию класса. Геттеры/сеттеры - это как раз нарушение инкапсуляции (замаскированный прием структурного программирования). Вообще (как я и говорил, вы, похоже, зацикливаетесь на существующих framework'ах, которые примером ООП не являются), само по себе понятие properties объекта очень сомнительно с точки зрения ООП.
Какой-то неподходящий пример. Здесь иллюстрируется только ошибочность решения наследовать компанию из контакта, т. к. в нем есть малоподходящие компании атрибуты (MonthlyHits, IP). Но пусть это неотъемлемые атрибуты любой компании, при чем здесь наследование? Подобную ошибку с таким же успехом можно допустить где угодно: можно создать метод, принимающий в качестве параметров массив объектов и напихать туда чего попадет. -------------------- ![]() ![]() |
||||
|
|||||
powerOn |
|
|||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: нет Всего: 159 |
Чует мое сердце, что для этого нужно наследование, а не инкапсуляция... |
|||
|
||||
LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 9 Всего: 538 |
1. Что же тогда по твоему хороший пример? 2. Чем properties плохи (то что при их использовании можно спокойно менять способ хранения данных, я тебе уже демонстрировал)? -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
Domestic Cat |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 4 Всего: 172 |
Я немного неясно написал, предполагается что проперти MonthlyHits, IP могут быть как у компаний, так и клиентов. Тем не менее, пример это подходящий - ошибок можно было бы избежать, если бы Contact и Company наследовали бы от Entity. Тогда в массив Contac[] объект Company никак бы попасть не смог.
По-прежнему не вижу нарушения инкапсуляции. Объект часть своих свойств может скрывать, часть - предоставлять через методы/проперти. Если например класс Point не будет иметь методов getX, getY, то использовать его будет неудобно - для всех возможных применений класса придется создавать свой метод, меняя класс. Реюзать такой класс будет еще труднее, поскольку невозможно предусмотреть все возможные варианты использования Point.
Существующие фрейворки, хоть и не на 100%, но по крайней мере процентов на 90 меня устраивают. Наследование Company от Contact или Square от Size - не устраивает на 100%, я легко могу представить как сложно поддерживать такой код. -------------------- |
||||||
|
|||||||
powerOn |
|
|||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: нет Всего: 159 |
Имхо, это скорее способ стандартизации работы с полями (свойствами) классов. |
|||
|
||||
w1nd |
|
|||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: нет Всего: 54 |
Так ведь не знаю! Вот и хочу узнать, в каком случае решение о наследовании одного класса из другого (при условии, что все поля и методы родителя свойственны дитю) может быть ошибочным? -------------------- ![]() ![]() |
|||
|
||||
Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 4 Всего: 172 |
Заключение о том, что поля/методы класса А свойственны и классу Б должно следовать из логических соображений, из архитектуры, а не из сравнения (все поля класса Size есть и у Square и у Car, следовательно унаследуем Square и Car от Size). Что будет, позже, когда код написан, придется изменить класс SIze и дописать метод Resize()? Не получится ли, что размеры Car можно менять как угодно? Базовый класс должен быть абстракцией более высокого уровня, чем сабкласс (Entity - абстракция от Company и Contact). -------------------- |
|||
|
||||
w1nd |
|
||||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: нет Всего: 54 |
Нет, не понимаю. Ну и что же? Теперь и Contact, и Company могут попасть в массив Entity, а Entity - это, допустим, еще и Vehicle. И что? А то, что вы пытаетесь привязать классы к наблюдаемым объектам, а этого делать как раз не нужно. ООП - это не концепция понимания мира сквозь призму модели классов, а способ создания программ, в которых возможны локальные изменения на любом уровне. Или вы пытаетесь создать заведомо ошибочный код (метод, которому на вход передаются контакты почему-то интерпретирует их как персон).
А я вот не могу представить трудностей, которые представляете вы. Поделитесь? Это сообщение отредактировал(а) w1nd - 11.5.2006, 22:18 -------------------- ![]() ![]() |
||||
|
|||||
Domestic Cat |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 4 Всего: 172 |
Тот, кто пишет метод Process(Entity entity), знает, что в данный метод можно передать любую Entity. Если будет нужно создать метод, специфичный для контактов (Process(Contact contact)), то передать туда Company будет нельзя.
1. Непонятный код. К примеру, можно будет спокойно писать
2. Плохой код. К примеру, добавление нового метода или поля в контакт (например, пол) через полгода после старта проекта приведет к появлению компаний женского и мужского полу. 3. Больше багов
-------------------- |
||||||||
|
|||||||||
LSD |
|
||||||||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 9 Всего: 538 |
Ты не знаешь примеров хорошего ООП, но при этом твердо убежден, что все что есть сейчас плохо? Добавлено @ 22:44
Гут! ![]() -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
||||||||
|
|||||||||
w1nd |
|
||||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: нет Всего: 54 |
Если программер делает метод, рассчитанный только на обработку контактов (зная, что контакты - это еще и компания) - он всего лишь совершает ошибку. Если вместо того, чтобы создать класс Person, человек добавляет пол контактам и компаниям - это тоже всего лишь ошибка. Если нужен объект класса компания, а программер создает переменную контакт - это попросту странно (компания и так есть контакт). А если этот самый программер вообще сядет спиной к монитору, он вообще ничего написать не сможет. Один мой товарищ, например, считает, что возможность переопределения операций в C++ - зло, которого следует избегать любой ценой. В чем здесь прикол? У него просто нет нормальной IDE, а C++ он знает недостаточно хорошо, чтобы отследить все зависимости без IDE. А другой мой товарищ вообще не знаком с программированием и нифига не понимает во всех этих кракозяблах. Так что, программировать нужно так, чтобы все одобряли и понимали? Не смешно ли? Добавлено @ 23:05
Аз есмь живой, ходячий пример хорошего ООП ![]() Это сообщение отредактировал(а) w1nd - 11.5.2006, 23:06 -------------------- ![]() ![]() |
||||
|
|||||
LSD |
|
||||||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 9 Всего: 538 |
Кто тебе это сказал ![]() ![]() ![]()
Ты абсолютно невнимательно читаешь собеседников. Я спрашивал, раз уж по твоим словам в существующих фреймворках, ООП плохо реализовано, то вообще есть пример реализации хорошего ООП. Про квадраты я ничего не спрашилал, это ты себе придумал. Если у тебя нет таких примеров, то тут квадраты?
Смотря какая цель разработки данной модели, если упростить разработку (один из способов минимизировать количество ошибок). То количество "подводных камней" играет большую роль, чем их больше тем хуже эта модель. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
||||||
|
|||||||
w1nd |
|
||||||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: нет Всего: 54 |
Я это точно знаю. Язык - не живопись и не скульптура, чтобы каждый понимал так, как хотел.
Обмишурился чуток. Беседовали о квадратах и разнополых компаниях. Хорошим примером ООП наверняка может быть отдельно взятый фрагмент в любом из существующих якобы-ООП-фреймворков (кроме майкрософтовских, пожалуй). Но в целом - нет. Самое жуткое - это, конечно, properties.
Целью разработки каких-либо моделей или фреймворков никогда не становится упрощение, только ускорение. Это сообщение отредактировал(а) w1nd - 12.5.2006, 00:14 -------------------- ![]() ![]() |
||||||
|
|||||||
jimur |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 21.4.2006 Репутация: нет Всего: 3 |
||||
|
||||
Domestic Cat |
|
||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 4 Всего: 172 |
Конечно. В команде когда-нибудь работал? Занимался переписыванием кода после индусов?
Правильное наследование уменьшает количество возможных ошибок в будущем, но не устраняет их совсем, конечно же. Для того, чтобы "унаследовать" свойства точки, достаточно использовать композицию. К примеру
Упрощение - тоже ускорение, оно ускоряет дебаг и поддержку кода. -------------------- |
||||||||||
|
|||||||||||
w1nd |
|
|||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: нет Всего: 54 |
Ни я, ни мои коллеги никогда, к счастью, не сталкивались с необходимостью переписывать чей-то код. Я не против агрегации классов для использования их свойств, но бездумная эксплуатация такого подхода по поводу и без повода порождает пресловутые properties и, в конечном итоге, сводит на нет те преимущества, которые может дать нам ООП. Как правило, подобные артефакты рождаются из-за стремления переделать старую не-ООП программу на новый лад, что невозможно без фундаментальнго перепроектирования, или из-за непонимания ООП. Изначально вопрос состоял в том, может ли ООП обойтись без множественного наследования. Я утверждал, что не может и пока не никто не смог предъявить сколько-нибудь весомых аргументов против (кроме утверждений о том, что кто-то потеряет голову, глядя на классы с N-надцатью родителями). -------------------- ![]() ![]() |
|||
|
||||
powerOn |
|
|||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: нет Всего: 159 |
Я очень сильно извиняюсь за offtop, просто уже не в первый раз, от совершенно разных людей (программистов естественно), слышу о необыкновенных талантах индийских кодеров. Если Вас не затруднит, поделитесь кусочком кода (малееееньким), ну пожалуйста. Я очень хочу на это взглянуть.. ![]() |
|||
|
||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 11 Всего: 173 |
-------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 9 Всего: 538 |
Раз уж мы заговорили о доказательствах, то наличие множественного наследования в С++, еще не означает что это единственно верный путь. У него есть свои недостатки. А пример, ООП без множественного наследования это таже Java и C#. И пока я так и не понял, почему квадрат, в хорошо споектированной программе обязательно должна наследоваться от точки и размера. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 11 Всего: 173 |
Позволю себе дать ссылку на подобное обсуждение о вреде/пользе МН на RSDN.
-------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
w1nd |
|
|||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: нет Всего: 54 |
Не обязательно должен. Domestic Cat нашел данный пример странным; я утверждаю, что странного (или плохого) в этом ничего нет. И еще я считаю подход со свойствами неуместным в ООП. Что касается Java или C#, то они появились попозже ООП, да и ООП, в принципе, оторвано от какого-либо конкретного языка (хотя C++ создавался в т. ч. и как инструмент для ООП). Я говорю о том, что без МН в ООП не обойтись. Может быть, утрирую, но все равно обойтись бывает очень трудно (не вообще обойтись трудно, а чтобы не скатиться в структурное программирование). Это сообщение отредактировал(а) w1nd - 13.5.2006, 04:48 -------------------- ![]() ![]() |
|||
|
||||
Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 4 Всего: 172 |
Ну а я утверждаю что это неправильный пример наследования, неважно, множественного или не множественного. По определению наследования. Обойтись можно, как показывает опыт. -------------------- |
|||
|
||||
LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 9 Всего: 538 |
Ну так приведи пример, когда обойтись трудно. Да и по поводу properties, я слышу только что это не ООП, но не вижу аргументов. Объясни например почему класс JFrame не должен предоставлять возможность управления своими размерами в виде setSize() и getSize(), где тут нарушение ООП парадигмы. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
Domestic Cat |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 4 Всего: 172 |
-------------------- |
||||
|
|||||
ALKS |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 354 Регистрация: 22.3.2006 Репутация: 2 Всего: 11 |
Чего я не понял, это почему Domestic Cat привязался вначале к квадрату из кординаты и размера? откуда вы знаете где и как такая структура классов будет использоваться? Это вполне может быть крайне удобным и логичным в рамках задачи для которой это проектировалось. Вполне понятно, что одни и те же "объекты реального мира" можно описать различными способами и с чего вы взяли что какой-то способ лучше а какой-то хуже? все зависит от того где и как вы будете результаты своего проектирования применять.
|
|||
|
||||
Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 4 Всего: 172 |
Согласен, возможно в рамках к-л конкретной задачи такое наследование действительно будет "правильным". Но ведь утверждалось, что это стандарнтый пример, очевидно геометрический. Вот и непонятно, как квадрат может быть точкой. -------------------- |
|||
|
||||
w1nd |
|
||||||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: нет Всего: 54 |
Как раз не по определению. Вы просто пытаетесь сравнить геометрические точку и квадрат и находите существенное различие (хотя и то и другое - объект на плоскости). А в случае с классами отношение is-a никогда не определяет точно такое же отношение между объектами реального мира. Поля и методы точки свойственны (или применимы, если хотите) квадрату, значит он - точка. Потому что в определении класса ничего другого, кроме полей и методов не написать.
Конечно можно! Как правило, путем отказа от парадигм ООП.
Вы сами отвечаете на свой вопрос. Класс не должен предоставлять возможности управлять своими атрибутами. Разницы между методами getSize/setSize и публичным полем size нет. Создание таких свойств - это структурное программирование, а не объектное. Не должно быть у класса никаких доступных полей данных, пусть даже getSize двадцать раз конвертирует результат. Мы можем послать объекту сообщение (вызвать метод): "сделай что-то", но никогда не можем запросить у объекта данные. -------------------- ![]() ![]() |
||||||
|
|||||||
ALKS |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 354 Регистрация: 22.3.2006 Репутация: 2 Всего: 11 |
А сие кстати, верно... В Java нет структур, вот почему мы вынуждены пользоваться нарушением идий теоритического ОО проектирования под названием JavaBean. ![]() ![]() |
|||
|
||||
Domestic Cat |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 4 Всего: 172 |
Программирование - это все-таки описание реального мира, а не наоборот. Потому утверждение "у классов А и Б одинаковые поля, плюс у класса Б есть все методы класса А" не означает, что Б должен наследовать от А. is-a соотношение определяется из логики реальной задачи, из того, что это значит в данном контексте. Вы забываете, что наследование также называется generalization - обобщение, базовый класс - это абстракция более высокого уровня, которым можно в некоторых случаях заменить любой из сабклассов (Vehicle <- Car, вместо "машина" можно использовать "средство передвижения" в случае например подсчета всех средств передвижения компании). Если рассмотреть геометрию, то квадрат не есть точка, в геометрии нельзя квадрат заменить точкой. Если угодно реюзать код - например координаты, выстроите правильную иерархию наследования. Например можно ввести понятие GeometricObject. Понятно, что любое геом тело будет включать в себя хотя бы одну точку (квадрат - одна из вершин, круг - центр, линия - одна из двух точек, определяющих линию, итп) и дайте этому классу два поля - x и y. Вот теперь наследуйте от него Point, Rectangle и все остальное, и теперь данная иерархия будет правильной, так как точка есть геометрический объект и квадрат также есть геом объект.
1. Предположим, мне нужно узнать размер квадрата, чтобы где-нибудь в статус баре написать "квадрат стороной 10 мм". Как вы это реализуете? 2. Где написано, что у объекта нельзя запрашивать данные? Инкапсуляция означает не то, что объект должен скрывать всё на свете, а то, что он должен скрывать имплементацию. Проперти как раз идеально ложится в данное определение - не важно откуда объект берет свое свойство - из базы, считает, или просто хранит в виде поля. Более того, проперти (геттер, сеттер если хотите) - это тоже message, то есть то же самое, что и метод. В чем принципиальная разница между мессагами "верни мне массив твоих координат" и "верни мне твою площадь"? -------------------- |
||||
|
|||||
w1nd |
|
||||||||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: нет Всего: 54 |
экземпляр_класса_квадрат.отобразить_свой_размер_в_статус_баре().
Доступ к данным должен быть невозможен. Что вы будете делать, когда сам тип этого свойства поменяется? Или вместо одного свойства потребуется десять?
Да ни в чем. Ни то, ни другое не нужно. От объекта нужен только функционал. Для чего его координаты или площадь? Где-нибудь нарисовать? Это сделает сам объект.
Только в том случае, когда мне где-либо понадобится этот GeometricObject (кстати, в честь чего у абстрактного геометрического объекта будут координаты? координаты начинаются с точки). Делать его только чтобы был не имеет смысла - это только запутает. Я как раз не забываю, что означает наследование, но я, проектируя структуру классов, не собираюсь следовать примерам из реального мира. Мой реальный мир - это моя программа, здесь всё по-другому. Вы можете описать в коде те дополнительные признаки, о которых коговорите, как о ключевых ("общность полей и методов не означает...")? Нет. Кто-нибудь, кроме вас поймет ваш код, если он у вас в голове или где-то еще вне проекта? Нет. З. Ы. У любого геометрического объекта, между прочим, есть центр, а у точки отсутствует размер, поэтому любой объект - суть точка. Это сообщение отредактировал(а) w1nd - 13.5.2006, 20:57 -------------------- ![]() ![]() |
||||||||
|
|||||||||
powerOn |
|
|||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: нет Всего: 159 |
![]() Это сообщение отредактировал(а) MoonCat - 13.5.2006, 20:35 |
|||
|
||||
w1nd |
|
|||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: нет Всего: 54 |
А вы что думали? ![]() Только вы забыли, что у вас есть такой мощный инструмент, как наследование. Мы делаем класс нечто, который должен уметь отображать текстовую информацию и наследуем от него и статус-бар и все прочие 30 элементов. В результате обходимся одним методом: квадрат::отобразить_свой_размер_в_нечто(), в качестве параметра которому это нечто и передаем. Кстати, без МН или интерфейсов Java в этом случае придется очень туго, так как все 30 компонент уже имеют какого-то родителя. Но интерфейсы Java отличаются тем, что реюзать код не получится (или получится, но очень через задницу - через статические методы в непубличном классе). Это сообщение отредактировал(а) w1nd - 13.5.2006, 20:53 -------------------- ![]() ![]() |
|||
|
||||
Domestic Cat |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 4 Всего: 172 |
Оффтоп: понятия "центр" у любого геом объекта нет. То, что любой геом объект есть точка - с чего это вы взяли?
А что, если я хочу отобразить название красным цветом? Курсивом? Использовать буквы разной ширины и цвета? А что, если мне нужно размеры квадрата вывести в виде (x1, y1, x2, y2, размер), а Васе Пупкину - в виде "Квадрат имеет длину 5 "? А что, если мне нужно создать кристал репорт по размерам всех квадратов, Пете - создать ворд документ, а Ване - послать размеры на мыло? Сколько методов для этого нужно вашему нечто и сколько параметров он будет принимать? Не кажется ли вам, что как минимум сотня, и то самых-самых основных? Или, что еще хуже, сотня классов, от которых квадрату будет нужно унаследовать? Извините, но такой фрейворк будет громоздкой, труднорасширяемой махиной, которой никто не захочет пользоваться.
Да нет уж, это ваш подход вывернут наизнанку.
Да. Любой программист поймет этот код, также, как понимает Java или дотнет фреймворк. А вот наследование квадрата от точки - врядли. Для чего угодно - см выше Кто это сказал? -------------------- |
||||||||
|
|||||||||
LSD |
|
||||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 9 Всего: 538 |
Это еще почему класс не должен предоставлять возможности управлять своими атрибутами? Он вообще для чего существует. Объект это вещь в себе, которая существует только для того чтобы удовлетворить извращеную фантазию своего создателя. Так что ли? Если у класса есть атирибут, и он является существенным для программиста, то должна быть возможность манипулирования им.
Ты прекрастно знаешь что методы getSize/setSize и публичное поле size, это две большие разницы. Т.к. методы, помимо изменения внутреннего поля size (кстати, ты можешь сходу сказать в каком виде оно храниться?) еще и вызывает перекомпоновку дочерних элементов и перересовку нужных компонентов. Ты считаешь что для того чтобы получить размер JFrame надо вызывать не getSize() а gimmeYourSizeMan(), а для изменения размера heySetYourSizeBitch(). И это будет являть собой истинно ООП подход? Или ты вообще уверен, что нефиг программисту знать, или тем более управлять размерами JFrame. Не его ума это дело, разработчик JFrame лучше знает какого размера должно быть окно ![]() P.S. У тебя дико странный взгляд на программирование. Все существующее ты отвергаешь, но при этом не предлагаешь ничего удобоваримого взамен. Предлагаю тебе в качестве примера, набросать иерархию классов, для описания геометрических объектов на плоскости. А то вообще не понятно, как ты предлагаешь писать код с таким подходом. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
||||
|
|||||
w1nd |
|
||||||||||||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: нет Всего: 54 |
Эк вас занесло... У любого объекта есть геометрический центр. А еще есть центр тяжести. Думаю, еще какие-нибудь центры имеются. А считать точкой объект или не считать - зависит исключительно от удаленности наблюдателя. Город на карте - всего лишь точка.
Понадобиться может что угодно, но получите вы только то, что может сделать объект.
Не мой, извините, я в соавторах ООП не числюсь. И прошу внимательно перечесть - по сравнению с чем.
Перефразирую ваше утверждение: любой поймет, что я имел в виду написав "1+1-1+1=2" вместо "1+1=2" или "2=2".
Вообще-то это имеет какое-то отношение к инкапсуляции, и говорят об этом все авторы, пишущие об ООП. Это сообщение отредактировал(а) w1nd - 14.5.2006, 04:32 -------------------- ![]() ![]() |
||||||||||||
|
|||||||||||||
w1nd |
|
||||||||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: нет Всего: 54 |
В общем, почти так. Интересно, а если программисту вдруг понадобится способ для обхода криптозащиты файловой системы в ОС, авторы должны расшибиться в лепешку, но предоставить?
Я прекрасно знаю, повторюсь, что между свойством и публичным полем нет никакой разницы. Свойство - это такое продвинутое публичное поле, которое сообщает объекту об изменении себя.
Это вы так считаете (и откуда в вас такая уверенность - ума не приложу). Я же (в данном случае) считаю, что пользователю окна (в случае ООП) не нужно знать, какой у него размер.
Ух! Это высказывание породило ряд вопросов: Во-первых, куда уж больше примеров? Во-вторых, скажите пожалуйста, что существующее я отвергаю (для меня это полная неожиданность)? В-третьих, что вы знаете о моих взглядах на программирование (здесь я еще ничего об этом не писал, мы пока обсуждаем наследование в теоретической ООП-программе)? -------------------- ![]() ![]() |
||||||||
|
|||||||||
Domestic Cat |
|
||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 4 Всего: 172 |
Есть ли понятие "геометрический центр"?
Мы говорим о геометрии, а не о географии. Найдите мне в хоть одном учебнике слова о том, что любой объект есть точка.
В таком случае ваш фрейворк будет нерасширяемым, негибким и нереюзаемым. Каждый будет писать свой класс для квадрата, размера, и всего остального лишь для того, чтобы добавить ему то, чего он делать не умеет.
Перечитайте пожалуйста определение инкапсуляции. Инкапсуляция за 3 минуты
И что? Если для данного объекта допустимо предоставлять доступ к полю, то на здоровье, в чем проблема? Важно, чтобы объект скрывал те поля и те методы, которые нужно скрывать.
В ходе беседы лично у меня складывается впечатление (прошу заранее извинить если не прав) что у вас очень мало или вообще нет опыта работы в серьезных или даже средних проектах. Попытаюсь объяснить. Возьмем часть реального веб приложения - страница, на которой отображаются некие данные. Данные эти читаются из базы в классы-мапперы типа Person, Project, итп, всего штук 15 классов. Задача состоит в том, чтобы иметь возможность сохранять страницу в виде xml файла. Будем действовать согласно вашему подходу. Нельзя нам дать классам пропертя типа Name, Id и проч! Что ж делать? Унаследуемся от класса, который умеет сохранять все в xml? Можно, только проблемка то в том, что этот класс будет абстрактным, тк доступа-то у базового класса к полям всех возможных сабклассов нет! Следующий наш шаг - оверрайдить метод WriteToXML и писать 15 методов в 15ти классах... Через три месяца клиет вам сообщит, что он хотел бы иметь возможность экспортировать не в xml (нахрена ему xml?) а в WordML, PDF и аутлук. И что теперь? Убиваем все 15 методов, наследуемся еще от 3х классов и создаем 45 методов? Классный подход, совсем нетрудоемкий. Кстати, если захотите реюзать в других проектах - не получится, кроме как копипастингом. А теперь допустим, что мы таки предоставили доступ к полям наших 15 классов. Теперь мы спокойно напишем класс Exporter, унаследуем от него XMLExporter, который будет брать у объекта Provider массив значений. Веб-страница будет выступать таким провайдером, собирая нужные данные с объектов, которые она отображает. Теперь для того, чтобы добавить экспорт в WordML, нужно дописать один-единственный класс с одним методом. И все. Более того, все эти экспортеры можно поместить в отдельную либу и юзать где угодно. По-вашему, данный подход - неправильный? А по-моему, неправилен именно ваш - просто вы его даже в реальных проектах не опробовали. -------------------- |
||||||||||
|
|||||||||||
LSD |
|
||||||||||||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 9 Всего: 538 |
Каждый объект имеет некое назначение, то как его предполагается использовать. И если прикладному программисту для корректного использования компонента, т.е. такого как предполагал разработчик компонента, нужно иметь доступ к данным делающим возможным обход криптозащиты, то эти данные должны быть предоставлены. И между прочим так и есть, разработчики ОС имеют доступ к таким данным, другое дело что только они. Сторонние программисты, доступа к этим данным не имеют, поскольку не предполагается что им эти данные нужны и даже наоборот, считается что эти данные им не нужны. Тут у нас 2 интерфейса, один для разработчиков ядра, другой для прикладных программистов.
А то что благодаря этому выполняется куча дополнительных действий, делающих возможным нормальное функционирование компонента, это по твоему не важно? Хотя учитывая, что:
то тогда это все напоминает смертельный номер: "Внимание, только у нас и только сегодня! Написание GUI без использования методов getSize()/setSize()! И на последок, сложный акробатический трюк, написание прграммы без использования статических методов!" А уверенность такая у меня от этой беседы и от этой.
Пока что от тебя был всего один пример, с точкой и квадратом, плюсь критика существующих подходов. Ты заявляешь что это не ООП, а структурное программирование; объектно-ориентированный подход фактически является вывернутым наизнанку в сравнении со структурным, да еще много чего. При этом, сам пока не предложил ни одной концепции. А те предложения которые были озвучены, не выдерживаюет никакой критики:
и как это использовать по твоему? А если мне нужно форматировать данные перед отображением, это кто должне будет делать? А если мне понадобится, чтобы данные о квадрате отображались в попугаях, то разработчик класса квадрат, должен будет заложить такой функционал в свой класс квадрат::отобразить_свой_размер_в_попугаях_в_нечто(). А весь геморой от того, что религия запрещает квадрату просто сообщить нам свой размер, в неком заранее оговореном формате.
Я говорил именно о взглядах на ООП, ничего сверх этого не подразумевал. А знаю я только то, что месье соизволил сообщить в этой беседе ![]() А без ответов на эти вопросы ты не можешь написать структуру классов? ![]() P.S. Ты С++ случайно не у Гостева в МИЭМ-е учился? -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
||||||||||||
|
|||||||||||||
w1nd |
|
||||||||||||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: нет Всего: 54 |
А что вы мне тычете в нос википедией? Это все равно что на собрание сочинений Васи Пупкина ссылаться ![]()
Вот уж никак не география. Проекция объекта вся уместилась между двумя координатами. И учебники здесь не при чем, просто постановки задачек вспомните: из точки А в точку Б... ![]()
Ну с чего вы взяли? У класса вы определили метод, способный сообщать информацию об этом классе некоему интерфейсу. Интерфейс этот реализуете как вашей душе угодно! В чем проблема, откуда вдруг вы видите необходимость еще в сотне методов или невозможность этим классом пользоваться?
Перечитал. Готов подписаться почти под каждым словом. А дело-то в чем?
Проблема заключается в том, что мы создаем лишние связи там, где без этого можно обойтись. В случае со свойством мы намертво связываем пользователя и объект с типом и содержанием этого свойства. Потом это в одностороннем порядке уже не изменить. Да, конечно, LSD сейчас же скажет, что в getter'е мы сможем произвести любое преобразование, поэтому нет никаких связей. Пусть так, но если делать "по-моему", то никаких преобразований не потребуется, потому что пользователь не будет зависеть от свойства объекта.
Я тоже пару раз совершал такую ошибку, так что извиняю ![]() То, что вы иллюстрируете не имеет ничего общего с тем, что я предлагал. Предположение о методе на каждый вид обмена - ваше, я же привел иной пример (в ответ MoonCat). Да, я ни разу не опробовал данный подход в реальных проектах. Но (и я об этом уже говорил, по-моему) ООП практически невозможно внедрить частично в структурно-ориентированный проект. Кстати, тот пример который вы мне приводили (про свойства) и есть попытка такого смешивания. Вот я и не пытаюсь. И еще очень ограничивает отсутствие МН (я ведь давно программлю только на Java). Но и это еще не все причины. Я считаю безусловным злом попытки внедрить какие-то новые подходы в устоявшуюся систему/фреймворк. Поэтому в структурно-ориентированной среде я практикую структурный подход. А в процедурно-орентированной ни за что не буду внедрять объекты. -------------------- ![]() ![]() |
||||||||||||
|
|||||||||||||
Domestic Cat |
|
||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 4 Всего: 172 |
Интересно, и где будет геометрический центр у произвольного полигона или прямой?
Повторю: где написано что любой геом объек есть точка?
Вот в чем:
В случае с методом мы точно также "намертво связываем пользователя и объект с типом и содержанием этого метода". Метод тоже возвращает определенный тип, принимает определенные параметры. Разве это не связь? -------------------- |
||||||||||
|
|||||||||||
Sleepy_PIP |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 512 Регистрация: 30.6.2004 Где: Moscow Репутация: нет Всего: 12 |
квадрат вырождается (да и круг и прочая плоская и nD геометрия) при нектором соотношении его Size (которое во превых далеко не всегда всего 2 размера, и которое можно кстати и не наследовать вооще) и расстояния до оного. т.е. в принципе может. просто вопрос насколько велика модель, где составными частями являются точка и квдрат ... я прав если это попытка описания 3D граф. движка ![]() ![]() Так что ООП, то ООП, и про наследование можно много говорить, но лучше изначально задуматься а для чего все это - где (предметно) ООП собрались применять ... а? т.к. ответы на все вообщем-то базовые моменты давно и хорошо изложенны в разнообразной литературе, есть и сранения и анализ математических и аналитеческих умов ... хотя конечно пытливые умы всегда стявят под вопрос все. и это наверняка правильно. (я скорее не к Вам, а к Вашему оппоненту и вообще обо всем этом споре). -------------------- -- Sleepy_PIP. Pavel Pryazhentsev (ex. 2:5020/141) "... Лучше быть нужным, чем свободным ..." |
||||
|
|||||
w1nd |
|
||||||||||||||||||||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: нет Всего: 54 |
До этого мы говорили только о пользователе объекта, т. е. о прикладном программисте.
Это к чему написано? Если вам нечего возразить по-существу, зачем писать нелепицу?
Между строк вычитали? Или на HTML-тэгах гадали? Там о вашем эктравагантном видении ни слова.
Концепцию я как раз предложил, вы же, похоже, ожидаете примеров кода. Примеры кода я писать не буду - в этом нет необходимости. А конструктивной критики с вашей стороны пока не было.
Религия. Идеология, которая приносит свои плоды. Если вам удобен структурный подход - кто спорит, пользуйтесь, только не нужно мешать мух с котлетами. Допустим, вам потребовалось отобразить размер квадрата в попугаях. А вы уверены, что тот, кто делал этот самый класс с вами согласится? Если у вас будет возможность заполучить размер и отобразить, как вы того хотите, вас попросту заставят это в последствии переделать (за свой счет), в ином случае вы такой участи избегнете.
Нет, вы говорили о вглядах на программирование. Если вы хотели сказать что-то иное, нужно было говорить. И, настаиваю, примера с точкой и квадратом (и контактом и компанией, позднее) более чем достаточно.
Нет, в МИЭМе я не обучался. Да и вообще, ВУЗы программированию обучать пока не в состоянии (учить некому). Но это к слову, не нужно отвечать на эту реплику. З. Ы. LSD, у меня возникло впечатление, что вы отвечаете только с тем, чтобы оставить за собой последнее слово. Побольше конструктивизма, а? Добавлено @ 21:19
У прямой не может быть центра, как не может быть проекции прямой. У отрезка прямой, так же как и выпуклого полигона с произвольным числом вершин, геометрическим центром будет точка, равноудаленная от всех вершин (или концов, в случае с отрезком).
А что, простая логика вам не помогает принять это утверждение? Много где писано, много где сказано - я что, справочник что ли?
Это первая из двух связей. Вопрос в том, нужна ли вторая. Это сообщение отредактировал(а) w1nd - 14.5.2006, 21:20 -------------------- ![]() ![]() |
||||||||||||||||||||
|
|||||||||||||||||||||
cromm3 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 86 Регистрация: 22.3.2006 Репутация: нет Всего: нет |
Господа-Товарищи, а можете привести реальный пример кода идеальной ОО программки(не большой)? Так будет интересней
![]() ![]() |
|||
|
||||
w1nd |
|
||||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: нет Всего: 54 |
Опять пример кода ![]()
-------------------- ![]() ![]() |
||||
|
|||||
cromm3 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 86 Регистрация: 22.3.2006 Репутация: нет Всего: нет |
А как, программно, узнать, какую часть площади плоскости занимает квадрат? Я извиняюсь, но просто хочется понять…
|
|||
|
||||
Domestic Cat |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 4 Всего: 172 |
Ниасилил.
Может у вас логика какая другая... Но вот мне кажется что это чепуха... Приведите ссылку или согласитесь. Да вы демагогией занялись... А жаль, хотелось бы что-то интересное для себя вынести. -------------------- |
||||
|
|||||
LSD |
|
||||||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 9 Всего: 538 |
Это я к тому, что очень хочется посмотреть как ты напишешь сколько нибудь серьезную программу с GUI, без того чтобы получать размеры компонентов (раз уж ты заявляешь, что компоненты не должны разглашать подобные сведения).
Если я буду разрабатывать класс квадрат, то я реализую базовый функционал для квадрата в декартовой системе: координаты, размер и т.п., плюс обеспечение корректности внутреннего состояния объекта (чтоб размеры сторон нельзя было сделать отрицательными и т.п.). Если кому-то понадобится квадрат в косоугольной системе координат, или с размером в попугаях, или еще какая экзотика, пусть сам и реализует. Возможности я для этого предоставил, все необходимые данные доступны.
Твои впечатления, это твое личное дело, пусть будет так. Это сообщение отредактировал(а) LSD - 14.5.2006, 23:40 -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
||||||
|
|||||||
Sleepy_PIP |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 512 Регистрация: 30.6.2004 Где: Moscow Репутация: нет Всего: 12 |
Лично меня волнует сильнее не ВАШИ рассуждения, а ошибка скрипта на этой ветке.
Все такие блин сильные типа теоретики, а ошибка скрипта показывает обратное мнение обо всех. ![]() вот. простая штука. ![]() -------------------- -- Sleepy_PIP. Pavel Pryazhentsev (ex. 2:5020/141) "... Лучше быть нужным, чем свободным ..." |
|||
|
||||
Tirael |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 154 Регистрация: 31.1.2006 Где: Москва Репутация: нет Всего: 7 |
Уважаемый....данный квадрат будет занимать четверть плоскости. Или мне кажется ? --------------------
|
|||
|
||||
w1nd |
|
||||||||||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: нет Всего: 54 |
Согласиться с чем? Что чепуха? ![]()
Т. е. вы реализуете структуру с контролем целостности полей и некоторыми общеупотребительными сервисными методами для преобразования данных, хранящихся в этой структуре. Очень хорошо, что из этого следует?
Как я уже дважды (если не больше) писал в этой теме, GUI делать я в ООП не буду даже и пытаться. Когда я делаю гуевые компоненты в Java, я не отступаю от принятого авторами стандарта. Переписывать существующие не-ООП фреймворки с нуля невыгодно, а гибрид делать невыгодно тем более - всё равно ничего хорошего не получится.
С собственными атрибутами может работать только сам объект. Если некоему объекту X требуются данные квадрата, единственный путь - реализовать в квадрате обработчик сообщения (метод), который передаст эти данные объекту X.
Вам шашечки или ехать? Это сообщение отредактировал(а) w1nd - 15.5.2006, 04:19 -------------------- ![]() ![]() |
||||||||||
|
|||||||||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 11 Всего: 173 |
Пардон, не улавливаю отличий от банального getter'а. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
Tirael |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 154 Регистрация: 31.1.2006 Где: Москва Репутация: нет Всего: 7 |
Я понял...
Это все провакация. Задуманная, чтоб просто поговорить на умную тему, и поспорить ниачом. Вначале было интересно. Затем было смешно. Сейчас уже не смешно.... Это сообщение отредактировал(а) Tirael - 15.5.2006, 01:34 --------------------
|
|||
|
||||
w1nd |
|
|||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: нет Всего: 54 |
Чем ловите? Разница в том, что вы не можете получить данные квадрата, в отличие от ситуации с getter'ом. Это сообщение отредактировал(а) w1nd - 15.5.2006, 04:25 -------------------- ![]() ![]() |
|||
|
||||
Ivan Kolesnikov |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 113 Регистрация: 9.3.2005 Где: г. Новокузнецк Репутация: нет Всего: 6 |
Привет! w1nd, ты считаешь не верным, чтобы у объекта можно было получить информации о его размере, так как тогда будет привязка к типу данных. Но при изменении типа например с числа пикселей в число попугаев ![]() Почему тогда объект не может сообщить свой размер? Я не понимаю! ![]() Это сообщение отредактировал(а) Ivan Kolesnikov - 15.5.2006, 04:45 --------------------
|
||||||
|
|||||||
w1nd |
|
|||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: нет Всего: 54 |
Я не считаю это верным или неверным. Просто это будет нарушением принципов ООП. Это сообщение отредактировал(а) w1nd - 15.5.2006, 05:15 -------------------- ![]() ![]() |
|||
|
||||
Ivan Kolesnikov |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 113 Регистрация: 9.3.2005 Где: г. Новокузнецк Репутация: нет Всего: 6 |
Почему не можем запросить данные? Чем сообщение: "запиши свой размер в такую-то переменную" (под этим я понимаю и возвратить как результат функции) нарушает принципы ООП? Если у объекта это страшная тайна, он вызовет ошибку, а если ему нечего скрывать, то вернет результат. Это сообщение отредактировал(а) Ivan Kolesnikov - 15.5.2006, 05:26 --------------------
|
|||
|
||||
powerOn |
|
|||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: нет Всего: 159 |
Мы все учимся (или учились) по каким-то материалам, книгам, мануалам. Так вот, уважаемый w1nd, не подскажите ли Вы, каков источник ваших знаний о принципах ООП? Хочу почитать. Спасибо. |
|||
|
||||
Domestic Cat |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 4 Всего: 172 |
Ну конечно, а если нарисовать квадрат на листке бумаги, скомкать и выбросить - он выродится в мусорную корзину. Блин, какая "ячейка координатной сетки плоскости" в геометрии? Вы вообще проходили стандартный курс аналитической геометрии или нет?
Может объясните разницу - на примере?
ППКС -------------------- |
||||||||
|
|||||||||
onsh76 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 20.11.2005 Где: Beautiful BC Репутация: нет Всего: 5 |
Domestic Cat, да нет наверное смысла сказки глухому рассказывать ...
Винград форум силен тех.специалистами - за это Вам большой респект... Нафига давать простор дилетантам и демагогам? Закрывайте тему, господа модераторы, либо перемещайте ее в "Оффтоп"... |
|||
|
||||
UnicornMirage |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 138 Регистрация: 15.11.2005 Репутация: нет Всего: 1 |
не нашел здесь ничего интересного для себя. некрасивый спор. пустая трата времени.
|
|||
|
||||
ALKS |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 354 Регистрация: 22.3.2006 Репутация: 2 Всего: 11 |
присоеденияюсь к просьбе. |
|||
|
||||
vinegr |
|
|||
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 6.2.2006 Репутация: нет Всего: 3 |
IMHO, следует исчерпывающий ответ на ваше заявление "это не является ООП!" - если определить объект-структуру, структурные методики формально включаются в ООП. На мой взгляд, w1nd прав, но схоластика, в которую он ушел - тривиальна. Любая практическая реализация ООП кроме объектов предусматривает "среду", в которой эти объекты "плавают". Да, w1nd прав, что существующие технологии не ограничивают программиста только "конструированием объектов", а допускают "подрихтовать среду исполнения" - и в этом смысле не являются "pure-ООП". Я бы также заметил, что базовые свойства сред исполнения ООП-программ (наследование, например) - не сводится к обмену сообщениями между строго изолированными объектами. Т.е. среда, в которой функционируют объекты - необъектна. Ну да, "pure-ООП" средств сейчас нет - потому что нет ни способа практической реализации, ни нужды в таких средствах. |
|||
|
||||
w1nd |
|
||||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: нет Всего: 54 |
Подведём итог. Изначальный вопрос - что может быть странного (или непонятного) в примере наследования квадрата от точки - так и остался без ответа
![]()
Я не могу сказать, что учился у каких-то определенных авторов. Также, к сожалению, не смогу назвать точно назвать книжки, которые читал, так как они были бумажными и давно перекочевали в помойку; сейчас я подобных книжек не читаю. Но труды Буча, я думаю, читали (читают) все. Текущая тема содержит много цитат из книжки Алена Голуба (Allen I. Holub, "Enough rope to shoot yourself in the foot: Rules for C and C++ programming"). Еще могу вспомнить Пола Лукаса, Стефана Дьюхарста, Кэти Старк. У некоторых книжек вообще автора не было (одно время издательства позволяли себе такие безымянные переводы). Но главное - я никогда не считаю мнение того или иного автора истиной в последней инстанции. Эти самые авторы ничем не отличаются от нас - ушли из программирования благодаря продвижению по карьерной лестнице и теперь обладают временем для писательства.
Осторожнее с высказываниями, дружище. Судя по вашей решимости в определениях, вы говорите о себе. -------------------- ![]() ![]() |
||||
|
|||||
Domestic Cat |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 4 Всего: 172 |
Совершенно согласен с фразой:
Спасибо. Ванкувер? Жаль так там и не побывал. -------------------- |
||||
|
|||||
NotGonnaGetUs |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 25.2.2005 Где: Москва Репутация: 8 Всего: 12 |
[quot w1nd]
Подведём итог. Изначальный вопрос - что может быть странного (или непонятного) в примере наследования квадрата от точки - так и остался без ответа Разумеется, это была чистой воды провокация; мне самому чье-либо мнение по затронутым в теме вопросам... как бы это сказать... не очень интересно. Что ж, некоторые собеседники (не буду указывать пальцем) выявили непонимание идеологии ООП (точнее выражаться не буду). [/quot] Гхм. Ответ на изначальный вопрос прост: нарушается принцип подстановки Лисков. Если следовать вашей логике, то выходит этот принцип нарушение "основ ООП" вместе с другими основополагающими шаблонами распределения обязанностей (GRASP)? Очень интересная точка зрения. Если последовательно провести вашу линию в жизнь, то окажется, что правильнаяя ОО программа должна состоять ровно из одного класса. В самом деле, вернёмся к вашему решению об отображении размеров квадрата в статусБаре. Почему вы решили, что квадрат должен говорить статусБару, что тот должен отображать?! Чем СтатусБар хуже? Сделаем в нём метод showКвадрат(квадрат:Квадрат). Чтобы сильно не мучаться соберём статусБар и квадрат в один класс. Полное сокрытие данных! Идилия! Кстати о наследовании... Мейер выделяет 12++ форм наследования, начиная от наследования интерфейса и заканчивая наследованием реализации. Далеко не все из этих форм наследования доступны в ОО языках. Попытка наследовать класс квадрат от класса точка - это пример наследования реализации. Наследуется не поведение (квадрат _всегда_ ведёт себя как точка), а какие-то языковые конструкции. Так же точно можно наследовать:
Тоже хотите задать вопрос "что может быть странного" в этом примере? То что вы называется чистым ООП это ваше самостоятельное изобретение. Можно попытаться получить на него патент. Минус в том, что вы используете для своего изобретения слова, значения для которых уже давно определены... Рекомендую к чтению не книжки безымянных программистов на С, а что-нибудь из нижеследующих: http://www.ozon.ru/context/detail/id/2336754/ - что такое ОО метод http://www.ozon.ru/context/detail/id/1048352/ - что такое ОО дизайн http://www.ozon.ru/context/detail/id/1616782/ - немножко реальных задач |
|||
|
||||
w1nd |
|
|||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: нет Всего: 54 |
2NotGonnaGetUs: сударь мой, то что вы высказали - сами должны это понимать - бред. Вы, видимо, не прочитали ничего из того, что я здесь писал.
З. Ы. Да, и кто такой Мейер? Всего лишь безвестный основатель EiffelSoft, хех. З. З. Ы. Еще и два плюса за этот бред получили ![]() Это сообщение отредактировал(а) w1nd - 16.5.2006, 17:00 -------------------- ![]() ![]() |
|||
|
||||
Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 4 Всего: 172 |
Если честно, то то, что вы здесь высказали - бессвязные мысли, даже не оформленные во что либо законченное (хотя бы в код что ли) - не знаю как и назвать... Если просто покричать охота - вам не сюда. Потрудитесь вести спор нормально, а не кричать "бред" не отвечая по существу. Это предупреждение. -------------------- |
|||
|
||||
w1nd |
|
|||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: нет Всего: 54 |
Ваши слова: "то, что вы здесь высказали - бессвязные мысли" - есть ваше личное мнение, не более того. Единственное что можно охарактеризовать, как бессвязное в теме - вопросы (ваши и прочих). Я не намерен вести споры (тем более нормально), когда за мои слова выдают откровенную чепуху. Нормально я буду отвечать на адекватные вопросы. Если вам не нравятся ответы, закройте тему; если вам нужно дать покричать другим - выкиньте меня из форума. -------------------- ![]() ![]() |
|||
|
||||
Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 4 Всего: 172 |
Не увидел никакой чепухи, в данной теме вы именно это и утверждали. Если считаете, что ва неправильно поняли - уточните, в чем. -------------------- |
|||
|
||||
chipset |
|
||||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 4 Всего: 164 |
А я считаю, что в учебе скромность и отсутствие мании величие тоже немаловажный фактор.
А можно по пунктам и с цитатами? Просто видишь-ли, дело в том что теория ООП используется на практике и большинство людей согласны с тем что данные которые надо открыть -- надо открывать, ибо в этом случае данные представляют собой интерфейс. Ты же, пытаешься посягнуть на фундаментальное. Ок, ноу проблем, никто не сдерживает так сказать, "полёт мысли" и абстрактное мышление. Но будь добр доказать что ты прав.
(пошёл наследовать класс XML ноды от точки) --------------------
|
||||||||
|
|||||||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 11 Всего: 173 |
w1nd, два вопроса:
Совместима ли статическая типизация с «хорошим ООП»? Являются ли примитивные типы нарушением принципов «хорошего ООП»? -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
powerOn |
|
|||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: нет Всего: 159 |
Тут возникло предложение позвонить в Sun Microsystems и попросить заменить класс Object на класс Point ...
![]() Теперь все от точки наследовать будем!!! ![]() ![]() |
|||
|
||||
LSD |
|
||||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 9 Всего: 538 |
Ну хорошо, предположим что в существующих GUI фреймворках не соблюдаются ООП принципы, и комбинировать эти два подхода не выгодно. Хотя не совсем понятно как получается что:
при этом если взять, что Java, что .NET там почти все построено на концепции properties, а: Ну ладно, это не суть важно, вопрос в другом. Были же у вашей системы, модули которые были достаточно автономны, чтобы их можно было бы реализовать "в соответсвии с принципами ООП"? -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
||||
|
|||||
Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 4 Всего: 172 |
Модератор: Сообщение скрыто. -------------------- |
|||
|
||||
w1nd |
|
||||||||||||||||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: нет Всего: 54 |
Я тоже так считал. Когда учился.
Назовите свои pro et contra. Пока один лишь Domestic Cat возразил по существу, говоря, что квадрат в реальном мире не может быть представлен, как точка (хоть он в этом и не прав).
Ну а я утверждаю, что подобного не писал ![]()
Добавлено @ 23:28
Да. Нет. Что вы хотели сказать? Добавлено @ 23:34
Не из одних properties все они состоят. Под фрагментами я имел в виду кусок модели классов, способы взаимодействия отдельных классов и прочие подобные детали. Что касается последнего вопроса - да, безусловно. Что из этого следует? Это сообщение отредактировал(а) w1nd - 16.5.2006, 23:38 -------------------- ![]() ![]() |
||||||||||||||||
|
|||||||||||||||||
LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 9 Всего: 538 |
Конечно, но без них они не смогут существовать. Подавляющее большинство взаимодействия мужду объектами идет посредством properties.
И они были написаны в соответсвии с твоими представлениями об ООП? -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 11 Всего: 173 |
Я пытаюсь уяснить для себя ваше понимание ООП. Если убрать из ваших постов излишний апломб и некорректные примеры, я с вами даже соглашусь по большей части. (Впрочем, вполне вероятно, что я вас опять неправильно понял, и вы меня быстро заставите изменить свое мнение). Вы утверждали, что getters/setters и свойства нарушают инкапсуляцию и создают излишние связи между объектами. Но четкая граница между getter и посылкой сообщения «скажи мне какую-то свою характеристику» объекту так и не была проведена. Свойство может скрывать сколь угодно сложную логику. Если нет прямого соответствия между значением свойства и каким-либо полем класса, если оно возвращает нечто вычисляемое, существенную информацию об объекте — оно не противоречит ООП и является синтаксическим сахаром над нотацией метода/пары методов, не так ли? (Если не так, я уж и не знаю, что сказать). Но есть объекты, информация, содержащаяся в полях которых, составляет часть публичного интерфейса. Например, возьмем класс… нет, лучше интерфейс коллекции. Коллекция должна предоставлять метод для перебора своего содержимого — это ее наиболее существенное качество. Но можем ли мы отказать в существовании свойству или getter'у, который будет возвращать число элементов, содержащихся в коллекции? А ведь это тело этого свойства, скорее всего, будет состоять всего лишь из возврата значения поля. Вы сказали, что примтивным типам не место в ООП. Но так или иначе, без типов, соответствующих, к примеру, множеству целых чисел, не обойтись. Значит, нужны классы, обладающие поведением целых чисел. А они-то как общаться будут с окружающим миром, не выпадая из рамок ООП? А вам не кажется, что при таком подходе количество излишних связей только возрастает? Ведь теперь класс квадрата обязан знать обо всех типах объектов, в которых ему надо отобразить свой размер. Или введем еще интерфейс нечто_в_чем_можно_отобразить_размер_квадрата? А кто сказал, что отказ от парадигмы ООП — это непременно плохо? Не будьте догматиком. Цель проектирования — не следование парадигмам ООП (которые всяк норовит истолковать по-своему), а повышение уровня абстракции. Так что дело не в «недостаточной объектно-ориентированности» существующих фреймворков, а в том, что так называемое «чистое ООП» не является универсальным подходом. Говоря формальным языком, полностью stateful модель точно так же не всегда подходит для описания предметной области, как и полностью stateless. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 4 Всего: 172 |
Речь шла (как я понял и на чем делал упор) о геометрии, а не вообще квадрате в любом контексте. И в этом случае подобное наследование ничем не лучше приведенных NotGonnaGetUs примеров. Относительно наследования вы утверждали что 1. Квадрат нужно наследовать от точки, тк у квадрата есть те же поля что и у точки 2. Пример номер два: наследовать квадрат от Size 3. Пример номер 3: Company можно наследовать от Contact. Может вы этого не писали? -------------------- |
|||
|
||||
w1nd |
|
||||||||||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: нет Всего: 54 |
Уж вы укажите явно на апломб и некорректные примеры. Я, честно говоря, таковых не нахожу, но если я совершаю ошибки, хотелось бы знать где, иначе я буду продолжать в том же духе.
Да нет, я пытался точно ответить на вопрос "вы считаете". Я не считаю примитивные типы недопустимыми.
Если мы начнем считать все методы, возвращающие некоторое значение свойством (о которых я говорил), то далеко уйдем. Я имел в виду именно свойства java-бинов или подобных классов, то есть с getter'ом и setter'ом. В свойствах я вижу три беды (это навскидку, возможно я что-нибудь забыл). Во-первых, навязывается существование того или иного свойства объекту (а также его тип - пользователю объекта), тогда как в процессе "эволюции" это свойство может поменять тип или вообще стать ненужным. То есть, как я говорю - лишняя связь, которую придется поддерживать. Во-вторых, свойство навязывает структурный подход к взаимодействию с объектом: получить значение свойства, произвести некоторые вычисления, результат поместить обратно или передать другому объекту. Что происходит? Логика, свойственная объекту, вынесена из него. Например, часто повторяющийся во всех GUI-фреймворках приём с компонентом и контейнером: допустим, произошло событие, которое контейнеру необходимо передать своим компонентам. Контейнер получает свойства компонент, анализирует их (может ли компонент обработать данное событие) и передает событие на обработку. По объектной идеологии компонент просто должен получить событие. Дальше он либо его обработает (если может), либо вернет контейнеру или остальным компонентам; в этом случае нет необходимости в свойстве state компонента, а логика контейнера значительно более проста. В-третьих, мы даем право пользователю объекта интерпретировать свойство так, как он того хочет, что не есть правильно. Ведь тогда никто не помешает отобразить размеры ящиков в апельсинах или что-нибудь в этом роде. Вообще, в реализации множества методов-обработчиков-сообщения может быть всего лишь возврат (или присваивание) некоторого атрибута класса. Дело-то не в этом, в а подходе (пресловутая вывернутость на изнанку) - объект сам управляет своими атрибутами. И подход этот приносит свои плоды - в общем случае можно без рефакторинга половины проекта значительно модифицировать реализацию класса.
Точнее, нечто_в_чем_можно_отобразить_текстовую_информацию. Я это уже писал.
Вот, мы наконец-то подобрались к источнику беспокойства участников обсуждения. Я не призываю отказаться от существующих подходов! Я призываю отделить мух от котлет. И это я тоже уже писал. -------------------- ![]() ![]() |
||||||||||
|
|||||||||||
w1nd |
|
|||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: нет Всего: 54 |
Ну уж нет. Давайте разберемся. Не с геометрией, которую я упомянул только в том смысле, что речь не идет о чем-нить вроде точки временного отсчета, а вы полезли в какие-то дебри. Я знать не знаю каких-то точных определений, я пытался передать суть. Я писал:
Что касается примеров NotGonnaGetUs (и вашей позиции, кстати), человек просто решил для себя, что я не прав. Отреагировал на некое ключевое слово (фразу), вырванное из контекста повествования. И примеры его никак не проистекают из моих слов. -------------------- ![]() ![]() |
|||
|
||||
Domestic Cat |
|
||||||||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 4 Всего: 172 |
Этого никто и не утверждает. Объект есть модель некоей сущности реального мира, отражение свойств, существенных в данном контексте. Объект класса Company соответствует к-л реальной кампании, ну, возможно является базовым классом если важно разделить кампании на типы.
В том-то и дело, что не определяется. Вы стараетесь занять сейчас промежуточную позицию - с одной стороны, вы отрицаете механическое сравнение полей и методов, с другой делаете вывод о том, что поля и методы должны быть
наследникам, но отрицаете что слово является(есть) должно быть фактором в построении иерархии наследования. По какому принципу тогда вы делаете вывод о свойственности полей/методов? Такой выбор наследования не может быть правильным, тк свойственность методов или полей вы можете определить лишь на данный момент. Завтра или через год требования к продукту изменятся, и ваш базовый класс получит те методы, которые несвойственны наследникам. Почему-то вы хоть и говорите о том, что вроде как строго придерживаетесь ООП в рассуждениях, но все-таки забываете любой учебник по ООП говорит о том, что наследование есть специализация, уточнение существующего класса; базовый класс является более общим случаем наследников. Вы-то можете как угодно определять наследование, но в таком случае и разговор ни о чем - речь ведь идет об общепринятых понятиях. Для меня и Company, и Contact отражают некоторые свойства реальных компаний и контактов, и исходя из реальных объектов я понимаю, что компания не есть контакт, а квадрат не есть точка. Это немного более высокий уровень абстракции, чем свойственность методов и полей, и потому правильный, тк позволяет отразить отношение данных классов более полно. Потому здесь и не будет ошибки такой как
Добавлено @ 15:08
Метод - точно такая же связь. Никаких отличий нет.
Если так рассуждать, то должны существовать только void методы.
Почему? Ну проедположим метод что-то возвратил и соответственно возвращенное значение можно интрерпретировать как угодно. В чем разница?
Ну и отделите на здоровье. Напишите свой небольшой фреймворк, построенный на вашем толкоании ООП. А дальше и посмотрите, насколько правильны ваши рассуждения. Коммунизм тоже был правилен в теории но на практике оказалось совсем иначе. -------------------- |
||||||||||||||||
|
|||||||||||||||||
w1nd |
|
||||||||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: нет Всего: 54 |
В идеале - да.
Снова одно и то же. Вы читаете именно то, что выделили как цитату? Да, я могу определить поля и методы лишь на данный момент, но базовый класс в дальнейшем менять я не собираюсь! Я могу сколько угодно обобщать, могу создавать новых наследников - нет необходимости менять базовый класс. Или приведите пример (отличный от того, что вы приводили с добавлением пола в контакт, ибо в том случае я показал, как следовало это сделать). А классы отражают свойства не реальных объектов, а объектов данной модели. Ничего больше. В такой модели состав и содержание полей той же компании может полностью отличаться от реального "прототипа".
В программе, предназначенной для каталогизации контактов, например, все объекты - контакты. Никаких других не может возникнуть никогда. Объекты внутри данной программы - и есть самые что ни есть реальные объекты.
Между чем нет никакой разницы в случае компонента, обладающего свойством size (Dimension) и компонентом без доступа к этому свойству, но методом resize(int, int)? Это сообщение отредактировал(а) w1nd - 17.5.2006, 16:37 -------------------- ![]() ![]() |
||||||||
|
|||||||||
Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 4 Всего: 172 |
Признайтесь, делали ли вы реальные проекты или нет ![]() -------------------- |
|||
|
||||
w1nd |
|
|||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: нет Всего: 54 |
Реальные проекты целиком на ООП - никогда. Только отдельные модули. Но цитата к данному вопросу не подходит. Это сообщение отредактировал(а) w1nd - 17.5.2006, 16:40 -------------------- ![]() ![]() |
|||
|
||||
NotGonnaGetUs |
|
||||||||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 25.2.2005 Где: Москва Репутация: 8 Всего: 12 |
Раз вы так любите разделять мух, давайте поразделяем.
Вызов _любого_ метода связывает вызывающий класс с вызываемым. Если метод возвращает какое-либо значение или требует каких-либо параметров, то происходит и связь по "типу"(с). Здесь нет ничего спецефического для getter/setter. Пример с Date и String прозвучавший из ваших уст не решает эту проблему. Он приводит только к невозможности воспользоваться статической типзацией для контроля типов. Вместо того, чтобы при смене формата хранения даты внести исправления в зависимные классы (т.к. они перестанут компилироваться), придётся в ручную искать все использования String, что далеко не тривиальная задача. Альтернатива - поставлять вместе со String парсер для разбора этой строки и превращения её в date. Спрашивается, чем это лучше простого возврата Date?
Кому навязывает структурный подход? Мне нет. Вам? "во всех GUI-фреймворках". В Swing компонент получает те события на которые он подписался. Никакой анализ контейнер не выполняет. "По объектной идеологии компонент просто должен". Вы пытаетесь описать chain of responsibility. Данный подход с большим натягом применим к GUI. AWT хорошо показало недостататки такого решения. Возможно оно делает логику контейнера более простой, но чертовски усложняет налаживание взаимодействия между _большим_ количеством компонент. Вы вообще представляете какая цель приследовалась при создании спецификации на java beans? Или для вас java bean это просто "класс данных"? Без javabeans не было бы визуальных конструкторов gui для кастомных компонент, о чём так сильно мечатли в конце 90х.
Мы? Я не даю такого права. Вы даёте? Зря. А сам пользователь может не правильно интерпретировать любой компонент класса, начиная от назначения параметров и кончая назначением методов. Н-р, можно использовать String как счётчик. String x = ""; ... x += " "; ... int count = x.length(); Объявим String вне закона? Способов заставить человека правильно "понимать" два и оба не совершенны. Первый, описать правильное понимание в javaDoc'e к классу. (Всегда найдётся тот, кто не станет ничего читать, т.к. он уже "перестал учиться" и ему теперь всё можно). Второй, ввести в код как можно больше проверок и бить по руками за "неверное" использование. (Реализуемо только для тривиальных случаев, н-р, проверок диапазонов значений, asserts). Все три ваши пункта относятся в равной степени к любым методам класса, а не только getter/setter...
Java bean не всегда плохой дизайн, плохой дизайн не всегда java bean. Вам знакомо понятие data transfer object? Наличие setter'ов и getter'ов (в том или ином виде) неизбежно в классах со сложной процедурой инициализации. Шаблоны factory, builder, inversion of control бессмысленно называть "процедурными извращениями", они неотъемлемая часть мира объектов. Злосчастный JFrame, которому вы запрещаете иметь get/set Title, ещё один пример, когда объект не должен управлять своим аттрибутом. Он должен отобразить title в нужном месте окна, но он не может знать какое у него должно быть значение. Вы держите в голове тривиальный пример data object'a (попались на этом что ли?) и развиваете целую концепцию о пагубности getter/setter, прибегая при этом к сомнительной терминологии. Это не серьёзно. ------
Модель классов никогда не является моделью объектов реального мира. Кстати, вы не считаете случайно геометричекие объекты объектами реального мира? ) Прицип подстановки говорит: B is-a A если в любой программе A можно заменить на B и программа будет работать точно также. Всё просто и не надо изобретать "свойственность". Определите операции над классами Point, Size и Square и тогда можно будет судить о том, правомерно наследование или нет. Т.к. вы этого не сделали, мы вправе предположить наиболее очевидное использование для этих классов - моделирование геометрических объектов. Поптайтесь-ка вычислить расстояние между двумя произвольными объектами(расстояние - длинна кратчайшего отрезка соединяющего два объекта): 1. (point, point) 2. (point, square) 3. (square, square) 4. (yyy, xxx) // другие объекты. Особенно интересен случай 2, и варианты, когда в метод вычислитель будет попадать класс Square приведённый к Point. Нет, честное слово, очень интересно увидеть "идеалогически" верное решение этой проблемы в вашем исполнении. Общий каркас, без математики. |
||||||||||||
|
|||||||||||||
Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 4 Всего: 172 |
-------------------- |
|||
|
||||
chipset |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 4 Всего: 164 |
Это просто не нужно в текущих задачах. Кроме того, как я упомянул, я защищаю ОБЩЕПРИНЯТУЮ методику а для того чтобы сбить эту методику с её позиции нужно ВАМ привести аргументы pro. Т.е. к примеру я прихожу куда-нибудь и говорю, - Солнце крутится вокруг Земли, попробуйте доказать что это не так! Ага, нормально, а аргументы есть? В том плане что никто-же не будет мне доказывать что Земля крутится вокруг Солнца потому-что это проходят в школе с другой стороны мне придется привести кучу доказательств того что Солнце крутится вокруг Земли.
Ну. Ещё квадрат может быть представлен как набор описаний молекул хлорида натрия с детализацией до кварков. И ч0? --------------------
|
||||
|
|||||
Void |
|
||||||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 11 Всего: 173 |
Замечательно. Ну и зачем тогда был нужен этот спор о терминах, бессмысленнный и беспощадный? Неужели вопрос, что нужно понимать под якобы правильным ООП, стоил обсуждения на семи страницах, если правильное ООП оказывается вовсе не эквивалентно правильному дизайну?
ОК. Напишем на знаменах: «Stateful — это наше все». Чем это поможет в реальных задачах идеального мира, где каким-то чудом все программное окружение оказалось выдержано в таком духе?
А эту проблему надо решать строгой типизацией, а не отказом от свойств. Вы предлагаете решить проблему введением черного ящика, который обладает исключительным знанием о назначении своего содержимого. А почему не значение, обладающее структурным (а не identity) равенством, и лишь описывающее, что с ним надо делать, оставляя окончательное решение на откуп пользователю? В погоне за foolproof дизайном вы теряете расширяемость. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
||||||
|
|||||||
w1nd |
|
||||||||||||||||||||||||||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: нет Всего: 54 |
Несомненно. А вся программа - суть трудноподдающийся учету набор связей. Но, наверное, есть разница между типом, определенным в некоторой библиотеке и стандартным типом? Или двумя библиотечными типами и тремя (или более)? Чем больше свойств - тем больше типов, которые доступны пользователю и должны поддерживаться. А ведь свойства эти при подходе "объект сам управляет своими данными" (см. ниже новой термин) просто не нужны.
Это с Исходников? Там говорится о формате хранения даты внутри класса Date или о самом Date, а не о шаблонах для парсинга или формате хранения в двоичных файлах. Хотя даже если бы речь шла именно об этом, весь код для исправления все равно сосредоточен в календаре, а не в строках или местах, где используются строки. Поясните, что вы имели в виду.
Мне, вам, всем остальным. Про Swing уж не рассказывайте - там этого навалом. Загляните в исходники java.awt.Container. Попробуйте переопределить processEvent() компонента и получить хоть одно событие, не разрешенное в eventMask.
Если вам так удобнее (chain of responsibility) - да. Это естественный шаблон для тех случаев, когда нельзя "залезть" в поля другого класса. И, кстати, почему вы считаете его малоприменимым для GUI? AWT показал недостатки такого метода кому? Вам? И что же, вы перестали использовать Swing?
А это-то вы мне зачем говорите? Или мне нужно в двадцатый, тридцатый, сотый раз повторить, что я и не думаю осуждать этот подход? Он просто является сомнительным, бедовым с позиций ООП. Вы сразу скажите, сколько раз мне следует написать эту мантру, я копипастом для вас постараюсь набросать.
Наслышан ![]()
А кто у вас спрашивает? Расскажите, как вы управитесь с распределением прав на примере JFrame.getState() или JFrame.getExtendedState(). Или на примере отображения размера ящиков в апельсинах.
Истинно не совершенны. Для JavaDoc нужно иметь время со стороны автора, и желание его читать со стороны пользователя. А ввести проверки не получится - свойство получено пользователем объекта, проанализировано, на основании анализа созданы некие классы, вызваны некие методы. Где и что проверять?
Только в том случае, когда кто-то эти методы не очень хорошо продумал. Но в случае с getter+setter - всегда.
Еще и еще раз обдумайте мой вопрос о послания для вас, состоящего из мантр "... я не собираюсь осуждать существующие подходы...". Про JFrame. Не нравится слово "управлять" - хорошо, пусть будет "распоряжаться". Титул JFrame может инициалиироваться из чего угодно и сколько угодно раз. Я не говорил, что нужно вообще выкорчевать оттуда этот атрибут. Достаточно удалить метод getTitle(). Не нравится терминология - предложите свою. Обсудим. И снова напоминаю о мантрах: "я говорю о пагубности только в отношении ООП". Укажите нужное число повторений.
Этот вопрос не по адресу - спросите у Domestic Cat.
Спасибо за более простую формулировку.
Наиболее очевидное использвание, говорите? Наиболее очевидным было бы решить, что Point содержит пару полей для координат, а Size - поле для размера. Этого достаточно. Наиболее очевидным было бы сказать: "не обязательно этот вариант наследования является верным на все случаи жизни; определите атрибуты и операции, тогда можно будет судить о правомерности наследования". НО. Я только множество раз прочитал различные вариации на тему своей неправоты, но ни разу - попытку оценить эту связку, исходя из наиболее очевидной структуры или попытку уточнить эту самую структуру. Единственное, чего удалось добиться - точка не есть квадрат по букве геометрии, жизненным реалиям и потому, что "я туда такой метод/поле добавлю, что точно сломается". Так что вас можно поздравить - хоть и со второго поста, но вы первым пришли к дельной мысли. Определяем операции:
А вот для вычисления расстояний между объектами и точкой данная модель никак не подойдет из-за необходимости наделить класс Point несвойственным ему методом для поиска координаты, ближайшей к заданной. -------------------- ![]() ![]() |
||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||
Domestic Cat |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 4 Всего: 172 |
Уважаемый, стандартные операции, которые вы здесь преподносите как откровение - не есть стандартные если мы рассматриваем эти объекты как геометрические. Посмотрите хотя бы на класс Point в Java2D. Здесь подойдет, тут не подойдет... Извините, но подойдет всегда если не наследовать квадрат от Point. Это не очевидно? Какие свойственно - несвойственно? В геометрии квадрат нельзя заменить словом точка, отсюда и следует что у точки есть методы, несвойственные квадрату и наоборот... "Дельная мысль".
![]() -------------------- |
||||
|
|||||
NotGonnaGetUs |
|
||||||||||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 25.2.2005 Где: Москва Репутация: 8 Всего: 12 |
Тип String самый что не на есть стандартный. Давайте все return value первратим в объекты типа String содержащие "нужным" образом отформатированные данные. Можно обойтись одним единственным типом на все случаи жизни! Замечаете разницу? Дело не в количестве типов и их принадлежности к стандартным библиотекам, а в том какая им отведена роль в приложении.
Имя пакета java.awt ни на какие мысли не наводит?
И мне в том числе. AWT уже никто не пользуется добрую сотню лет, пользуются Swing. Судя по последнему вашему вопросу вы не понимаете разницы между AWT и Swing и принятыми в них моделями обработки событий.
Затем, что вы пишите такие вещи, как те, что я выделил болдом. Что вы собираетесь или не собираетесь делать меня занимает мало. В java beans нет ничего бредового с позиций ООП. Рекомендую познакомиться со спецификациями, задачами и инструментами для их решения живущими вокруг java beans. http://java.sun.com/products/javabeans/index.jsp Мантра для медитации: "data object != javabeans". Повторять до просветления.
С каким "распределением прав", ещё один "новый термин"? Повторяю медленно, по буквам. _Любой_ метод можно использовать не верно. Ничего нового в эту проблему геттеры и сеттеры не вносят. Медитировать на класс String.
Мне очень интересно было бы узнать, с каких позиций вы рассуждаете об ООП, если вам не знакомы основополагающие понятия связанные с оо-методом?
Ангел мой, что же вы такое говорите? ОО-метода появился не просто на равном месте. Он был призван решить проблемы процедурного/структурного программирования. Среди этих проблем сложность модификации и невозможность повторного использования кода, возникающие в следствии применения функциональной декомпозиции при решении задач. Для вас не большое пояснение. При функциональная декомпозиции задача разбивается на подзадачи. Если подзадача оказалась недостаточно проста, процесс разбиения продолжается. Такой подход безусловно приводит к главное цели - решению конкретной задачи, но при этом есть два существенных недостатка. Множесто методов созданных для решения задачи _зависит от способа разбиения задачи на подзадачи_, порядок вызвов методов строго регламентирован. Как следствие, решая родственную задачу, мы не можем использовать уже существующий код. Как избежать этих проблем? Поставить данные на первое место. Почему это работает? Потому что данные изменяются _существенно_ реже, чем поведение. Класс выступает в качестве новой единицы декомпозиции. В "принципах ООП" содержатся рекомендации (не догмы), как лучше выделять классы. Что же получается у вас? Невинное требование приводит к необходимости изменять или даже создавать параллельно новую иерархию классов, хотя данные не изменились: точка осталась точкой, квадрат - квадратом. Почему? Да потому, что ваши ОО-познания всего лишь набор слов, а на практике всё таже функциональная декомпозиция и наличие у JFrame #getTitle и #setTitle в качестве оправдания. Кстати, вернёмся к тому, о чём я говорил в первом сообщении. Решить задачу вычисления расстояния между двумя объектами согласно вашей (новаторской) трактовке ООП нельзя вовсе, чтобы не скатиться к "процедурному коду" (с)w1nd. Нельзя из-за того, что для решения этой задачи недостаточно информации ни у одного из объектов - они _должны_ взаимодействовать, а это приводит к необходимости выставить наружу данные, которые будут "получены пользователем объекта, проанализированы, на основании анализа будут созданы некие классы" (с)w1nd. Это сообщение отредактировал(а) NotGonnaGetUs - 18.5.2006, 14:39 |
||||||||||||||
|
|||||||||||||||
w1nd |
|
||||||||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: нет Всего: 54 |
А вас не смущает тот факт, что компоненты Swing - всё те же компоненты AWT? Никто не пользуется ![]()
Можно еще ошибаться в названии методов. Правда, компилятор не поймет. Модератор: Оставляю, чтобы все видели. Будете переходить на личности - будет бан. Термин? С какой высоты падали? Какие понятия? Чьи термины? Не надо выдавать чьи-то формулировки за "общепринятые". Вы читаете или просто текст распознаёте?
Легко и непринужденно. Ни в чем не отступая от ООП. Да, кстати, укажите слова "процедурному коду", если найдёте. Вы просто НЕ ЧИТАЕТЕ того, что я пишу: "приводит к необходимости выставить наружу данные" ![]() Да, не утруждайтесь мне разъяснять, что есть ООП, JavaBeans, шаблоны, хороший тон в проектировании. Ваши усилия пропадают зря: вы не сообщите мне ничего нового или интересного, а ваше понимание этих вопросов - это только ваше понимание.
"Бедового". Свойства в JavaBeans противоречат ООП. Это сообщение отредактировал(а) w1nd - 18.5.2006, 20:57 -------------------- ![]() ![]() |
||||||||
|
|||||||||
Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 4 Всего: 172 |
![]() Не могу понять, почему вы в этом так уверены. Ну говорилось бы в учебниках по ооп что мол проперти плохо, но нужно идти на компромисс... Ну хоть бы на своем богатом опыте вы заработали подобное знание, чтобы можно было сказать - вот примеры моих ООП приложений, их объектная модель гораздо лучше того, что пишете вы... Но ведь ни то ни другое. -------------------- |
|||
|
||||
Void |
|
||||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 11 Всего: 173 |
Тем не менее вы в данный момент пытаетесь выдать свои формулировки за абсолютную истину. Если нет, то я не понимаю вообще смысла этого спора.
Ждем с нетерпением. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
||||
|
|||||
Irokez |
|
|||
![]() индеец ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1180 Регистрация: 20.10.2004 Репутация: нет Всего: 53 |
я бы уже после этого закрыл спор ![]() |
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 1 Всего: 260 |
Асилил
![]() ![]() |
|||
|
||||
w1nd |
|
||||||||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: нет Всего: 54 |
Господин NotGonnaGetUs имел смелость предположить, что незнание мною известной ему формулировки говорит о моем незнании формулируемого.
Этого хватит. Да, если вы мне захотите сказать, что я сам был против возврата данных (как NotGonnaGetUs) - перечитайте мои посты. Добавлено @ 00:05
Как уже было замечено (вполне справедливо), свойства, в отличие от обычных публичных полей, просто замаскированы парой методов. Но при этом остаются публичными полями. Это сообщение отредактировал(а) w1nd - 19.5.2006, 08:46 -------------------- ![]() ![]() |
||||||||
|
|||||||||
DeadSoul |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1217 Регистрация: 25.9.2005 Где: Москва Репутация: нет Всего: 11 |
Спорные аргументы приводите. http://forum.vingrad.ru/index.php?showtopi...st&p=736064 -------------------- Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". Бьем спамеров их же оружием. Пусть весь спам сыпется им [email protected] |
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 1 Всего: 260 |
Я правильно понял? Вы против данных, связанных с конкретным экземплярам объекта, как таковых? Т.е. из связки код+данные просто выбрасываем вторую часть и оставляем только методы? А что же тогда методы будут обрабатывать? Скажем, для отрисовки чего-то надо будет не просто вызвать метод отрисовки, а и обьяснить, в каком месте рисовать и какого размера(ведь данные у нас в объекте не хранятся - надо передавать)? ![]() |
|||
|
||||
w1nd |
|
|||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: нет Всего: 54 |
Нет, я против свободного доступа к данным объекта. -------------------- ![]() ![]() |
|||
|
||||
DeadSoul |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1217 Регистрация: 25.9.2005 Где: Москва Репутация: нет Всего: 11 |
w1nd, умница.
-------------------- Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". Бьем спамеров их же оружием. Пусть весь спам сыпется им [email protected] |
|||
|
||||
Exception |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 4525 Регистрация: 26.12.2004 Репутация: 2 Всего: 186 |
Я бы сейчас с большой радостью поделился своими ошибками.. Как раз вроде наследования компании от контакта. И к чему это привело. Но ведь Вам всё равно плевать на других, лишь бы Вашу идею никто не смог оспорить. Да ну, с Вами неинтересно. Очень напоминает тема вот что:
http://forum.vingrad.ru/index.php?showtopi...44&view=all Особенно мне нравится последний пост - "Усекли?". Видимо, с такой аргументацией, Ваше мышление тоже никто не "усечёт". |
|||
|
||||
w1nd |
|
|||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: нет Всего: 54 |
Я никого здесь не просил поделиться со мной ошибками или "научить" меня что-то правильно делать. Это мне действительно не интересно. Я хотел увидеть ситуацию, когда пример с квадратом действительно работать не будет. Мне казалось - всё пучком. Действительно интересно - такой пример долго не возникал, всё больше: "ты неуч, ты неумеха, ты пустозвон", да еще неподходящие примеры. А про аргументацию не надо - здесь все отличились нежеланием попросту читать. Это сообщение отредактировал(а) w1nd - 20.5.2006, 01:15 -------------------- ![]() ![]() |
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 1 Всего: 260 |
w1nd, против свободного доступа к данным методам самого же объекта?! А кто ж их тогда будет обрабатывать?
![]() |
|||
|
||||
Exception |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 4525 Регистрация: 26.12.2004 Репутация: 2 Всего: 186 |
ОК.
Такое поведение нельзя назвать нормальным. |
|||
|
||||
NotGonnaGetUs |
|
||||||||||||||||||||||||||||||||||||||||||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 25.2.2005 Где: Москва Репутация: 8 Всего: 12 |
Компоненты awt и компоненты swing находятся в различных иерархиях наследовния. Попробуйте, смеха ради, смешать те и другие компоненты. Очередь событий не имеет никакого отношения к моделям обработки событий. На пальцах: awt: при движении мышкой создаётся событие. оно попадает в компонент над которым оно произошло. если компонент его не обработал, оно идёт к следующему компоненту и т.д. swing: при движении мышкой создаётся событие, которое попадет именно в тот компонент, который на него зарегистировался. Очередь событий служит для обеспечения доставки событий, но ни как не определяет способ их возникновения и адресатов. -----
Хотелось бы читать, но приходится распознавать: "объект сам управляет своими данными" (см. ниже новой термин)" - так и не увидел, где это ниже... "как вы управитесь с распределением прав на примере JFrame.getState() или JFrame.getExtendedState()." - прав на что и между кем их нужно распределять? Насчёт чьих-то формулировок это круто ![]() Кстати о терминах:
У любого многоугольника (являющегося геометрическим объектом), который нельзя вписать в окружность, не будет "центра".
Проекция не зависит от расстояния до плоскости. (с) учебник геометрии Вы путаетесь в собственных же определениях, обвиняя при этом всех в "не понимании русского языка" и "не чтении того, что вы писали"... -----
Я всегда полагал (со ссылкой на работы классиков "поднявшихся вверх по служебной лестнице" ![]() Вы творчески переосмыслили эти термины:
У вас противопоставляются "структурно-ориентированный" и "процедурно-орентированный" "подходы" между собой и с ООП. Понять с каких позиций вы противопоставляете С-О и П-О, я так и не смог. Разницу между ПО и ООП я вижу только в способе декомпозиции, о чём писал выше. "не ООП", как я представляю, это "процедурный код с объектами": процедуры помещённые случайным образом в классы (стиль C-шников насильно пересаженных на C++)... Поскольку getter/setter (доступ к данным) по вашим словам "бредовое ООП", что равнозначно "не ООП", то получаем что получаем: вам придётся писать "процедурный код". Ах, да. Доступ к данным (c позиций "ООП"):
Перечитал одно:
другое:
третье:
четвёртое:
----
Во первых _объект_ сам себя создать в приципе не может. Объект всегда создаётся кем-то, посредством вызова конструктора. Существуют ситуации, когда создатель объекта не может (не известно на момент написания кода) или не должен (из соображений инкапсуляции) знать объект какого класса он создаёт. Решения подобных проблем задокументированы в виде паттернов ООП. Выходит паттерны ООП полностью "противоречат приципам ООП"?! ----
Вы уже не считаете, что наследование от точки это хорошая идея, гуд, но, О УЖАС(!), у класса Point публичные поля! Это же "структурное программирование"(с)w1nd! А как же утверждение:
Согласно ему должно быть написано такое:
Нет! Не то. setXAndY() может вызвать кто угодно! Надо сделать интерфейс!
Чёрт, а как же получить x и у из метода setXAndY в методе вызвавшем plsGiveMeXAndY? Сделать поля? А если нужно будет у разных точек узнать x и у? Значит нужны локальные переменные для хранения ! Хм. А этого добиться? Сделаем MutableInteger!
Так, уже лучше..., но что-то не даёт покоя... Ах, да! У MutableInteger есть getter/setter ![]() Кажется мне, как и w1nd'у, не удалось написать правильную по w1nd ОО программу, не скатившись к структурному/процедруному/плохому ооп (нужное подчеркнуть) ![]() Это сообщение отредактировал(а) NotGonnaGetUs - 20.5.2006, 15:32 |
||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||
LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 9 Всего: 538 |
Ромб не всегда можно вписать в окружность, но тем не менее центр у него есть. Другое дело что не для всякой геометрической фигуры можно дать определение центра. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
NotGonnaGetUs |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 25.2.2005 Где: Москва Репутация: 8 Всего: 12 |
Автор привёл определение "центра", как равноудалённой точки от вершин многоугольника. У робма такой точки нет. |
|||
|
||||
chipset |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 4 Всего: 164 |
У большинства геом. фигур нету такой точки ![]() --------------------
|
|||
|
||||
w1nd |
|
||||||||||||||||||||||||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: нет Всего: 54 |
Во-первых, это не совсем так (про иерархию) - вспомните окна, посмотрите, что переопределяет JComponent. В-вторых, очередь событий как раз имеет отношение к тому, куда и как попадает событие. В-третьих, см. java.awt.Component.enableEvents(). В четвертых, на всё, что касается диспетчеризации событий ввода, компоненты Swing никак не влияют.
"Распоряжается".
Это к тому, что число, возвращаемое этими методами, пользователь JFrame может интерпретировать как угодно.
Я такого (что вы что-то придумали) не говорил. Я говорил о том, что используемые вами термины не могут быть общеизвестными.
Геометрическим центром любой выпуклой фигуры является точка, равноудаленная от её вершин.
Только в случае с параллельной проекцией.
К данным объекта. К членам-данным объекта. Речь все время шла только об этом.
Я имел в виду, что в случае с точно определенным типом фигур было бы неверным делать метод, который создаст нужную фигуру в зависимости от числа переданных в параметрах вершин. Согласен, это к ООП или не-ООП не имеет отношения. Но в случае с методом Draw, рисующим объект - имеет место нарушение инкапсуляции, если только этот метод не вызывает соответствующий метод объекта.
Point в данном случае не является классом. Это комплексный тип, в одном ряду с примитивными.
Возможно, я действительно не прав, используя понимание этих терминах некоторыми "классиками". В будущем их использовать не буду. NotGonnaGetUs, чем больше вы высказываетесь (или стараетесь поймать меня на слове, или выдаете за мои слова то, что я не писал), тем больше я убеждаюсь, что вы действительно не понимаете, о чем я пишу. Если вам действительно интересно моё мнение, давайте начнем заново, более предметно. С примера о квадрате и точке - используя принцип Лисков, покажите, что такое наследование неправомерно всегда, вне зависимости от применения Добавлено @ 18:52 Про центр объекта:
Спорный пример. Нельзя назвать нормальным то, что для рисования точки пользователь конструирует квадрат. Необходимость представить точку квадратом вполне возникнуть может. Методы, каким-либо образом взаимодействующие с точками, нормально будут работать и тогда, когда им подсунут квадраты. Это сообщение отредактировал(а) w1nd - 20.5.2006, 19:03 -------------------- ![]() ![]() |
||||||||||||||||||||||||
|
|||||||||||||||||||||||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 11 Всего: 173 |
Здесь кто-то уже высказал ключевой момент, что говорить о нарушении LSP имеет смысл только в рамках контракта, который предоставляет пользователям базовый класс, его спецификаций. То есть вне зависимости от применения ничего конкретно сказать нельзя. Я могу представить ситуацию, когда наследование квадрата от точки будет оправданно (и это тоже уже кто-то говорил). Но решение о наследовании принимается не на основании свойственности данных одного класса другому. DeadSoul привел хороший пример. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
w1nd |
|
||||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: нет Всего: 54 |
В том-то и дело, что меня хотят убедить, что такого (с квадратом) не может быть, потому что не может быть никогда.
В примере, приведенном DeadSoul также говорится о том, что целесообразность модели зависит от применения. И решение о наследовании чего-либо из чего-либо принимается как раз в зависимости от контекста. Это сообщение отредактировал(а) w1nd - 20.5.2006, 21:07 -------------------- ![]() ![]() |
||||
|
|||||
Domestic Cat |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 4 Всего: 172 |
Гы, это ж и я говорил. Только вот вы невнимательно читаете оппонентов. Речь ведь (напомню раз в пятый) идет о геометрии, а не о чем-то еще, и именно вы пытаетесь убедить на геометрическом примере что наследовать от точки можно. Кстати, вы уже забыли конкретный же пример с компаниями и контактами. -------------------- |
||||
|
|||||
w1nd |
|
|||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: нет Всего: 54 |
Не понял, в чем я проявил невнимательность? Я всё время подразумеваю, что речь идет о геометрических фигурах. И что с компаниями и контактами? -------------------- ![]() ![]() |
|||
|
||||
Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 4 Всего: 172 |
См. стр. 1 - в данном случае наследовать квадрат от точки нельзя тк квадрат не есть точка. Какие пояснения еще нужны? -------------------- |
|||
|
||||
Exception |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 4525 Регистрация: 26.12.2004 Репутация: 2 Всего: 186 |
Модератор: Сообщение скрыто. |
|||
|
||||
w1nd |
|
|||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: нет Всего: 54 |
Я наконец понял, где по-вашему проявил невнимательность. Всякий раз, когда речь заходит о точке с квадратом или контакте с компанией вы, видимо, представляете себе даже не прототип в реальном мире, а какого-то сферического коня в вакууме. Тогда я поясню. Квадрат, нарисованный на бумаге или на экране для меня - геометрическая фигура. Контакт для меня - набор информации о способах связи с. Это сообщение отредактировал(а) w1nd - 21.5.2006, 18:50 -------------------- ![]() ![]() |
|||
|
||||
Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 4 Всего: 172 |
Вы собственно чего хотели сейчас сказать? (извините тупого программера, который только и делает, что представляет себе сферических коней, в отличие от Вас - О Великий, Который Знает Истину, за непонимание, однако я действительно Вас не понял).
Какая вам разница что я себе представляю - коня или сноповязалку? Докажите, что квадрат есть точка в геометрии, и я разрешу вам продолжать дискуссию. А то вы только и делаете, что уходите от ответов, либо переходя на личности, либо невнятными рассуждениями, как сейчас. Все. Ждем-с. -------------------- |
|||
|
||||
w1nd |
|
|||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: нет Всего: 54 |
Точка квадратом в геометрии не является. Вы, надеюсь, довольны. В той же геометрии точка на плоскости может быть проекцией квадрата. Но самое главное то, что всё это не имеет никакого отношения к примеру. Для решения некоторого набора задач такая модель наследования неприемлема, но есть задачи, когда она не просто уместна, но и наиболее предпочтительна. И классы не должны отражать тех свойств объектов, которые в конкретной системе не востребованы. Это сообщение отредактировал(а) w1nd - 21.5.2006, 22:27 -------------------- ![]() ![]() |
|||
|
||||
Domestic Cat |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 4 Всего: 172 |
Проекцией квадрата на плоскость может быть отрезок, ромб, прямоугольник. Так что, наследовать квадрат и от этих трех классов?
Возможно. Приведите пример. -------------------- |
||||
|
|||||
w1nd |
|
||||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: нет Всего: 54 |
Если не требуется больше ничего, что помешало бы - почему нет? Большая модель классов только запутывает.
Допустим, вам нужно представить, как будет выглядеть изображение на составном экране или еще на какой-нить поверхности. Точки (из которых будет состоять эта поверхность, ваш будущий холст) будут родителями для самых разнообразных классов - от текстуры до телевизора. Это сообщение отредактировал(а) w1nd - 22.5.2006, 01:12 -------------------- ![]() ![]() |
||||
|
|||||
NotGonnaGetUs |
|
||||||||||||||||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 25.2.2005 Где: Москва Репутация: 8 Всего: 12 |
Не хочу окна. Вами было высказано следующее: "Во-вторых, свойство навязывает структурный подход к взаимодействию с объектом: получить значение свойства, произвести некоторые вычисления, результат поместить обратно или передать другому объекту. Что происходит? Логика, свойственная объекту, вынесена из него. Например, часто повторяющийся во всех GUI-фреймворках приём с компонентом и контейнером: допустим, произошло событие, которое контейнеру необходимо передать своим компонентам. Контейнер получает свойства компонент, анализирует их (может ли компонент обработать данное событие) и передает событие на обработку. По объектной идеологии компонент просто должен получить событие. Дальше он либо его обработает (если может), либо вернет контейнеру или остальным компонентам; в этом случае нет необходимости в свойстве state компонента, а логика контейнера значительно более проста." Мною были приведёны в пример Awt и Swing, которые показывают, что свойства ничего подобного _не навязывают_ (В Awt используется событийная модель с chain of responsibility, в Swing основанная на подписке на сообщения (кстати, swing компоненты удовлетворяют спецификациям javabeans на 100%)). Если вы не согласны с этим утверждением - так и скажите. Сравнение AWT и Swing - это offtopic. -----
offtopic, т.к не имеет отношения к свойствам. Безусловно, вместо int лучше использовать enum (since 1.5). -----
(Это была шутка...) Могут и есть. Да, если спросить сантехника, он не будет знать, что такое принцип подстановки Барбары Лисков, но для людей от computer science, утверждающих о владении ООП, такое не знание непростительно.
Именно из этого определения и следует, что "геометрического центра" не будет у любого выпуклуго n-угольника не вписанного в окружность. Н-р, у ромба.
Не так важно, что есть в примере. Было высказано утверждение о том, что любой геометрический объект имеет центр. Было приведено определение, которое позволяет оперделить является ли точка "центром". Утверждение противоречит опредлению. Всё. Робм - это выпуклый 4-х угольник. Обратитесь к определению "выпуклый многоугольник" в учебнике геометрии. -----
Согласно вашему утверждению, любой класс с геттрами и сеттерами можно смело обзывать комплексными типом, что звучит как анекдот. В полностью ООП языке не может быть примитивных типов. Их существование не является украшением java. Н-р, в Eiffel, C# и многих других языках - примитивных типов нет (не путать примитивный тип с константами). -----
w1nd, я выдаю за ваши слова только то, что вы писали. Рекомендую вас саму перечитать ещё раз этот топик. Я не поленился, сделал это уже три раза, пытаясь найти что-нибудь здравое среди ваших утверждений. Вам кажется, что вы пишите одно, а вас понимаю неправильно (причём все)? Так может быть стоит умерить эмоции и попытаться излагать свои мысли чётко и ясно? Например, не использовать термины в значениях отличающихся от общепринятых (или хотя бы сопровождать их доходчивыми определениями, что бы никому не нужно было за вас додумывать). -----
Ок, давайте ещё раз, тоже самое. Пусть у нас есть два класса: А и B. Согласно LSP, "B" может быть наследником(подтипом) "А", только если _любая_ программа выраженная в терминах "А" останется _корректной_ после замены "А" на "B". Если это условие выполняется, то можно гарантировать, что существующий код не придётся переписывать при появлении нового наследника класса. Коротко и красиво, но тут есть подводные камни: что такое _любая_ и как определить _корректность_? Прежде чем ответить на эти вопросы, посмотрим на следующие классы:
У них абсолютно идентичные интерфейсы и различное поведение. Допустимо ли наследовать B от А? Правильный ответ: ХЗ (умножить на 3). Недостаточно знать интерфейс класса и даже его реализацию, чтобы ответить на этот вопрос. Нужно знать кое-что другое, а именно "контракты" классы (которые в общем случае не могут быть отражены в коде). Под контрактом понимается набор инвариантов класса и пред-/пост- условия методов. Если мы скажем: метод A#foo():int вычисляет произвольную функцию от х:int, то наследование уместно (все узнали strategy?), если мы решим, что этот метод должен возвращать значение линейной функции от x, то наследование невозможно. Вернёмся к LSP. _Любая_ программа будет работать _корректно_ тогда и только тогда, когда класс B реализует контракты класса А. "Свобода" B заключается в возможности добавить новую функциональность к классу А, ослабить пред- или ужесточить пост- условия его методов. В реальной жизни далеко не всегда контракты описываются явно (ввиде javaDoc's, examples, etc), но мы, как истиные джедаи сделаем вид, что такой код нами не пишется. Итак, у нас есть критерий позволяющий определить, допустимо наследование (с точки зрения сохранения функционирования существующего кода) или нет. Является ли этот критерий необходимым и достаточным для того, чтобы применить наследование? На самом деле нет. Это только необходимое условие. Всегда есть вероятность, что потребуется добавить в класс (А) новую функциональность, будет ли она иметь смысл для наследников? Если наследники не смогут её реализовать, то придётся изменить всю иерархию наследование и весь код, который с ней работал или создать параллельно новую иерархию, а это ОЧЕНЬ трудоёмкий процесс (Не забываем, что джедаи абсолютно не приемлют костыли в виде instanceOf и классов нарушающих контракты родителей). Другой важный момент. В какой момент принимается решение о наследовании? Самые распространённые варианты: на стадии проектирования (из анализа решаемой задачи) и на стадии реализации (когда мы видим, что можно использовать уже существующий класс, если его "чуть-чуть" изменить). Всё это приводит к тому, что джедаи не применяет LSP в лоб, а обязательно подумают будет ли этот принцип и дальше выполняться, если в класс родитель добавить парочку методов делающих что-нибудь полезное, но не востребованное в данный момент. Вернёмся к квадратам и точкам. Для решения какой задачи нам могут потребоватся классы Point и Square? Первое, что приходит в голову: "что-то связанное с геометрией". Затем в игру вступает мозжечёк (ещё до того, как изучен интерфейс этих классов): как же так? "квадрат" не является "точкой", он только содержит "точки"! "Не является" для джедая значит, что найдутся методы имеющие смысл для Point, но лишённые смысла для квадрата. Какие контраргументы приводите вы? 1) В квадрате (геометрическом объекте) _содержится_ некая точка, с которой можно связать класс, от которого наследуется квадрат (геометрический объект). 2) "Заморозив" классы Point и Square в текущем виде, можно добиться выполнения LSP (отказавшись тем самым от будущих модификаций). Ответы. 1) Это тоже самое, как наследовать человека от его левой руки, вместо того, чтобы использовать композицию. Получаем сильную связь между классами рука / человек + слабое зацепление между методами класса человек. Такие конструкции очень трудно поддерживать. Н-р: как быть в случае приведения типов (Point p = new Square(), p.draw())? Как быстро ответить на вопрос, кому принадлежит конкретный метод класса (square.rotate() - rotate точку вокруг центра координат или квадрат вокруг центра симметрии?)?. 2) Заморозка противоречит стремлению создавать простой для модификации и расширения код. Если отказаться от этой цели, то можно и не городить огород с ООП, а обойтись функциональной декомпозицией и любым процедурным языком. Что в этих рассуждениях вызывает вопросы? |
||||||||||||||||||||
|
|||||||||||||||||||||
Domestic Cat |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 4 Всего: 172 |
Можно допустить что такая ситуация возможна, но пример неочевиден и к геометрии имеет весьма отдаленное отношение.
См здесь -------------------- |
||||
|
|||||
w1nd |
|
|||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: нет Всего: 54 |
Не могут, не есть, не пить. Это подтверждает опыт, мой и моих многочисленных коллег. Как увидел слова "владение ООП", сразу вспомнил фразу из резюме: "профессионально овладел компьютером". Я ничем таким не овладевал, напраслина это. Мне достаточно понимания. Ладно, пока все разговоры о анекдотичности примеров или неприменимости определений не более чем буквоедство. Теперь поправка по существу вопроса: "наследовать человека от его левой руки, вместо того, чтобы использовать композицию" было бы неестественно наяву. Для конкретной модели классов человек может состоять и из одной левой руки и, может быть, колеса от телеги. Вообще из чего угодно. Скажите, ваши разъяснения применимы к ситуации, описанной здесь? Это сообщение отредактировал(а) w1nd - 22.5.2006, 23:08 -------------------- ![]() ![]() |
|||
|
||||
NotGonnaGetUs |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 25.2.2005 Где: Москва Репутация: 8 Всего: 12 |
Грустно и за вас, и за ваших коллег.
По существу был бы следующий вопрос: почему никто в здравом уме не использует наследование для моделирования отношения "has" между концептуальными классами. А ваш вопрос не по существу. Вы опять берётесь за свою любимую функциональную декомпозицию. Что такое "конкретная модель классов"? Никакая задача не навязывает "конкретную модель классов". Для решения _любой_ задачи можно использовать какие угодно классы, н-р, можно их вообще не использовать. Однако решения можно _сравнивать_ между собой. Если вы утверждаете, что для решения задачи Х нужно наследовать человека от его левой руки, я скажу, что это глупо и смешно, потому что можно привести решение, которое будет _лучше_. Лучше или хуже не абсолютные категории. Это отражение вполне конкретных проблем с которыми столкивалась индустрия программного обеспечания на различных этапах своего развития. Различные "принципы ООП" (теже шаблоны GRASP, как наиболее полное собрание этих принципов) это своего рода указатели: куда нужно идти, чтобы не попасть в не приятную историю. Вы сами нам продемонстрировали пример "плохого" проектного решения. Наследование квадрата от точки привело к необходимости создания новой иерархии классов для того, чтобы сделать возможным вычисление расстояния между этими объектами.
Ссылка "Здесь" не ведёт ни в какое конкретное место. |
||||||
|
|||||||
w1nd |
|
||||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: нет Всего: 54 |
Не печальтесь. Новые имена для старых вещей сути этих вещей не изменяют.
"Допустим, вам нужно представить, как будет выглядеть изображение на составном экране или еще на какой-нить поверхности. Точки (из которых будет состоять эта поверхность, ваш будущий холст) будут родителями для самых разнообразных классов - от текстуры до телевизора." Это сообщение отредактировал(а) w1nd - 23.5.2006, 20:52 -------------------- ![]() ![]() |
||||
|
|||||
Domestic Cat |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 4 Всего: 172 |
Напомню - речь с самого начала шла о геометрии, что было уточнено неоднократно. Точка в геометрии определяется так:
Поскольку в вашем примере "точка" будет иметь размер, вы уже выходите за рамки рассматриваемого нами примера. -------------------- |
||||
|
|||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 1 Всего: 260 |
w1nd, тогда любой класс должен включать в себя интерфейс с методом "представить в виде точки". Пересчет проекции в точку будет зависеть от фигуры - потому реализация всё равно будет разнесена по конкретным классам. Использования наследования классов не требуется.
Это сообщение отредактировал(а) skyboy - 24.5.2006, 00:24 |
|||
|
||||
NotGonnaGetUs |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 25.2.2005 Где: Москва Репутация: 8 Всего: 12 |
Только вы ни старых имён не знаете, ни в новых не разбираетесь, доказательством чему служат ваши посты.
Тоже самое на русском языке, плз. Или, лучше, сразу на java. А то у вас опять не разбери что и в каких значениях: экран/поверхность/точка/холст/текстуры. И заодно разрулите, почему составные части экрана называются точками. --- Кстати, я правильно понимаю, что вы продолжаете настаивать на том, что наследовать квадрат от точки и человека от руки это замечательные решения? ![]() Это сообщение отредактировал(а) NotGonnaGetUs - 24.5.2006, 11:55 |
||||
|
|||||
w1nd |
|
||||||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: нет Всего: 54 |
Незачем.
Это прозвучало в теме три раза. Точка может быть представлена любым объектом для отображения на поверхности, состоящей из этих объектов.
Именно так. -------------------- ![]() ![]() |
||||||
|
|||||||
NotGonnaGetUs |
|
||||||||||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 25.2.2005 Где: Москва Репутация: 8 Всего: 12 |
Трудно комментировать такое сильное утверждение ![]()
После ваших перлов с геометрическим центром выпуклуго многоугольника, я уже мало удивляюсь подобным вашим выскзываниям. Где задача-то? Единственное, что я могу из ваших бессвязных фраз предположить: Дано: набор точек заданных их координатами, плоскость разбитая на какие-то ячейки Надо: отметить ячейки, в которые попадают точки.
Не вижу в упор, кто должен наследоваться от точки и зачем. Не согласны? Сформулируете внятно свою задачу и покажите зачем вам для её решения нужно наследоваться от точки.
Ну вы бы снизошли тогда до меня и показали бы где я ошибаюсь пытаясь показать, что наследование в подобных ситуациях не уместно. Вами были выдвинуты тезисы: - наследование нужно использовать для моделирования отношения has - объект не должен никому давать доступ к своим данным - свойства и javabeans не-ООП - все GUI не-ООП Защитить свою позицию вы не смогли. Я пока не получил от вас ни одного вразумительного ответа, одни только рассуждения о моей не способности понимать, что вы пишите.
Мне, н-р, абсолютно не трудно представить к какому коду приводит ваша позиция. Вот тут это было проделано http://forum.vingrad.ru/index.php?showtopi...st&p=737660. Вы почему-то (хотя я ни на шаг не отступил от ваших слов) отказались обсуждать полученный результат, тем самым признав, что за свои слова вы не отвечаете. А если это так, то пытаться что-то представить самому из ваших слов просто бесполезное занятие. Так что Линус Торвальдс дважды прав. |
||||||||||||||
|
|||||||||||||||
w1nd |
|
||||||||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: нет Всего: 54 |
Это не мой перл, определение я нашел в сети. К сожалению, неверное. На самом деле не имеет значения, является ли координата квадрата его центром (я такого предположения не высказывал, просто поддержал по причине незнания определения геометрического центра). Надо ли мне перестать воспринимать ваши слова из-за опечаток/ошибок/противоречий в ваших сообщениях? Или вам нечего возразить, но очень хочется?
Аплодисменты. Пожалуй, вы всё же не умеете читать. Я сформулировал задачу предельно ясно четыре раза в этой теме. Еще раз. Задача - показать результат выполнения рисунка в мозаике. Воспроизвести рисунок с помощью камешков, стёклышек или кафельных плиток. Так как камешков, стёклышек или плиток под рукой может не оказаться, сделать программу, которая выведет на экран рисунок, выполненный в мозаике, элементами которой может быть любой отображаемый объект. Если вам снова непонятно, срочно нанимайте преподавателя русского языка и литературы.
Я привел пример. Если считать это сообщение, то уже пять раз. А на тезисах хотелось бы остановится подробнее. Разъяните, термин "отношение has", - для меня это что-то новое. Остальные тезисы, приведенные вами, к примеру не имеют отношения. Это ответы на вопросы или реплики оппонентов. С чего вы вообще взяли, что с их помощью я пытался защищать пример наследования?!
Вот и представляйте. На счет слов я уже высказался, а Линус Торвальдс может быть правым, левым, верхним или нижним - это его проблемы. -------------------- ![]() ![]() |
||||||||
|
|||||||||
Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 4 Всего: 172 |
w1nd временно забанен
simanyay - аналогично Причина - нецензурная лексика. -------------------- |
|||
|
||||
Exception |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 4525 Регистрация: 26.12.2004 Репутация: 2 Всего: 186 |
No comments. Чувствую, что мне нечего сказать. Человек так и не подкрепил свою идею реальным примером кода и позволяет себе указывать всем вокруг, что они неправы.
|
|||
|
||||
Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 4 Всего: 172 |
Модератор: Сообщение скрыто. -------------------- |
|||
|
||||
Exception |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 4525 Регистрация: 26.12.2004 Репутация: 2 Всего: 186 |
Модератор: Сообщение скрыто. |
|||
|
||||
NotGonnaGetUs |
|
||||||||||||||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 25.2.2005 Где: Москва Репутация: 8 Всего: 12 |
Уже разбанили? Можно продолжать?
Дело не в том, где вы нашли определение. Дело в том, что вы его не поняли и стали использовать в своих сообщениях, утверждая из-за этого не возможные вещи.
Если вы видите противоречая/ошибки в моих сообщениях, то напишите об этом. И я либо соглашусь, что был не прав, либо объясню, что вы не поняли в моих словах. Опечатки можно не комментировать.
Пожалуй не соглашусь. Предельно ясной формулировки озвучено не было.
Уже лучше, но я же просил код. Что от чего вы хотите отнаследовать? Продемонстрируйте, чтобы не было вопросов. Что мы имеем: Мозаика(Mosaic) состоит из кусочков (Сell) произвольного размера, цвета, формы. Задача стоит в том, чтобы отобразить картинку в мозаику и изобразить мозаику на экране. Алгоритм преобразования картинки - не известен. Первое что приходит на ум:
Конкретные кусочки можно представить так:
одно из отношений между объектами. is-a - человек это млекопитающее has - человек владеет сумкой
Все тезисы, влючая пропущенный про "комплексные типы", это утверждения прозвучавшие из ваших уст, с которыми я не согласен. Я приводил аргументы в защиту своей точки зрения и не получил ответа с вашей стороны. Я "не брал, что с их помощью вы пытаетесь защищать пример наследования". Наследование - это один из этих тезисов.
Угу, а я высказался на счёт вашего высказывания ![]() Это сообщение отредактировал(а) NotGonnaGetUs - 29.5.2006, 11:43 |
||||||||||||||||||
|
|||||||||||||||||||
![]() ![]() ![]() |
Правила ведения Религиозных войн | |
|
1. Уважайте собеседника 2. Собеседник != враг 3. Старайтесь воздерживаться от тем вида "Windows Rulez" или "Linux Rulez" С уважением, Smartov. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Религиозные войны | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |