Модераторы: LSD

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Наследование 
:(
    Опции темы
w1nd
Дата 9.5.2006, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Модератор: Вынесено из 5 основных отличий между Java и C++ 


Цитата
В таком случае напишите пожалуйста полностью ООПрограмму на С++ (Ну или "более" ООПрограмму)

Вместо примера кода классический пример из книжек: класс Point, класс Size обладают некоторыми полями и методами, класс Square их наследник и в то же время и Point, и Size. К сожалению, на Java этого номально не сделать. Так же нельзя сделать гуишный компонент для ввода строки наследником строки.  


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Domestic Cat
Дата 10.5.2006, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 4
Всего: 172



Оффтоп: 
Цитата(w1nd @  9.5.2006,  10:21 Найти цитируемый пост)
Вместо примера кода классический пример из книжек: класс Point, класс Size обладают некоторыми полями и методами, класс Square их наследник и в то же время и Point, и Size. К сожалению, на Java этого номально не сделать. Так же нельзя сделать гуишный компонент для ввода строки наследником строки.  

Какие-то странные примеры наследования. У автора книжки с ООП было явно туговато.  


--------------------

PM   Вверх
w1nd
Дата 10.5.2006, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата(Domestic Cat @ 10.5.2006,  14:56)
Оффтоп: 
Цитата(w1nd @  9.5.2006,  10:21 Найти цитируемый пост)
Вместо примера кода классический пример из книжек: класс Point, класс Size обладают некоторыми полями и методами, класс Square их наследник и в то же время и Point, и Size. К сожалению, на Java этого номально не сделать. Так же нельзя сделать гуишный компонент для ввода строки наследником строки.  

Какие-то странные примеры наследования. У автора книжки с ООП было явно туговато.

Первый пример есть во всех книжках по ООП. А в чем странность? 


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Domestic Cat
Дата 11.5.2006, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 4
Всего: 172



Цитата(w1nd @  10.5.2006,  13:29 Найти цитируемый пост)
Первый пример есть во всех книжках по ООП. А в чем странность?  

В том, что наследовать Square от Point и Size нельзя - квадрат не есть точка и никак не размер. Впервые такой пример встречаю просто. 


--------------------

PM   Вверх
w1nd
Дата 11.5.2006, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата
В том, что наследовать Square от Point и Size нельзя - квадрат не есть точка и никак не размер. Впервые такой пример встречаю просто. 

На мой взгляд, вы заблуждаетесь, гражданин начальник. Видимо, просто привыкли к объектной модели Bordand VCL, MFC, JavaBeans и им подобным - а они довольно далеки от ООП. Можно было бы это обсудить где-нить отдельно. 


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Domestic Cat
Дата 11.5.2006, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 4
Всего: 172



Цитата(w1nd @  11.5.2006,  07:59 Найти цитируемый пост)
На мой взгляд, вы заблуждаетесь, гражданин начальник. Видимо, просто привыкли к объектной модели Bordand VCL, MFC, JavaBeans и им подобным - а они довольно далеки от ООП. Можно было бы это обсудить где-нить отдельно.  

Наследование - это отношение is-a, вот и все.

Цитата

Inheritance is also called generalization, because the is-a relationships capture a hierarchical relationship between classes of objects. For instance, a "fruit" is a generalization of "apple", "orange", "mango" and many others. We say that fruit is an abstraction of apple, orange, etc. Conversely, we can say that since apples are fruit (i.e. an apple is-a fruit), that they inherit all the properties common to all fruit, such as being a fleshy container for the seed of a plant.

http://en.wikipedia.org/wiki/Inheritance_%...uter_science%29

Наследовать квадрат от неправильно, тк квадрат не есть точка, тем более не "размер".   


--------------------

PM   Вверх
w1nd
Дата 11.5.2006, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата
Наследование - это отношение is-a

Именно так. Но вы (как и многие) допускаете распространенную ошибку - отождествляете эти классы с объектами реального мира. Для квадрата свойственны все поля и методы координаты и размера - именно это (все поля и методы) определяет наличие отношения is-a для классов.    

Это сообщение отредактировал(а) w1nd - 11.5.2006, 19:09


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Domestic Cat
Дата 11.5.2006, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 4
Всего: 172



Цитата(w1nd @  11.5.2006,  10:02 Найти цитируемый пост)
Для квадрата свойственны все поля и методы координаты и размера - именно это (все поля и методы) определяет наличие отношения is-a для классов.    


Простой пример:
Код

class Point { ... }

class Square : Point { ... }

....

void DrawPoint(Point point) {....}
void CreatePolygon(Point[] points) {}

Square square = new Square();
DrawPoint(square); // что будет изображено?
CreatePolygon(new Point[] {square}); // как будет создан полигон?



Цитата(w1nd @  11.5.2006,  10:02 Найти цитируемый пост)
Но вы (как и многие) допускаете распространенную ошибку - отождествляете эти классы с объектами реального мира. 

ООП и постоено на объектах реального мира, просто в каждой ситуации програмист рассматривает лишь отдельные стороны объектов, важные в данной ситуации. С точки зрения геометрии квадрат не есть точка. Да, он унаследует два поля точки, но за выигрыш двух строк кода придется платить - например, можно будет откастить объект квадрата к объекту точки или размера, что будет приводить к появлению багов, непонятному коду. К примеру, у точки есть метод Paint, который мы перегружаем в Square. Тогда метод DrawPoint(Point point) приведет к изображению не точки, а квадрата при вызове DrawPoint(square). 
Согласно такой логике мне нужно наследовать класс Company от класса Contact, поскольку последний содержит все поля (адрес, имя, телефон, емейл, итп). К чему такой наследование приведет нетрудно догадаться. 
 


--------------------

PM   Вверх
w1nd
Дата 11.5.2006, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата(Domestic Cat @ 11.5.2006,  20:04)
ООП и постоено на объектах реального мира, просто в каждой ситуации програмист рассматривает лишь отдельные стороны объектов, важные в данной ситуации. С точки зрения геометрии квадрат не есть точка. Да, он унаследует два поля точки, но за выигрыш двух строк кода придется платить - например, можно будет откастить объект квадрата к объекту точки или размера, что будет приводить к появлению багов, непонятному коду. К примеру, у точки есть метод Paint, который мы перегружаем в Square. Тогда метод DrawPoint(Point point) приведет к изображению не точки, а квадрата при вызове DrawPoint(square). 
Согласно такой логике мне нужно наследовать класс Company от класса Contact, поскольку последний содержит все поля (адрес, имя, телефон, емейл, итп). К чему такой наследование приведет нетрудно догадаться.

ООП построено не на объектах реального мира, а на принципе инкапсуляции и полиморфизма smile.

Само существование методов вроде DrawPoint или CreatePolygon полностью противоречит принципам ООП. Только сам объект может себя рисовать или создавать. И если бы класс Контакт не обладает атрибутом Пол или Возраст, он подойдет для Компании; в ином случае нужно просто выделить общие для них поля и методы в отдельный(е) класс(ы) и назвать соответствующе.   

Это сообщение отредактировал(а) w1nd - 11.5.2006, 20:28


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Domestic Cat
Дата 11.5.2006, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 4
Всего: 172



Цитата(w1nd @  11.5.2006,  11:27 Найти цитируемый пост)

Само существование методов вроде DrawPoint или CreatePolygon полностью противоречит принципам ООП. 


Замените DrawPoint на метод Point.Paint, и проблема останется. CreatePolygon вполне может относиться к классу, занимающемуся проецированием полигонов из 3D на экран, тогда полигон сам себя прорисовать не сможет, так как ему будет необходимо знать ряд других параметров, возможно, выполнить к-л оптимизации при прорисовке, итп.

Цитата(w1nd @  11.5.2006,  11:27 Найти цитируемый пост)
И если бы класс Контакт не обладает атрибутом Пол или Возраст, он подойдет для Компании

Предположим, что пол и возраст не важен и мы унаследовали Company от Contact. Бизнес-логика приложения очень сложная, где-то я по ошибке передал Company в метод, ожидающий Contact. На дебаге я потрачу раз в 30 больше времени, чем если бы я потратил 2 минуты на создание общего класса Entity. 


--------------------

PM   Вверх
w1nd
Дата 11.5.2006, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата
Замените DrawPoint на метод Point.Paint, и проблема останется.

Какая проблема? Проблема здесь только в том, что пользователь класса Point хочет знать, каким образом этот класс себя нарисует, а знать ему (пользователю) этого не положено.
Цитата
CreatePolygon вполне может относиться к классу, занимающемуся проецированием полигонов из 3D на экран, тогда полигон сам себя прорисовать не сможет, так как ему будет необходимо знать ряд других параметров, возможно, выполнить к-л оптимизации при прорисовке, итп.

И снова я вижу грубое нарушение принципа инкапсуляции. Если полигон не может, следует либо расширять функционал полигона, либо расширять функционал канвы (преобразования, оптимизации и прочее).

Цитата
Предположим, что пол и возраст не важен и мы унаследовали Company от Contact. Бизнес-логика приложения очень сложная, где-то я по ошибке передал Company в метод, ожидающий Contact. На дебаге я потрачу раз в 30 больше времени, чем если бы я потратил 2 минуты на создание общего класса Entity.

Какая-такая ошибка может возникнуть, если метод, рассчитывающий на контакт его и получил? 


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Domestic Cat
Дата 11.5.2006, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 4
Всего: 172



Цитата(w1nd @  11.5.2006,  12:07 Найти цитируемый пост)

И снова я вижу грубое нарушение принципа инкапсуляции. Если полигон не может, следует либо расширять функционал полигона, либо расширять функционал канвы (преобразования, оптимизации и прочее).

Какое ж тут нарушение инкапсуляции? Инкапсуляция - это information hiding, если мне достаточно для отрисовки знать координаты вершин многоугольника, то я могу их получить из пропертей (геттеров) и инкапсуляции не нарушу. В контексте задачи может не иметь смысла перегружать подобные классы функционалом, писать Квадраты, которые себя рисуют, трансформируют, сериализуют да еще и в базу сами пишутся. 
 
Цитата(w1nd @  11.5.2006,  12:07 Найти цитируемый пост)
Какая-такая ошибка может возникнуть, если метод, рассчитывающий на контакт его и получил?  

Да какая угодно. Например, создается репорт, содержащий к-л статистику по посещениям сайта (скажем, Контакт/Компания содержат поля MonthlyHits и IP). В данный метод передается массив Контактов, в который по ошибке попала одна Компания. У всех этих объектов вызывается проперти MonthlyHits, IP. Такой баг и заметить сложно. 


--------------------

PM   Вверх
w1nd
Дата 11.5.2006, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата
Какое ж тут нарушение инкапсуляции? Инкапсуляция - это information hiding, если мне достаточно для отрисовки знать координаты вершин многоугольника, то я могу их получить из пропертей (геттеров) и инкапсуляции не нарушу.

Мы про ООП или про что? Инкапсуляция подразумевает не сокрытие информации (это как самоцель не имеет смысла), а сокрытие способа хранения, реализации, взаимодействия. Это необходимо для того, чтобы не переписывать клиентский код при внесении изменений в реализацию класса. Геттеры/сеттеры - это как раз нарушение инкапсуляции (замаскированный прием структурного программирования). Вообще (как я и говорил, вы, похоже, зацикливаетесь на существующих framework'ах, которые примером ООП не являются), само по себе понятие properties объекта очень сомнительно с точки зрения ООП.

Цитата
Да какая угодно. Например, создается репорт, содержащий к-л статистику по посещениям сайта (скажем, Контакт/Компания содержат поля MonthlyHits и IP). В данный метод передается массив Контактов, в который по ошибке попала одна Компания. У всех этих объектов вызывается проперти MonthlyHits, IP. Такой баг и заметить сложно.

Какой-то неподходящий пример. Здесь иллюстрируется только ошибочность решения наследовать компанию из контакта, т. к. в нем есть малоподходящие компании атрибуты (MonthlyHits, IP). Но пусть это неотъемлемые атрибуты любой компании, при чем здесь наследование? Подобную ошибку с таким же успехом можно допустить где угодно: можно создать метод, принимающий в качестве параметров массив объектов и напихать туда чего попадет. 


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
powerOn
Дата 11.5.2006, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: нет
Всего: 159



Цитата

Мы про ООП или про что? Инкапсуляция подразумевает не сокрытие информации (это как самоцель не имеет смысла), а сокрытие способа хранения, реализации, взаимодействия. Это необходимо для того, чтобы не переписывать клиентский код при внесении изменений в реализацию класса.


Чует мое сердце, что для этого нужно наследование, а не инкапсуляция...  


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
LSD
Дата 11.5.2006, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 9
Всего: 538



Цитата(w1nd @  11.5.2006,  22:40 Найти цитируемый пост)
Вообще (как я и говорил, вы, похоже, зацикливаетесь на существующих framework'ах, которые примером ООП не являются), само по себе понятие properties объекта очень сомнительно с точки зрения ООП.

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.
PM MAIL WWW   Вверх
Domestic Cat
Дата 11.5.2006, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 4
Всего: 172



Цитата(w1nd @  11.5.2006,  12:40 Найти цитируемый пост)
Какой-то неподходящий пример. Здесь иллюстрируется только ошибочность решения наследовать компанию из контакта, т. к. в нем есть малоподходящие компании атрибуты (MonthlyHits, IP). Но пусть это неотъемлемые атрибуты любой компании, при чем здесь наследование? Подобную ошибку с таким же успехом можно допустить где угодно: можно создать метод, принимающий в качестве параметров массив объектов и напихать туда чего попадет.  

Я немного неясно написал, предполагается что проперти MonthlyHits, IP могут быть как у компаний, так и клиентов. Тем не менее, пример это подходящий - ошибок можно было бы избежать, если бы Contact и Company наследовали бы от Entity. Тогда в массив Contac[] объект Company никак бы попасть не смог.

Цитата(w1nd @  11.5.2006,  12:40 Найти цитируемый пост)
Мы про ООП или про что? Инкапсуляция подразумевает не сокрытие информации (это как самоцель не имеет смысла), а сокрытие способа хранения, реализации, взаимодействия. Это необходимо для того, чтобы не переписывать клиентский код при внесении изменений в реализацию класса. Геттеры/сеттеры - это как раз нарушение инкапсуляции (замаскированный прием структурного программирования). 

По-прежнему не вижу нарушения инкапсуляции. Объект часть своих свойств может скрывать, часть - предоставлять через методы/проперти. Если например класс Point не будет иметь методов getX, getY, то использовать его будет неудобно - для всех возможных применений класса придется создавать свой метод, меняя класс. Реюзать такой класс будет еще труднее, поскольку невозможно предусмотреть все возможные варианты использования Point. 

Цитата(w1nd @  11.5.2006,  12:40 Найти цитируемый пост)
Вообще (как я и говорил, вы, похоже, зацикливаетесь на существующих framework'ах, которые примером ООП не являются),

Существующие фрейворки, хоть и не на 100%, но по крайней мере процентов на 90 меня устраивают. Наследование Company от Contact или Square от Size - не устраивает на 100%, я легко могу представить как сложно поддерживать такой код. 
 


--------------------

PM   Вверх
powerOn
Дата 11.5.2006, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: нет
Всего: 159



Цитата

Геттеры/сеттеры - это как раз нарушение инкапсуляции 

Имхо, это скорее способ стандартизации работы с полями (свойствами) классов. 
 


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
w1nd
Дата 11.5.2006, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата
Что же тогда по твоему хороший пример?

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


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Domestic Cat
Дата 11.5.2006, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 4
Всего: 172



Цитата(w1nd @  11.5.2006,  13:06 Найти цитируемый пост)
Так ведь не знаю! Вот и хочу узнать, в каком случае решение о наследовании одного класса из другого (при условии, что все поля и методы родителя свойственны дитю) может быть ошибочным?

Заключение о том, что поля/методы класса А свойственны и классу Б должно следовать из логических соображений, из архитектуры, а не из сравнения (все поля класса Size есть и у Square и у Car, следовательно унаследуем Square и Car от Size). Что будет, позже, когда код написан, придется изменить класс SIze и дописать метод Resize()? Не получится ли, что размеры Car можно менять как угодно? Базовый класс должен быть абстракцией более высокого уровня, чем сабкласс (Entity - абстракция от Company и Contact).  


--------------------

PM   Вверх
w1nd
Дата 11.5.2006, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата
Тем не менее, пример это подходящий - ошибок можно было бы избежать, если бы Contact и Company наследовали бы от Entity. Тогда в массив Contac[] объект Company никак бы попасть не смог.

Нет, не понимаю. Ну и что же? Теперь и Contact, и Company могут попасть в массив Entity, а Entity - это, допустим, еще и Vehicle. И что? 
А то, что вы пытаетесь привязать классы к наблюдаемым объектам, а этого делать как раз не нужно. ООП - это не концепция понимания мира сквозь призму модели классов, а способ создания программ, в которых возможны локальные изменения на любом уровне. 
Или вы пытаетесь создать заведомо ошибочный код (метод, которому на вход передаются контакты почему-то интерпретирует их как персон).

Цитата
Существующие фрейворки, хоть и не на 100%, но по крайней мере процентов на 90 меня устраивают. Наследование Company от Contact или Square от Size - не устраивает на 100%, я легко могу представить как сложно поддерживать такой код.

А я вот не могу представить трудностей, которые представляете вы. Поделитесь?   

Это сообщение отредактировал(а) w1nd - 11.5.2006, 22:18


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Domestic Cat
Дата 11.5.2006, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 4
Всего: 172



Цитата(w1nd @  11.5.2006,  13:15 Найти цитируемый пост)
Нет, не понимаю. Ну и что же? Теперь и Contact, и Company могут попасть в массив Entity, а Entity - это, допустим, еще и Vehicle. И что? 

Тот, кто пишет метод Process(Entity entity), знает, что в данный метод можно передать любую Entity. Если будет нужно создать метод, специфичный для контактов (Process(Contact contact)), то передать туда Company будет нельзя.
 
Цитата(w1nd @  11.5.2006,  13:15 Найти цитируемый пост)
А я вот не могу представить трудностей, которые представляете вы. Поделитесь?   

1. Непонятный код. К примеру, можно будет спокойно писать 
Код

Company company = new Company();
//..........
Contact contact = company; // Что тут имелось в виду?

2. Плохой код. К примеру, добавление нового метода или поля в контакт (например, пол) через полгода после старта проекта приведет к появлению компаний женского и мужского полу.
3. Больше багов
Код


Contact contact = new Company(); // забыли исправить копипаст
 


--------------------

PM   Вверх
LSD
Дата 11.5.2006, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 9
Всего: 538



Цитата(LSD @ 11.5.2006,  22:54)
Цитата(w1nd @  11.5.2006,  22:40 Найти цитируемый пост)
Вообще (как я и говорил, вы, похоже, зацикливаетесь на существующих framework'ах, которые примером ООП не являются), само по себе понятие properties объекта очень сомнительно с точки зрения ООП.

1. Что же тогда по твоему хороший пример?

Цитата(w1nd @  11.5.2006,  23:06 Найти цитируемый пост)
Так ведь не знаю! Вот и хочу узнать, в каком случае решение о наследовании одного класса из другого (при условии, что все поля и методы родителя свойственны дитю) может быть ошибочным?

Ты не знаешь примеров хорошего ООП, но при этом твердо убежден, что все что есть сейчас плохо?

Добавлено @ 22:44 
Цитата(Domestic Cat @  11.5.2006,  23:34 Найти цитируемый пост)
К примеру, добавление нового метода или поля в контакт (например, пол) через полгода после старта проекта приведет к появлению компаний женского и мужского полу.

Гут! smile  


--------------------
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.
PM MAIL WWW   Вверх
w1nd
Дата 11.5.2006, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата
Тот, кто пишет метод Process(Entity entity), знает, что в данный метод можно передать любую Entity. Если будет нужно создать метод, специфичный для контактов (Process(Contact contact)), то передать туда Company будет нельзя.

Если программер делает метод, рассчитанный только на обработку контактов (зная, что контакты - это еще и компания) - он всего лишь совершает ошибку. Если вместо того, чтобы создать класс Person, человек добавляет пол контактам и компаниям - это тоже всего лишь ошибка. Если нужен объект класса компания, а программер создает переменную контакт - это попросту странно (компания и так есть контакт). А если этот самый программер вообще сядет спиной к монитору, он вообще ничего написать не сможет. 

Один мой товарищ, например, считает, что возможность переопределения операций в C++ - зло, которого следует избегать любой ценой. В чем здесь прикол? У него просто нет нормальной IDE, а C++ он знает недостаточно хорошо, чтобы отследить все зависимости без IDE. А другой мой товарищ вообще не знаком с программированием и нифига не понимает во всех этих кракозяблах. Так что, программировать нужно так, чтобы все одобряли и понимали? Не смешно ли?

Добавлено @ 23:05 
Цитата
Ты не знаешь примеров хорошего ООП, но при этом твердо убежден, что все что есть сейчас плохо?

Аз есмь живой, ходячий пример хорошего ООП smile И речь идет не о том, насколько все плохо (и уж тем более не о примере хорошего ООП - я достаточно внятно изъясняюсь по-русски, прочитайте пост внимательнее), а чем может быть плохо наследование квадрата из координаты и размера. Пока я узнал только: кто-то может наделать ошибок. Но кто угодно может наделать любое количество самых разнообразных ошибок - это еще ничего не говорит о качестве объектной модели.   

Это сообщение отредактировал(а) w1nd - 11.5.2006, 23:06


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
LSD
Дата 11.5.2006, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 9
Всего: 538



Цитата(w1nd @  12.5.2006,  00:00 Найти цитируемый пост)
я достаточно внятно изъясняюсь по-русски, прочитайте пост внимательнее

Кто тебе это сказал smile  smile  smile 

Цитата(w1nd @  12.5.2006,  00:00 Найти цитируемый пост)
И речь идет не о том, насколько все плохо (и уж тем более не о примере хорошего ООП - я достаточно внятно изъясняюсь по-русски, прочитайте пост внимательнее), а чем может быть плохо наследование квадрата из координаты и размера.

Ты абсолютно невнимательно читаешь собеседников. Я спрашивал, раз уж по твоим словам в существующих фреймворках, ООП плохо реализовано, то вообще есть пример реализации хорошего ООП. Про квадраты я ничего не спрашилал, это ты себе придумал. Если у тебя нет таких примеров, то тут квадраты?

Цитата(w1nd @  12.5.2006,  00:00 Найти цитируемый пост)
Но кто угодно может наделать любое количество самых разнообразных ошибок - это еще ничего не говорит о качестве объектной модели.

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


--------------------
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.
PM MAIL WWW   Вверх
w1nd
Дата 11.5.2006, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата
Кто тебе это сказал

Я это точно знаю. Язык - не живопись и не скульптура, чтобы каждый понимал так, как хотел.
Цитата
Ты абсолютно невнимательно читаешь собеседников. Я спрашивал, раз уж по твоим словам в существующих фреймворках, ООП плохо реализовано, то вообще есть пример реализации хорошего ООП. Про квадраты я ничего не спрашилал, это ты себе придумал.

Обмишурился чуток. Беседовали о квадратах и разнополых компаниях.
Хорошим примером ООП наверняка может быть отдельно взятый фрагмент в любом из существующих якобы-ООП-фреймворков (кроме майкрософтовских, пожалуй). Но в целом - нет. Самое жуткое - это, конечно, properties.
Цитата
Смотря какая цель разработки данной модели, если упростить разработку

Целью разработки каких-либо моделей или фреймворков никогда не становится упрощение, только ускорение.      

Это сообщение отредактировал(а) w1nd - 12.5.2006, 00:14


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
jimur
Дата 12.5.2006, 01:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 21.4.2006

Репутация: нет
Всего: 3



Цитата(w1nd @  11.5.2006,  23:48 Найти цитируемый пост)
Целью разработки каких-либо моделей или фреймворков никогда не становится упрощение, только ускорение. 

Да ладно smile
Spring Framework значительно упрощает разработку
 
PM MAIL   Вверх
Domestic Cat
Дата 12.5.2006, 07:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 4
Всего: 172



Цитата(w1nd @  11.5.2006,  14:00 Найти цитируемый пост)
Так что, программировать нужно так, чтобы все одобряли и понимали? Не смешно ли?

Конечно. В команде когда-нибудь работал? Занимался переписыванием кода после индусов? 
Цитата(w1nd @  11.5.2006,  14:00 Найти цитируемый пост)
Если программер делает метод, рассчитанный только на обработку контактов (зная, что контакты - это еще и компания) - он всего лишь совершает ошибку. Если вместо того, чтобы создать класс Person, человек добавляет пол контактам и компаниям - это тоже всего лишь ошибка. Если нужен объект класса компания, а программер создает переменную контакт - это попросту странно (компания и так есть контакт). А если этот самый программер вообще сядет спиной к монитору, он вообще ничего написать не сможет. 


Цитата(LSD @  11.5.2006,  14:28 Найти цитируемый пост)

Смотря какая цель разработки данной модели, если упростить разработку (один из способов минимизировать количество ошибок).

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

class Square
{
    Point a1;
    Point a2;
    Point a3;
    Point a4;
    // ...
}

class Square
{
    Point a1;
    Size size;
    // ...
}



Цитата(w1nd @  11.5.2006,  14:48 Найти цитируемый пост)
Целью разработки каких-либо моделей или фреймворков никогда не становится упрощение, только ускорение.    

Упрощение - тоже ускорение, оно ускоряет дебаг и поддержку кода.
 


--------------------

PM   Вверх
w1nd
Дата 12.5.2006, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата
В команде когда-нибудь работал? Занимался переписыванием кода после индусов?

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

Я не против агрегации классов для использования их свойств, но бездумная эксплуатация такого подхода по поводу и без повода порождает пресловутые properties и, в конечном итоге, сводит на нет те преимущества, которые может дать нам ООП. Как правило, подобные артефакты рождаются из-за стремления переделать старую не-ООП программу на новый лад, что невозможно без фундаментальнго перепроектирования, или из-за непонимания ООП.

Изначально вопрос состоял в том, может ли ООП обойтись без множественного наследования. Я утверждал, что не может и пока не никто не смог предъявить сколько-нибудь весомых аргументов против (кроме утверждений о том, что кто-то потеряет голову, глядя на классы с N-надцатью родителями). 

 


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
powerOn
Дата 12.5.2006, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: нет
Всего: 159



Цитата(Domestic Cat @  12.5.2006,  08:38 Найти цитируемый пост)
Занимался переписыванием кода после индусов? 

Я очень сильно извиняюсь за offtop, просто уже не в первый раз,  от совершенно разных людей (программистов естественно), слышу о необыкновенных талантах индийских кодеров. Если Вас не затруднит, поделитесь кусочком кода (малееееньким), ну пожалуйста. 
Я очень хочу на это взглянуть..  smile   


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
Void
Дата 12.5.2006, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 11
Всего: 173



[OFF] MoonCatDaily WTF: там этого добра навалом smile 


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
LSD
Дата 12.5.2006, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 9
Всего: 538



Цитата(w1nd @  12.5.2006,  22:55 Найти цитируемый пост)
Изначально вопрос состоял в том, может ли ООП обойтись без множественного наследования. Я утверждал, что не может и пока не никто не смог предъявить сколько-нибудь весомых аргументов против (кроме утверждений о том, что кто-то потеряет голову, глядя на классы с N-надцатью родителями).

Раз уж мы заговорили о доказательствах, то наличие множественного наследования в С++, еще не означает что это единственно верный путь. У него есть свои недостатки.
А пример, ООП без множественного наследования это таже 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.
PM MAIL WWW   Вверх
Void
Дата 12.5.2006, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λ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
PM MAIL WWW GTalk   Вверх
w1nd
Дата 13.5.2006, 04:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата
И пока я так и не понял, почему квадрат, в хорошо споектированной программе обязательно должна наследоваться от точки и размера.

Не обязательно долженDomestic Cat нашел данный пример странным; я утверждаю, что странного (или плохого) в этом ничего нет. И еще я считаю подход со свойствами неуместным в ООП.

Что касается Java или C#, то они появились попозже ООП, да и ООП, в принципе, оторвано от какого-либо конкретного языка (хотя C++ создавался в т. ч. и как инструмент для ООП). Я говорю о том, что без МН в ООП не обойтись. Может быть, утрирую, но все равно обойтись бывает очень трудно (не вообще обойтись трудно, а чтобы не скатиться в структурное программирование).

    

Это сообщение отредактировал(а) w1nd - 13.5.2006, 04:48


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Domestic Cat
Дата 13.5.2006, 08:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 4
Всего: 172



Цитата(w1nd @  12.5.2006,  19:39 Найти цитируемый пост)
Не обязательно должен. Domestic Cat нашел данный пример странным; я утверждаю, что странного (или плохого) в этом ничего нет.


Ну а я утверждаю что это неправильный пример наследования, неважно, множественного или не множественного. По определению наследования.

Цитата(w1nd @  12.5.2006,  19:39 Найти цитируемый пост)
Я говорю о том, что без МН в ООП не обойтись. 


Обойтись можно, как показывает опыт. 


--------------------

PM   Вверх
LSD
Дата 13.5.2006, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 9
Всего: 538



Цитата(w1nd @  13.5.2006,  05:39 Найти цитируемый пост)
Я говорю о том, что без МН в ООП не обойтись. Может быть, утрирую, но все равно обойтись бывает очень трудно (не вообще обойтись трудно, а чтобы не скатиться в структурное программирование).

Ну так приведи пример, когда обойтись трудно.

Да и по поводу 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.
PM MAIL WWW   Вверх
Domestic Cat
Дата 13.5.2006, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 4
Всего: 172



Цитата(MoonCat @  12.5.2006,  14:24 Найти цитируемый пост)
Если Вас не затруднит, поделитесь кусочком кода (малееееньким), ну пожалуйста. 

Код

public static bool IsBoolean(object value)
{
      try
      {
            if (((Boolean)value == true) ||((Boolean)value == false))
            {
                  return true;
            }
            else
            {
                  return false;
            }
      }
      catch
      {
            return false;
      }
}
 


--------------------

PM   Вверх
ALKS
Дата 13.5.2006, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 354
Регистрация: 22.3.2006

Репутация: 2
Всего: 11



Чего я не понял, это почему Domestic Cat привязался вначале к квадрату из кординаты и размера? откуда вы знаете где и как такая структура классов будет использоваться? Это вполне может быть крайне удобным и логичным в рамках задачи для которой это проектировалось. Вполне понятно, что одни и те же "объекты реального мира" можно описать различными способами и с чего вы взяли что какой-то способ лучше а какой-то хуже? все зависит от того где и как вы будете результаты своего проектирования применять. 
PM   Вверх
Domestic Cat
Дата 13.5.2006, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 4
Всего: 172



Цитата(ALKS @  13.5.2006,  04:38 Найти цитируемый пост)
Чего я не понял, это почему Domestic Cat привязался вначале к квадрату из кординаты и размера? откуда вы знаете где и как такая структура классов будет использоваться? Это вполне может быть крайне удобным и логичным в рамках задачи для которой это проектировалось. Вполне понятно, что одни и те же "объекты реального мира" можно описать различными способами и с чего вы взяли что какой-то способ лучше а какой-то хуже? все зависит от того где и как вы будете результаты своего проектирования применять.  


Согласен, возможно в рамках к-л конкретной задачи такое наследование действительно будет "правильным". Но ведь утверждалось, что это стандарнтый пример, очевидно геометрический. Вот и непонятно, как квадрат может быть точкой.  


--------------------

PM   Вверх
w1nd
Дата 13.5.2006, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата
Ну а я утверждаю что это неправильный пример наследования, неважно, множественного или не множественного. По определению наследования.

Как раз не по определению. Вы просто пытаетесь сравнить геометрические точку и квадрат и находите существенное различие (хотя и то и другое - объект на плоскости). А в случае с классами отношение is-a никогда не определяет точно такое же отношение между объектами реального мира. Поля и методы точки свойственны (или применимы, если хотите) квадрату, значит он - точка. Потому что в определении класса ничего другого, кроме полей и методов не написать.
Цитата
Обойтись можно, как показывает опыт.

Конечно можно! Как правило, путем отказа от парадигм ООП.
Цитата
Объясни например почему класс JFrame не должен предоставлять возможность управления своими размерами в виде setSize() и getSize(), где тут нарушение ООП парадигмы.

Вы сами отвечаете на свой вопрос. Класс не должен предоставлять возможности управлять своими атрибутами. Разницы между методами getSize/setSize и публичным полем size нет. Создание таких свойств - это структурное программирование, а не объектное. Не должно быть у класса никаких доступных полей данных, пусть даже getSize двадцать раз конвертирует результат. Мы можем послать объекту сообщение (вызвать метод): "сделай что-то", но никогда не можем запросить у объекта данные.  


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
ALKS
Дата 13.5.2006, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 354
Регистрация: 22.3.2006

Репутация: 2
Всего: 11



Цитата(w1nd @ 13.5.2006,  17:19)
Вы сами отвечаете на свой вопрос. Класс не должен предоставлять возможности управлять своими атрибутами. Разницы между методами getSize/setSize и публичным полем size нет. Создание таких свойств - это структурное программирование, а не объектное. Не должно быть у класса никаких доступных полей данных, пусть даже getSize двадцать раз конвертирует результат. Мы можем послать объекту сообщение (вызвать метод): "сделай что-то", но никогда не можем запросить у объекта данные.

А сие кстати, верно...  В Java нет структур, вот почему мы вынуждены пользоваться нарушением идий теоритического ОО проектирования под названием JavaBean. smile  если вам нужно хранилище данных, то вам не нужен класс. класс он должен что-то "делать" а не просто предоставлять и получать данные в различной форме.  smile Вот тепярь я понял в чем прелесть структур в С++... это не классы, это полностью публичные хранилища данных (причем методы у них тоже есть так что работу по преобразованию данных можно тут же и запрограммировать) и то что это не классы подчеркиваеться на уровне синтаксиса языка. хмм... 
PM   Вверх
Domestic Cat
Дата 13.5.2006, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 4
Всего: 172



Цитата(w1nd @  13.5.2006,  08:19 Найти цитируемый пост)
А в случае с классами отношение is-a никогда не определяет точно такое же отношение между объектами реального мира. Поля и методы точки свойственны (или применимы, если хотите) квадрату, значит он - точка. Потому что в определении класса ничего другого, кроме полей и методов не написать.


Программирование - это все-таки описание реального мира, а не наоборот. Потому утверждение "у классов А и Б одинаковые поля, плюс у класса Б есть все методы класса А" не означает, что Б должен наследовать от А. is-a  соотношение определяется из логики реальной задачи, из того, что это значит в данном контексте. Вы забываете, что наследование также называется generalization - обобщение, базовый класс - это абстракция более высокого уровня, которым можно в некоторых случаях заменить любой из сабклассов (Vehicle <- Car, вместо "машина" можно использовать "средство передвижения" в случае например подсчета всех средств передвижения компании). Если рассмотреть геометрию, то квадрат не есть точка, в геометрии нельзя квадрат заменить точкой. Если угодно реюзать код - например координаты, выстроите правильную иерархию наследования. Например можно ввести понятие GeometricObject. Понятно, что любое геом тело будет включать в себя хотя бы одну точку (квадрат - одна из вершин, круг - центр, линия - одна из двух точек, определяющих линию, итп) и дайте этому классу два поля - x и y. Вот теперь наследуйте от него Point, Rectangle и все остальное, и теперь данная иерархия будет правильной, так как точка есть геометрический объект и квадрат также есть геом объект. 

Цитата(w1nd @  13.5.2006,  08:19 Найти цитируемый пост)
Не должно быть у класса никаких доступных полей данных, пусть даже getSize двадцать раз конвертирует результат. Мы можем послать объекту сообщение (вызвать метод): "сделай что-то", но никогда не можем запросить у объекта данные.   


1. Предположим, мне нужно узнать размер квадрата, чтобы где-нибудь в статус баре написать "квадрат стороной 10 мм". Как вы это реализуете?
2. Где написано, что у объекта нельзя запрашивать данные? Инкапсуляция означает не то, что объект должен скрывать всё на свете, а то, что он должен скрывать имплементацию. Проперти как раз идеально ложится в данное определение - не важно откуда объект берет свое свойство - из базы, считает, или просто хранит в виде поля. Более того, проперти (геттер, сеттер если хотите) - это тоже message, то есть то же самое, что и метод. В чем принципиальная разница между мессагами "верни мне массив твоих координат" и "верни мне твою площадь"?
    


--------------------

PM   Вверх
w1nd
Дата 13.5.2006, 20:06 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата
Предположим, мне нужно узнать размер квадрата, чтобы где-нибудь в статус баре написать "квадрат стороной 10 мм". Как вы это реализуете?

экземпляр_класса_квадрат.отобразить_свой_размер_в_статус_баре().
Цитата
Инкапсуляция означает не то, что объект должен скрывать всё на свете, а то, что он должен скрывать имплементацию. Проперти как раз идеально ложится в данное определение - не важно откуда объект берет свое свойство - из базы, считает, или просто хранит в виде поля. Более того, проперти (геттер, сеттер если хотите) - это тоже message, то есть то же самое, что и метод.

Доступ к данным должен быть невозможен. Что вы будете делать, когда сам тип этого свойства поменяется? Или вместо одного свойства потребуется десять?
Цитата
В чем принципиальная разница между мессагами "верни мне массив твоих координат" и "верни мне твою площадь"?

Да ни в чем. Ни то, ни другое не нужно. От объекта нужен только функционал. Для чего его координаты или площадь? Где-нибудь нарисовать? Это сделает сам объект. 

Цитата
Программирование - это все-таки описание реального мира, а не наоборот. Потому утверждение "у классов А и Б одинаковые поля, плюс у класса Б есть все методы класса А" не означает, что Б должен наследовать от А.
<...>
Вы забываете, что наследование также называется generalization - обобщение, базовый класс - это абстракция более высокого уровня, которым можно в некоторых случаях заменить любой из сабклассов.
<...>
Если угодно реюзать код - например координаты, выстроите правильную иерархию наследования. Например можно ввести понятие GeometricObject.

Только в том случае, когда мне где-либо понадобится этот GeometricObject (кстати, в честь чего у абстрактного геометрического объекта будут координаты? координаты начинаются с точки). Делать его только чтобы был не имеет смысла - это только запутает. Я как раз не забываю, что означает наследование, но я, проектируя структуру классов, не собираюсь следовать примерам из реального мира. Мой реальный мир - это моя программа, здесь всё по-другому. 

Вы можете описать в коде те дополнительные признаки, о которых коговорите, как о ключевых ("общность полей и методов не означает...")? Нет. Кто-нибудь, кроме вас поймет ваш код, если он у вас в голове или где-то еще вне проекта? Нет. 

З. Ы. У любого геометрического объекта, между прочим, есть центр, а у точки отсутствует размер, поэтому любой объект - суть точка.

              

Это сообщение отредактировал(а) w1nd - 13.5.2006, 20:57


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
powerOn
Дата 13.5.2006, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: нет
Всего: 159



Цитата(w1nd @  13.5.2006,  21:06 Найти цитируемый пост)
Цитата
Предположим, мне нужно узнать размер квадрата, чтобы где-нибудь в статус баре написать "квадрат стороной 10 мм". Как вы это реализуете?

экземпляр_класса_квадрат.отобразить_свой_размер_в_статус_баре().


 smile А откуда экземпляр_класса_квадрат узнает о статус баре? А если необходимо не только в статус баре, а еще в 30 разлиных элементах, то придется еще 30 методов реализовывать: экземпляр_класса_квадрат.отобразить_свой_размер_в_объект1() ... экземпляр_класса_квадрат.отобразить_свой_размер_в_объект30() ??   

Это сообщение отредактировал(а) MoonCat - 13.5.2006, 20:35


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
w1nd
Дата 13.5.2006, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата(MoonCat @ 13.5.2006,  20:34)
 smile А откуда экземпляр_класса_квадрат узнает о статус баре? А если необходимо не только в статус баре, а еще в 30 разлиных элементах, то придется еще 30 методов реализовывать: экземпляр_класса_квадрат.отобразить_свой_размер_в_объект1() ... экземпляр_класса_квадрат.отобразить_свой_размер_в_объект30() ??

А вы что думали? smile Объектно-ориентированный подход фактически является вывернутым наизнанку в сравнении со структурным. 

Только вы забыли, что у вас есть такой мощный инструмент, как наследование. Мы делаем класс нечто, который должен уметь отображать текстовую информацию и наследуем от него и статус-бар и все прочие 30 элементов. В результате обходимся одним методом: квадрат::отобразить_свой_размер_в_нечто(), в качестве параметра которому это нечто и передаем. 

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

Это сообщение отредактировал(а) w1nd - 13.5.2006, 20:53


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Domestic Cat
Дата 13.5.2006, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 4
Всего: 172



Цитата(w1nd @  13.5.2006,  11:06 Найти цитируемый пост)
З. Ы. У любого геометрического объекта, между прочим, есть центр, а у точки отсутствует размер, поэтому любой объект - суть точка.

Оффтоп: понятия "центр" у любого геом объекта нет. То, что любой геом объект есть точка - с чего это вы взяли?


Цитата(w1nd @  13.5.2006,  11:45 Найти цитируемый пост)
Только вы забыли, что у вас есть такой мощный инструмент, как наследование. Мы делаем класс нечто, который должен уметь отображать текстовую информацию и наследуем от него и статус-бар и все прочие 30 элементов. В результате обходимся одним методом: квадрат::отобразить_свой_размер_в_нечто(), в качестве параметра которому это нечто и передаем. 

А что, если я хочу отобразить название красным цветом? Курсивом? Использовать буквы разной ширины и цвета?  А что, если мне нужно размеры квадрата вывести в виде (x1, y1, x2, y2,  размер), а Васе Пупкину - в виде "Квадрат имеет длину 5 "? А что, если мне нужно создать кристал репорт по размерам всех квадратов, Пете - создать ворд документ, а Ване - послать размеры на мыло? 

Сколько методов для этого нужно вашему нечто и сколько параметров он будет принимать? Не кажется ли вам, что как минимум сотня, и то самых-самых основных? Или, что еще хуже, сотня классов, от которых квадрату будет нужно унаследовать? Извините, но такой фрейворк будет громоздкой, труднорасширяемой махиной, которой никто не захочет пользоваться.

 
Цитата(w1nd @  13.5.2006,  11:45 Найти цитируемый пост)
А вы что думали? smile Объектно-ориентированный подход фактически является вывернутым наизнанку в сравнении со структурным. 

Да нет уж, это ваш подход вывернут наизнанку.
Цитата(w1nd @  13.5.2006,  11:06 Найти цитируемый пост)
Кто-нибудь, кроме вас поймет ваш код, если он у вас в голове или где-то еще вне проекта? Нет. 

Да. Любой программист поймет этот код, также, как понимает Java или дотнет фреймворк. А вот наследование квадрата от точки - врядли.


Цитата(w1nd @  13.5.2006,  11:06 Найти цитируемый пост)
Для чего его координаты или площадь?

Для чего угодно - см выше
Цитата(w1nd @  13.5.2006,  11:06 Найти цитируемый пост)
Доступ к данным должен быть невозможен. 

Кто это сказал? 

 


--------------------

PM   Вверх
LSD
Дата 14.5.2006, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 9
Всего: 538



Цитата(w1nd @  13.5.2006,  18:19 Найти цитируемый пост)
Вы сами отвечаете на свой вопрос. Класс не должен предоставлять возможности управлять своими атрибутами.

Это еще почему класс не должен предоставлять возможности управлять своими атрибутами? Он вообще для чего существует. Объект это вещь в себе, которая существует только для того чтобы удовлетворить извращеную фантазию своего создателя. Так что ли?
Если у класса есть атирибут, и он является существенным для программиста, то должна быть возможность манипулирования им.

Цитата(w1nd @  13.5.2006,  18:19 Найти цитируемый пост)
Разницы между методами getSize/setSize и публичным полем size нет. Создание таких свойств - это структурное программирование, а не объектное. Не должно быть у класса никаких доступных полей данных, пусть даже getSize двадцать раз конвертирует результат. Мы можем послать объекту сообщение (вызвать метод): "сделай что-то", но никогда не можем запросить у объекта данные.

Ты прекрастно знаешь что методы getSize/setSize и публичное поле size, это две большие разницы. Т.к. методы, помимо изменения внутреннего поля size (кстати, ты можешь сходу сказать в каком виде оно храниться?) еще и вызывает перекомпоновку дочерних элементов и перересовку нужных компонентов.
Ты считаешь что для того чтобы получить размер JFrame надо вызывать не getSize() а gimmeYourSizeMan(), а для изменения размера heySetYourSizeBitch(). И это будет являть собой истинно ООП подход?
Или ты вообще уверен, что нефиг программисту знать, или тем более управлять размерами JFrame. Не его ума это дело, разработчик JFrame лучше знает какого размера должно быть окно smile

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.
PM MAIL WWW   Вверх
w1nd
Дата 14.5.2006, 01:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата
Оффтоп: понятия "центр" у любого геом объекта нет. То, что любой геом объект есть точка - с чего это вы взяли?

Эк вас занесло... У любого объекта есть геометрический центр. А еще есть центр тяжести. Думаю, еще какие-нибудь центры имеются. А считать точкой объект или не считать - зависит исключительно от удаленности наблюдателя. Город на карте - всего лишь точка. 
Цитата
А что, если я хочу отобразить название красным цветом? Курсивом? Использовать буквы разной ширины и цвета?  А что, если мне нужно размеры квадрата вывести в виде (x1, y1, x2, y2,  размер), а Васе Пупкину - в виде "Квадрат имеет длину 5 "? А что, если мне нужно создать кристал репорт по размерам всех квадратов, Пете - создать ворд документ, а Ване - послать размеры на мыло?

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

Не мой, извините, я в соавторах ООП не числюсь. И прошу внимательно перечесть - по сравнению с чем.
Цитата
Да. Любой программист поймет этот код, также, как понимает Java или дотнет фреймворк.

Перефразирую ваше утверждение: любой поймет, что я имел в виду написав "1+1-1+1=2" вместо "1+1=2" или "2=2".
Цитата
Цитата
Доступ к данным должен быть невозможен.
Кто это сказал?

Вообще-то это имеет какое-то отношение к инкапсуляции, и говорят об этом все авторы, пишущие об ООП. 

Это сообщение отредактировал(а) w1nd - 14.5.2006, 04:32


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
w1nd
Дата 14.5.2006, 05:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата
Это еще почему класс не должен предоставлять возможности управлять своими атрибутами? Он вообще для чего существует. Объект это вещь в себе, которая существует только для того чтобы удовлетворить извращеную фантазию своего создателя. Так что ли?
Если у класса есть атирибут, и он является существенным для программиста, то должна быть возможность манипулирования им.

В общем, почти так.
Интересно, а если программисту вдруг понадобится способ для обхода криптозащиты файловой системы в ОС, авторы должны расшибиться в лепешку, но предоставить?
Цитата
Ты прекрастно знаешь что методы getSize/setSize и публичное поле size, это две большие разницы. Т.к. методы, помимо изменения внутреннего поля size (кстати, ты можешь сходу сказать в каком виде оно храниться?) еще и вызывает перекомпоновку дочерних элементов и перересовку нужных компонентов.

Я прекрасно знаю, повторюсь, что между свойством и публичным полем нет никакой разницы. Свойство - это такое продвинутое публичное поле, которое сообщает объекту об изменении себя.
Цитата
Ты считаешь что для того чтобы получить размер JFrame надо вызывать не getSize() а gimmeYourSizeMan(), а для изменения размера heySetYourSizeBitch(). И это будет являть собой истинно ООП подход?
Или ты вообще уверен, что нефиг программисту знать, или тем более управлять размерами JFrame. Не его ума это дело, разработчик JFrame лучше знает какого размера должно быть окно

Это вы так считаете (и откуда в вас такая уверенность - ума не приложу). Я же (в данном случае) считаю, что пользователю окна (в случае ООП) не нужно знать, какой у него размер.

Цитата
P.S. У тебя дико странный взгляд на программирование. Все существующее ты отвергаешь, но при этом не предлагаешь ничего удобоваримого взамен. Предлагаю тебе в качестве примера, набросать иерархию классов, для описания геометрических объектов на плоскости. А то вообще не понятно, как ты предлагаешь писать код с таким подходом.

Ух! Это высказывание породило ряд вопросов:
Во-первых, куда уж больше примеров? Во-вторых, скажите пожалуйста, что существующее я отвергаю (для меня это полная неожиданность)? В-третьих, что вы знаете о моих взглядах на программирование (здесь я еще ничего об этом не писал, мы пока обсуждаем наследование в теоретической ООП-программе)? 


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Domestic Cat
Дата 14.5.2006, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 4
Всего: 172



Цитата(w1nd @  13.5.2006,  16:59 Найти цитируемый пост)

Эк вас занесло... У любого объекта есть геометрический центр. 

Есть ли понятие "геометрический центр"?

Цитата(w1nd @  13.5.2006,  16:59 Найти цитируемый пост)
А считать точкой объект или не считать - зависит исключительно от удаленности наблюдателя. Город на карте - всего лишь точка. 

Мы говорим о геометрии, а не о географии. Найдите мне в хоть одном учебнике слова о том, что любой объект есть точка.

Цитата(w1nd @  13.5.2006,  16:59 Найти цитируемый пост)
Понадобиться может что угодно, но получите вы только то, что может сделать объект.

В таком случае ваш фрейворк будет нерасширяемым, негибким и нереюзаемым. Каждый будет писать свой класс для квадрата, размера, и всего остального лишь для того, чтобы добавить ему то, чего он делать не умеет. 
Цитата(w1nd @  13.5.2006,  16:59 Найти цитируемый пост)
Вообще-то это имеет какое-то отношение к инкапсуляции, и говорят об этом все авторы, пишущие об ООП. 

Перечитайте пожалуйста определение инкапсуляции. 
Инкапсуляция за 3 минуты


Цитата(w1nd @  13.5.2006,  20:03 Найти цитируемый пост)
Я прекрасно знаю, повторюсь, что между свойством и публичным полем нет никакой разницы. Свойство - это такое продвинутое публичное поле, которое сообщает объекту об изменении себя.

И что? Если для данного объекта допустимо предоставлять доступ к полю, то на здоровье, в чем проблема? Важно, чтобы объект скрывал те поля и те методы, которые нужно скрывать.


Цитата(w1nd @  13.5.2006,  20:03 Найти цитируемый пост)
Это вы так считаете (и откуда в вас такая уверенность - ума не приложу). Я же (в данном случае) считаю, что пользователю окна (в случае ООП) не нужно знать, какой у него размер.

В ходе беседы лично у меня складывается впечатление (прошу заранее извинить если не прав) что у вас очень мало или вообще нет опыта работы в серьезных или даже средних проектах. Попытаюсь объяснить. Возьмем часть реального веб приложения - страница, на которой отображаются некие данные. Данные эти читаются из базы в классы-мапперы типа Person, Project, итп, всего штук 15 классов. Задача состоит в том, чтобы иметь возможность сохранять страницу в виде xml файла. 
Будем действовать согласно вашему подходу. Нельзя нам дать классам пропертя типа Name, Id и проч! Что ж делать? Унаследуемся от класса, который умеет сохранять все в xml? Можно, только проблемка то в том, что этот класс будет абстрактным, тк доступа-то у базового класса к полям всех возможных сабклассов нет! Следующий наш шаг - оверрайдить метод WriteToXML и писать 15 методов в 15ти классах...
Через три месяца клиет вам сообщит, что он хотел бы иметь возможность экспортировать не в xml (нахрена ему xml?) а в WordML, PDF и аутлук. И что теперь? Убиваем все 15 методов, наследуемся еще от 3х классов и создаем 45 методов? Классный подход, совсем нетрудоемкий. Кстати, если захотите реюзать в других проектах - не получится, кроме как копипастингом.
А теперь допустим, что мы таки предоставили доступ к полям наших 15 классов. Теперь мы спокойно напишем класс Exporter, унаследуем от него XMLExporter, который будет брать у объекта Provider массив значений. Веб-страница будет выступать таким провайдером, собирая нужные данные с объектов, которые она отображает. Теперь для того, чтобы добавить экспорт в WordML, нужно дописать один-единственный класс с одним методом. И все. Более того, все эти экспортеры можно поместить в отдельную либу и юзать где угодно.
По-вашему, данный подход - неправильный? А по-моему, неправилен именно  ваш - просто вы его даже в реальных проектах не опробовали. 


--------------------

PM   Вверх
LSD
Дата 14.5.2006, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 9
Всего: 538



Цитата(w1nd @  14.5.2006,  06:03 Найти цитируемый пост)
Интересно, а если программисту вдруг понадобится способ для обхода криптозащиты файловой системы в ОС, авторы должны расшибиться в лепешку, но предоставить?

Каждый объект имеет некое назначение, то как его предполагается использовать. И если прикладному программисту для корректного использования компонента, т.е. такого как предполагал разработчик компонента, нужно иметь доступ к данным делающим возможным обход криптозащиты, то эти данные должны быть предоставлены. И между прочим так и есть, разработчики ОС имеют доступ к таким данным, другое дело что только они. Сторонние программисты, доступа к этим данным не имеют, поскольку не предполагается что им эти данные нужны и даже наоборот, считается что эти данные им не нужны. Тут у нас 2 интерфейса, один для разработчиков ядра, другой для прикладных программистов.


Цитата(w1nd @  14.5.2006,  06:03 Найти цитируемый пост)
Я прекрасно знаю, повторюсь, что между свойством и публичным полем нет никакой разницы. Свойство - это такое продвинутое публичное поле, которое сообщает объекту об изменении себя.

А то что благодаря этому выполняется куча дополнительных действий, делающих возможным нормальное функционирование компонента, это по твоему не важно?
Хотя учитывая, что:
Цитата(w1nd @  14.5.2006,  06:03 Найти цитируемый пост)
Это вы так считаете (и откуда в вас такая уверенность - ума не приложу). Я же (в данном случае) считаю, что пользователю окна (в случае ООП) не нужно знать, какой у него размер.

то тогда это все напоминает смертельный номер: "Внимание, только у нас и только сегодня! Написание GUI без использования методов getSize()/setSize()! И на последок, сложный акробатический трюк, написание прграммы без использования статических методов!"
А уверенность такая у меня от этой беседы и от этой.


Цитата(w1nd @  14.5.2006,  06:03 Найти цитируемый пост)
Во-первых, куда уж больше примеров? Во-вторых, скажите пожалуйста, что существующее я отвергаю (для меня это полная неожиданность)?

Пока что от тебя был всего один пример, с точкой и квадратом, плюсь критика существующих подходов. Ты заявляешь что это не ООП, а структурное программированиеобъектно-ориентированный подход фактически является вывернутым наизнанку в сравнении со структурным, да еще много чего. При этом, сам пока не предложил ни одной концепции. А те предложения которые были озвучены, не выдерживаюет никакой критики:
Цитата(w1nd @  13.5.2006,  21:45 Найти цитируемый пост)
Только вы забыли, что у вас есть такой мощный инструмент, как наследование. Мы делаем класс нечто, который должен уметь отображать текстовую информацию и наследуем от него и статус-бар и все прочие 30 элементов. В результате обходимся одним методом: квадрат::отобразить_свой_размер_в_нечто(), в качестве параметра которому это нечто и передаем.

и как это использовать по твоему? А если мне нужно форматировать данные перед отображением, это кто должне будет делать? А если мне понадобится, чтобы данные о квадрате отображались в попугаях, то разработчик класса квадрат, должен будет заложить такой функционал в свой класс квадрат::отобразить_свой_размер_в_попугаях_в_нечто(). А весь геморой от того, что религия запрещает квадрату просто сообщить нам свой размер, в неком заранее оговореном формате.


Цитата(w1nd @  14.5.2006,  06:03 Найти цитируемый пост)
В-третьих, что вы знаете о моих взглядах на программирование (здесь я еще ничего об этом не писал, мы пока обсуждаем наследование в теоретической ООП-программе)?

Я говорил именно о взглядах на ООП, ничего сверх этого не подразумевал. А знаю я только то, что месье соизволил сообщить в этой беседе smile
А без ответов на эти вопросы ты не можешь написать структуру классов? smile 

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.
PM MAIL WWW   Вверх
w1nd
Дата 14.5.2006, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата(Domestic Cat @ 14.5.2006,  12:08)
Есть ли понятие "геометрический центр"?

А что вы мне тычете в нос википедией? Это все равно что на собрание сочинений Васи Пупкина ссылаться smile Геометрический центр - это точка равноудаленная от границ (или вершин, не помню) выпуклой фигуры.

Цитата(Domestic Cat @ 14.5.2006,  12:08)
Мы говорим о геометрии, а не о географии. Найдите мне в хоть одном учебнике слова о том, что любой объект есть точка.

Вот уж никак не география. Проекция объекта вся уместилась между двумя координатами. И учебники здесь не при чем, просто постановки задачек вспомните: из точки А в точку Б... smile 

Цитата(Domestic Cat @ 14.5.2006,  12:08)
В таком случае ваш фрейворк будет нерасширяемым, негибким и нереюзаемым.

Ну с чего вы взяли? У класса вы определили метод, способный сообщать информацию об этом классе некоему интерфейсу. Интерфейс этот реализуете как вашей душе угодно! В чем проблема, откуда вдруг вы видите необходимость еще в сотне методов или невозможность этим классом пользоваться?

Цитата(Domestic Cat @ 14.5.2006,  12:08)
Перечитайте пожалуйста определение инкапсуляции.

Перечитал. Готов подписаться почти под каждым словом. А дело-то в чем?

Цитата(Domestic Cat @ 14.5.2006,  12:08)
И что? Если для данного объекта допустимо предоставлять доступ к полю, то на здоровье, в чем проблема? Важно, чтобы объект скрывал те поля и те методы, которые нужно скрывать.

Проблема заключается в том, что мы создаем лишние связи там, где без этого можно обойтись. В случае со свойством мы намертво связываем пользователя и объект с типом и содержанием этого свойства. Потом это в одностороннем порядке уже не изменить. Да, конечно, LSD сейчас же скажет, что в getter'е мы сможем произвести любое преобразование, поэтому нет никаких связей. Пусть так, но если делать "по-моему", то никаких преобразований не потребуется, потому что пользователь не будет зависеть от свойства объекта. 

Цитата(Domestic Cat @ 14.5.2006,  12:08)
В ходе беседы лично у меня складывается впечатление (прошу заранее извинить если не прав) что у вас очень мало или вообще нет опыта работы в серьезных или даже средних проектах. <...> По-вашему, данный подход - неправильный? А по-моему, неправилен именно  ваш - просто вы его даже в реальных проектах не опробовали.

Я тоже пару раз совершал такую ошибку, так что извиняю smile 

То, что вы иллюстрируете не имеет ничего общего с тем, что я предлагал. Предположение о методе на каждый вид обмена - ваше, я же привел иной пример (в ответ MoonCat). 

Да, я ни разу не опробовал данный подход в реальных проектах. Но (и я об этом уже говорил, по-моему) ООП практически невозможно внедрить частично в структурно-ориентированный проект. Кстати, тот пример который вы мне приводили (про свойства) и есть попытка такого смешивания. Вот я и не пытаюсь. И еще очень ограничивает отсутствие МН (я ведь давно программлю только на Java). Но и это еще не все причины. Я считаю безусловным злом попытки внедрить какие-то новые подходы в устоявшуюся систему/фреймворк. Поэтому в структурно-ориентированной среде я практикую структурный подход. А в процедурно-орентированной ни за что не буду внедрять объекты. 


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Domestic Cat
Дата 14.5.2006, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 4
Всего: 172



Цитата(w1nd @  14.5.2006,  10:50 Найти цитируемый пост)
А что вы мне тычете в нос википедией? Это все равно что на собрание сочинений Васи Пупкина ссылаться smile Геометрический центр - это точка равноудаленная от границ (или вершин, не помню) выпуклой фигуры.

Интересно, и где будет геометрический центр у произвольного полигона или прямой?

Цитата(w1nd @  14.5.2006,  10:50 Найти цитируемый пост)
Вот уж никак не география. Проекция объекта вся уместилась между двумя координатами. И учебники здесь не при чем, просто постановки задачек вспомните: из точки А в точку Б... smile 

Повторю: где написано что любой геом объек есть точка?

Цитата(w1nd @  14.5.2006,  10:50 Найти цитируемый пост)

Перечитал. Готов подписаться почти под каждым словом. А дело-то в чем?


Вот в чем: 
Цитата

Инкапсуля́ция — свойство объекта скрывать некоторые свои свойства и методы


Цитата(w1nd @  14.5.2006,  10:50 Найти цитируемый пост)
Проблема заключается в том, что мы создаем лишние связи там, где без этого можно обойтись. В случае со свойством мы намертво связываем пользователя и объект с типом и содержанием этого свойства. Потом это в одностороннем порядке уже не изменить. 

В случае с методом мы точно также "намертво связываем пользователя и объект с типом и содержанием этого метода". Метод тоже возвращает определенный тип, принимает определенные параметры. Разве это не связь?
  


--------------------

PM   Вверх
Sleepy_PIP
Дата 14.5.2006, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 512
Регистрация: 30.6.2004
Где: Moscow

Репутация: нет
Всего: 12



Цитата(Domestic Cat @ 13.5.2006,  14:54)
Цитата(ALKS @  13.5.2006,  04:38 Найти цитируемый пост)
Чего я не понял, это почему Domestic Cat привязался вначале к квадрату из кординаты и размера? откуда вы знаете где и как такая структура классов будет использоваться? Это вполне может быть крайне удобным и логичным в рамках задачи для которой это проектировалось. Вполне понятно, что одни и те же "объекты реального мира" можно описать различными способами и с чего вы взяли что какой-то способ лучше а какой-то хуже? все зависит от того где и как вы будете результаты своего проектирования применять.  


Согласен, возможно в рамках к-л конкретной задачи такое наследование действительно будет "правильным". Но ведь утверждалось, что это стандарнтый пример, очевидно геометрический. Вот и непонятно, как квадрат может быть точкой.

квадрат вырождается (да и круг и прочая плоская и nD геометрия) при нектором соотношении его Size (которое во превых далеко не всегда всего 2 размера, и которое можно кстати и не наследовать вооще) и расстояния до оного. т.е. в принципе может. просто вопрос насколько велика модель, где составными частями являются точка и квдрат ... я прав если это попытка описания 3D граф. движка smile - а вот если попытка описания мироздания, или хотя-бы конструкторско-натурной модели ракетного двигателя, каким-бы он крупным не был состоя из каких-бы не было мелких деталей  (ба! даже не не надодо Белый свет описывать smile ) - я уже не прав. Но в последнем случае - уже глупо описывать квадраты и курги, сферы и прочее при другом уровне детализации - атомарном, т.к. модели это попросту не нужно, т.к. благодаря Человечеству модель уже кое что знает о более глубоком уровне детализации (предпологается что разработчик - так-же ) - остается вопрос как этим всем воспользоваться..
Так что ООП, то ООП, и про наследование можно много говорить, но лучше изначально задуматься а для чего все это - где (предметно) ООП собрались применять ... а? т.к. ответы на все вообщем-то базовые моменты давно и хорошо изложенны в разнообразной литературе, есть и сранения и анализ математических и аналитеческих умов ...
хотя конечно пытливые умы всегда стявят под вопрос все. и это наверняка правильно.
(я скорее не к Вам, а к Вашему оппоненту и вообще обо всем этом споре).


 


--------------------
--
Sleepy_PIP. Pavel Pryazhentsev (ex. 2:5020/141) "... Лучше быть нужным, чем
свободным ..."
PM MAIL ICQ   Вверх
w1nd
Дата 14.5.2006, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата(LSD @ 14.5.2006,  15:06)
Сторонние программисты, доступа к этим данным не имеют, поскольку не предполагается что им эти данные нужны и даже наоборот, считается что эти данные им не нужны. Тут у нас 2 интерфейса, один для разработчиков ядра, другой для прикладных программистов.

До этого мы говорили только о пользователе объекта, т. е. о прикладном программисте.

Цитата(LSD @ 14.5.2006,  15:06)
то тогда это все напоминает смертельный номер: "Внимание, только у нас и только сегодня! Написание GUI без использования методов getSize()/setSize()! И на последок, сложный акробатический трюк, написание прграммы без использования статических методов!"

Это к чему написано? Если вам нечего возразить по-существу, зачем писать нелепицу?

Цитата(LSD @ 14.5.2006,  15:06)
А уверенность такая у меня от этой беседы и от этой

Между строк вычитали? Или на HTML-тэгах гадали? Там о вашем эктравагантном видении ни слова.

Цитата(LSD @ 14.5.2006,  15:06)
При этом, сам пока не предложил ни одной концепции. А те предложения которые были озвучены, не выдерживаюет никакой критики

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

Цитата(LSD @ 14.5.2006,  15:06)
А если мне нужно форматировать данные перед отображением, это кто должне будет делать? А если мне понадобится, чтобы данные о квадрате отображались в попугаях, то разработчик класса квадрат, должен будет заложить такой функционал в свой класс квадрат::отобразить_свой_размер_в_попугаях_в_нечто(). А весь геморой от того, что религия запрещает квадрату просто сообщить нам свой размер, в неком заранее оговореном формате.

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

Допустим, вам потребовалось отобразить размер квадрата в попугаях. А вы уверены, что тот, кто делал этот самый класс с вами согласится? Если у вас будет возможность заполучить размер и отобразить, как вы того хотите, вас попросту заставят это в последствии переделать (за свой счет), в ином случае вы такой участи избегнете.

Цитата(LSD @ 14.5.2006,  15:06)
Я говорил именно о взглядах на ООП, ничего сверх этого не подразумевал. А знаю я только то, что месье соизволил сообщить в этой беседе smile
А без ответов на эти вопросы ты не можешь написать структуру классов? smile 

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

Цитата(LSD @ 14.5.2006,  15:06)
Ты С++ случайно не у Гостева в МИЭМ-е учился?

Нет, в МИЭМе я не обучался. Да и вообще, ВУЗы программированию обучать пока не в состоянии (учить некому). Но это к слову, не нужно отвечать на эту реплику.

З. Ы. LSD, у меня возникло впечатление, что вы отвечаете только с тем, чтобы оставить за собой последнее слово. Побольше конструктивизма, а?

Добавлено @ 21:19
 
Цитата(Domestic Cat @ 14.5.2006,  20:02)
Интересно, и где будет геометрический центр у произвольного полигона или прямой?

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

Цитата(Domestic Cat @ 14.5.2006,  20:02)
Повторю: где написано что любой геом объек есть точка?

А что, простая логика вам не помогает принять это утверждение? Много где писано, много где сказано - я что, справочник что ли?

Цитата(Domestic Cat @ 14.5.2006,  20:02)
В случае с методом мы точно также "намертво связываем пользователя и объект с типом и содержанием этого метода". Метод тоже возвращает определенный тип, принимает определенные параметры. Разве это не связь?

Это первая из двух связей. Вопрос в том, нужна ли вторая.   

Это сообщение отредактировал(а) w1nd - 14.5.2006, 21:20


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
cromm3
Дата 14.5.2006, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 22.3.2006

Репутация: нет
Всего: нет



Господа-Товарищи, а можете привести реальный пример кода идеальной ОО программки(не большой)? Так будет интереснейsmile ну чтоб, к примеру, квадрат себя увеличивал до размеров половины площади плоскости, в которой он лежит…smile 
PM   Вверх
w1nd
Дата 14.5.2006, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата(cromm3 @ 14.5.2006,  21:33)
Господа-Товарищи, а можете привести реальный пример кода идеальной ОО программки(не большой)? Так будет интереснейsmile ну чтоб, к примеру, квадрат себя увеличивал до размеров половины площади плоскости, в которой он лежит…smile

Опять пример кода smile Тело метода плоскости:
Код
    square.resize(this.width / 2, this.height / 2);
 


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
cromm3
Дата 14.5.2006, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 22.3.2006

Репутация: нет
Всего: нет



А как, программно, узнать, какую часть площади плоскости занимает квадрат? Я извиняюсь, но просто хочется понять…  
PM   Вверх
Domestic Cat
Дата 14.5.2006, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 4
Всего: 172



Цитата(w1nd @  14.5.2006,  12:06 Найти цитируемый пост)
Допустим, вам потребовалось отобразить размер квадрата в попугаях. А вы уверены, что тот, кто делал этот самый класс с вами согласится? Если у вас будет возможность заполучить размер и отобразить, как вы того хотите, вас попросту заставят это в последствии переделать (за свой счет), в ином случае вы такой участи избегнете.


Ниасилил.

Цитата(w1nd @  14.5.2006,  12:06 Найти цитируемый пост)
А что, простая логика вам не помогает принять это утверждение? Много где писано, много где сказано - я что, справочник что ли?

Может у вас логика какая другая... Но вот мне кажется что это чепуха... Приведите ссылку или согласитесь.

Цитата(w1nd @  14.5.2006,  12:06 Найти цитируемый пост)
Это первая из двух связей. Вопрос в том, нужна ли вторая.   

Да вы демагогией занялись... А жаль, хотелось бы что-то интересное для себя вынести. 

  


--------------------

PM   Вверх
LSD
Дата 14.5.2006, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 9
Всего: 538



Цитата(w1nd @  14.5.2006,  22:06 Найти цитируемый пост)
Это к чему написано? Если вам нечего возразить по-существу, зачем писать нелепицу?

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


Цитата(w1nd @  14.5.2006,  22:06 Найти цитируемый пост)
Допустим, вам потребовалось отобразить размер квадрата в попугаях. А вы уверены, что тот, кто делал этот самый класс с вами согласится? Если у вас будет возможность заполучить размер и отобразить, как вы того хотите, вас попросту заставят это в последствии переделать (за свой счет), в ином случае вы такой участи избегнете.

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


Цитата(w1nd @  14.5.2006,  22:06 Найти цитируемый пост)
З. Ы. LSD, у меня возникло впечатление, что вы отвечаете только с тем, чтобы оставить за собой последнее слово. Побольше конструктивизма, а?

Твои впечатления, это твое личное дело, пусть будет так. 

Это сообщение отредактировал(а) 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.
PM MAIL WWW   Вверх
Sleepy_PIP
Дата 14.5.2006, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 512
Регистрация: 30.6.2004
Где: Moscow

Репутация: нет
Всего: 12



Лично меня волнует сильнее не ВАШИ рассуждения, а ошибка скрипта на этой ветке.
Все такие блин сильные типа теоретики, а ошибка скрипта показывает обратное мнение обо всех. smile ... даже не причастных к этой ошибке ...
вот. простая штука. smile 


--------------------
--
Sleepy_PIP. Pavel Pryazhentsev (ex. 2:5020/141) "... Лучше быть нужным, чем
свободным ..."
PM MAIL ICQ   Вверх
Tirael
Дата 15.5.2006, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 31.1.2006
Где: Москва

Репутация: нет
Всего: 7




Цитата(w1nd @  14.5.2006,  21:43 Найти цитируемый пост)
Опять пример кода  Тело метода плоскости:
    square.resize(this.width / 2, this.height / 2);    

Уважаемый....данный квадрат будет занимать четверть плоскости. Или мне кажется ?


 
--------------------
 
PM MAIL   Вверх
w1nd
Дата 15.5.2006, 00:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата(Domestic Cat @  14.5.2006, 22:04)
Может у вас логика какая другая... Но вот мне кажется что это чепуха... Приведите ссылку или согласитесь.

Согласиться с чем? Что чепуха? smile Еще раз, на пальцах: есть некий объект, есть его проекция на плоскость, которая полностью умещается в одну ячейку координатной сетки плоскости (объект находится очень далеко от плоскости), т. е. проекция данного объекта вырождена в точку.

Цитата(LSD @  14.5.2006, 22:36)
Если я буду разрабатывать класс квадрат, то я реализую базовый функционал для квадрата в декартовой системе: координаты, размер и т.п., плюс обеспечение корректности внутреннего состояния объекта (чтоб размеры сторон нельзя было сделать отрицательными и т.п.). Если кому-то понадобится квадрат в косоугольной системе координат, или с размером в попугаях, или еще какая экзотика, пусть сам и реализует. Возможности я для этого предоставил, все необходимые данные доступны.

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

Цитата(LSD @  14.5.2006, 22:36)
Это я к тому, что очень хочется посмотреть как ты напишешь сколько нибудь серьезную программу с GUI, без того чтобы получать размеры компонентов (раз уж ты заявляешь, что компоненты не должны разглашать подобные сведения).

Как я уже дважды (если не больше) писал в этой теме, GUI делать я в ООП не буду даже и пытаться. Когда я делаю гуевые компоненты в Java, я не отступаю от принятого авторами стандарта. Переписывать существующие не-ООП фреймворки с нуля невыгодно, а гибрид делать невыгодно тем более - всё равно ничего хорошего не получится. 

Цитата(cromm3 @  14.5.2006, 21:55)
А как, программно, узнать, какую часть площади плоскости занимает квадрат? Я извиняюсь, но просто хочется понять…

С собственными атрибутами может работать только сам объект. Если некоему объекту X требуются данные квадрата, единственный путь - реализовать в квадрате обработчик сообщения (метод), который передаст эти данные объекту X.

Цитата(Tirael @  15.5.2006, 00:13)
Уважаемый....данный квадрат будет занимать четверть плоскости. Или мне кажется?

Вам шашечки или ехать?   

Это сообщение отредактировал(а) w1nd - 15.5.2006, 04:19


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Void
Дата 15.5.2006, 01:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 11
Всего: 173



Цитата(w1nd @  15.5.2006,  02:53 Найти цитируемый пост)
Если некоему объекту X требуются данные квадрата, единственный путь - реализовать в квадрате обработчик сообщения (метод), который передаст эти данные объекту X.

Пардон, не улавливаю отличий от банального getter'а. 


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Tirael
Дата 15.5.2006, 01:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 31.1.2006
Где: Москва

Репутация: нет
Всего: 7



Я понял...

Это все провакация. Задуманная, чтоб просто  поговорить на умную тему, и поспорить ниачом.

Вначале было интересно.
Затем было смешно.
Сейчас уже не смешно....    

Это сообщение отредактировал(а) Tirael - 15.5.2006, 01:34
--------------------
 
PM MAIL   Вверх
w1nd
Дата 15.5.2006, 04:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата(Void @  15.5.2006, 01:06)
Пардон, не улавливаю отличий от банального getter'а.

Чем ловите?

Разница в том, что вы не можете получить данные квадрата, в отличие от ситуации с getter'ом.  
 

Это сообщение отредактировал(а) w1nd - 15.5.2006, 04:25


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Ivan Kolesnikov
Дата 15.5.2006, 04:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 9.3.2005
Где: г. Новокузнецк

Репутация: нет
Всего: 6



Цитата(w1nd @ 15.5.2006,  01:43)
Цитата(cromm3 @ 14.5.2006,  21:33)
Господа-Товарищи, а можете привести реальный пример кода идеальной ОО программки(не большой)? Так будет интереснейsmile ну чтоб, к примеру, квадрат себя увеличивал до размеров половины площади плоскости, в которой он лежит…smile

Опять пример кода smile Тело метода плоскости:
Код
    square.resize(this.width / 2, this.height / 2);

Привет! w1nd, ты считаешь не верным, чтобы у объекта можно было получить информации о его размере, так как тогда будет привязка к типу данных. Но при изменении типа например с числа пикселей в число попугаев smile (которое может быть вещественным), все равно придется переписать метод resize и добавление методов getSizeX и getSizeY не изменит существенно ситуацию.

Почему тогда объект не может сообщить свой размер? Я не понимаю! smile.  

Это сообщение отредактировал(а) Ivan Kolesnikov - 15.5.2006, 04:45
--------------------
PM MAIL ICQ   Вверх
w1nd
Дата 15.5.2006, 05:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата(Ivan Kolesnikov @ 15.5.2006,  04:40)
Привет! w1nd, ты считаешь не верным, чтобы у объекта можно было получить информации о его размере, так как тогда будет привязка к типу данных. Но при изменении типа например с числа пикселей в число попугаев smile (которое может быть вещественным), все равно придется переписать метод resize и добавление методов getSizeX и getSizeY не изменит существенно ситуацию.

Почему тогда объект не может сообщить свой размер? Я не понимаю! smile.

Я не считаю это верным или неверным. Просто это будет нарушением принципов ООП.  

Это сообщение отредактировал(а) w1nd - 15.5.2006, 05:15


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Ivan Kolesnikov
Дата 15.5.2006, 05:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 9.3.2005
Где: г. Новокузнецк

Репутация: нет
Всего: 6



Цитата

Мы можем послать объекту сообщение (вызвать метод): "сделай что-то", но никогда не можем запросить у объекта данные.

Почему не можем запросить данные? Чем сообщение: "запиши свой размер в такую-то переменную" (под этим я понимаю и возвратить как результат функции) нарушает принципы ООП? Если у объекта это страшная тайна, он вызовет ошибку, а если ему нечего скрывать, то вернет результат.  

Это сообщение отредактировал(а) Ivan Kolesnikov - 15.5.2006, 05:26
--------------------
PM MAIL ICQ   Вверх
powerOn
Дата 15.5.2006, 07:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: нет
Всего: 159



Цитата(w1nd @  15.5.2006,  06:09 Найти цитируемый пост)
Просто это будет нарушением принципов ООП.  


Мы все учимся (или учились) по каким-то материалам, книгам, мануалам. Так вот, уважаемый w1nd, не подскажите ли Вы, каков источник ваших знаний о принципах ООП? Хочу почитать. Спасибо.   


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
Domestic Cat
Дата 15.5.2006, 08:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 4
Всего: 172



Цитата(w1nd @  14.5.2006,  15:53 Найти цитируемый пост)
Еще раз, на пальцах: есть некий объект, есть его проекция на плоскость, которая полностью умещается в одну ячейку координатной сетки плоскости (объект находится очень далеко от плоскости), т. е. проекция данного объекта вырождена в точку.

Ну конечно, а если нарисовать квадрат на листке бумаги, скомкать и выбросить - он выродится в мусорную корзину. 
Блин, какая "ячейка координатной сетки плоскости" в геометрии? Вы вообще проходили стандартный курс аналитической геометрии или нет?

Цитата(w1nd @  14.5.2006,  15:53 Найти цитируемый пост)
Если некоему объекту X требуются данные квадрата, единственный путь - реализовать в квадрате обработчик сообщения (метод), который передаст эти данные объекту X.


Цитата(w1nd @  14.5.2006,  19:22 Найти цитируемый пост)
Чем ловите?
Разница в том, что вы не можете получить данные квадрата, в отличие от ситуации с getter'ом.  


Может объясните разницу - на примере?


Цитата(Tirael @  14.5.2006,  16:29 Найти цитируемый пост)
Это все провакация. Задуманная, чтоб просто  поговорить на умную тему, и поспорить ниачом.

ППКС 


--------------------

PM   Вверх
onsh76
Дата 15.5.2006, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 20.11.2005
Где: Beautiful BC

Репутация: нет
Всего: 5



Domestic Cat, да нет наверное смысла  сказки глухому рассказывать ...
Винград форум силен тех.специалистами -  за это Вам большой респект... 
Нафига давать простор дилетантам и демагогам?
Закрывайте тему, господа модераторы, либо перемещайте ее в "Оффтоп"... 
PM MAIL   Вверх
UnicornMirage
Дата 15.5.2006, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 15.11.2005

Репутация: нет
Всего: 1



не нашел здесь ничего интересного для себя. некрасивый спор. пустая трата времени. 
PM MAIL   Вверх
ALKS
Дата 15.5.2006, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 354
Регистрация: 22.3.2006

Репутация: 2
Всего: 11



Цитата(MoonCat @ 15.5.2006,  07:59)
Цитата(w1nd @  15.5.2006,  06:09 Найти цитируемый пост)
Просто это будет нарушением принципов ООП.  


Мы все учимся (или учились) по каким-то материалам, книгам, мануалам. Так вот, уважаемый w1nd, не подскажите ли Вы, каков источник ваших знаний о принципах ООП? Хочу почитать. Спасибо.

присоеденияюсь к просьбе. 
PM   Вверх
vinegr
Дата 15.5.2006, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 6.2.2006

Репутация: нет
Всего: 3



Цитата(w1nd @  15.5.2006,  00:53 Найти цитируемый пост)
Т. е. вы реализуете структуру с контролем целостности полей и некоторыми общеупотребительными сервисными методами для преобразования данных, хранящихся в этой структуре. Очень хорошо, что из этого следует?

IMHO, следует исчерпывающий ответ на ваше заявление "это не является ООП!" - если определить объект-структуру, структурные методики формально включаются в ООП.

На мой взгляд, w1nd прав, но схоластика, в которую он ушел - тривиальна.
Любая практическая реализация ООП кроме объектов предусматривает "среду", в которой эти объекты "плавают". Да, w1nd прав, что существующие технологии не ограничивают программиста только "конструированием объектов", а допускают "подрихтовать среду исполнения" - и в этом смысле не являются "pure-ООП". 
Я бы также заметил, что базовые свойства сред исполнения ООП-программ (наследование, например) - не сводится к обмену сообщениями между строго изолированными объектами. Т.е. среда, в которой функционируют объекты - необъектна.

Ну да, "pure-ООП" средств сейчас нет - потому что нет ни способа практической реализации, ни нужды в таких средствах. 
PM MAIL   Вверх
w1nd
Дата 15.5.2006, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Подведём итог. Изначальный вопрос - что может быть странного (или непонятного) в примере наследования квадрата от точки - так и остался без ответа smile Разумеется, это была чистой воды провокация; мне самому чье-либо мнение по затронутым в теме вопросам... как бы это сказать... не очень интересно. Что ж, некоторые собеседники (не буду указывать пальцем) выявили непонимание идеологии ООП (точнее выражаться не буду).

Цитата(MoonCat @  15.5.2006, 07:59)
Мы все учимся (или учились) по каким-то материалам, книгам, мануалам. Так вот, уважаемый w1nd, не подскажите ли Вы, каков источник ваших знаний о принципах ООП? Хочу почитать. Спасибо.

Я не могу сказать, что учился у каких-то определенных авторов. Также, к сожалению, не смогу назвать точно назвать книжки, которые читал, так как они были бумажными и давно перекочевали в помойку; сейчас я подобных книжек не читаю. Но труды Буча, я думаю, читали (читают) все. Текущая тема содержит много цитат из книжки Алена Голуба (Allen I. Holub, "Enough rope to shoot yourself in the foot: Rules for C and C++ programming"). Еще могу вспомнить Пола Лукаса, Стефана Дьюхарста, Кэти Старк. У некоторых книжек вообще автора не было (одно время издательства позволяли себе такие безымянные переводы). 

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

Цитата(onsh76 @  15.5.2006, 09:48)
нет наверное смысла  сказки глухому рассказывать <...> нафига давать простор дилетантам и демагогам

Осторожнее с высказываниями, дружище. Судя по вашей решимости в определениях, вы говорите о себе. 


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Domestic Cat
Дата 15.5.2006, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 4
Всего: 172



Совершенно согласен с фразой:
Цитата(w1nd @  15.5.2006,  12:05 Найти цитируемый пост)
Что ж, некоторые собеседники (не буду указывать пальцем) выявили непонимание идеологии ООП (точнее выражаться не буду).


Цитата(onsh76 @  15.5.2006,  00:48 Найти цитируемый пост)
Domestic Cat, да нет наверное смысла  сказки глухому рассказывать ...
Винград форум силен тех.специалистами -  за это Вам большой респект... 
Нафига давать простор дилетантам и демагогам?
Закрывайте тему, господа модераторы, либо перемещайте ее в "Оффтоп"...  

Спасибо. 
Ванкувер? Жаль так там и не побывал.  


--------------------

PM   Вверх
NotGonnaGetUs
Дата 16.5.2006, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 25.2.2005
Где: Москва

Репутация: 8
Всего: 12



[quot w1nd]
Подведём итог. Изначальный вопрос - что может быть странного (или непонятного) в примере наследования квадрата от точки - так и остался без ответа  Разумеется, это была чистой воды провокация; мне самому чье-либо мнение по затронутым в теме вопросам... как бы это сказать... не очень интересно. Что ж, некоторые собеседники (не буду указывать пальцем) выявили непонимание идеологии ООП (точнее выражаться не буду).
[/quot]

Гхм.
Ответ на изначальный вопрос прост: нарушается принцип подстановки Лисков.
Если следовать вашей логике, то выходит этот принцип нарушение "основ ООП" вместе с другими основополагающими шаблонами распределения обязанностей (GRASP)?
Очень интересная точка зрения.

Если последовательно провести вашу линию в жизнь, то окажется, что правильнаяя ОО программа должна состоять ровно из одного класса.
В самом деле, вернёмся к вашему решению об отображении размеров квадрата в статусБаре.
Почему вы решили, что квадрат должен говорить статусБару, что тот должен отображать?!
Чем СтатусБар хуже? Сделаем в нём метод showКвадрат(квадрат:Квадрат).
Чтобы сильно не мучаться соберём статусБар и квадрат в один класс. 
Полное сокрытие данных! Идилия!

Кстати о наследовании...
Мейер выделяет 12++ форм наследования, начиная от наследования интерфейса и заканчивая наследованием реализации.
Далеко не все из этих форм наследования доступны в ОО языках.  
Попытка наследовать класс квадрат от класса точка - это пример наследования реализации.
Наследуется не поведение (квадрат _всегда_ ведёт себя как точка), а какие-то языковые конструкции.
Так же точно можно наследовать: 

Код

class Point {
    protected int x; //координаты
    protected int y;
}

class Size extends Point {
                             //x = width, y = height
}  

class Dollar extend Size {
                             //x = доллары, y = центы
}


class Person extends Dollar {
                             //x = возраст, y = количество детей
}   


Тоже хотите задать вопрос  "что может быть странного" в этом примере?


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

Рекомендую к чтению не книжки безымянных программистов на С, а что-нибудь из нижеследующих:
http://www.ozon.ru/context/detail/id/2336754/  - что такое ОО метод
http://www.ozon.ru/context/detail/id/1048352/  - что такое ОО дизайн
http://www.ozon.ru/context/detail/id/1616782/  - немножко реальных задач
 
PM MAIL   Вверх
w1nd
Дата 16.5.2006, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



2NotGonnaGetUs: сударь мой, то что вы высказали - сами должны это понимать - бред. Вы, видимо, не прочитали ничего из того, что я здесь писал.

З. Ы. Да, и кто такой Мейер? Всего лишь безвестный основатель EiffelSoft, хех. 

З. З. Ы. Еще и два плюса за этот бред получили smile   

Это сообщение отредактировал(а) w1nd - 16.5.2006, 17:00


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Domestic Cat
Дата 16.5.2006, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 4
Всего: 172



Цитата(w1nd @  16.5.2006,  06:54 Найти цитируемый пост)
2NotGonnaGetUs: сударь мой, то что вы высказали - сами должны это понимать - бред.


Если честно, то то, что вы здесь высказали - бессвязные мысли, даже не оформленные во что либо законченное (хотя бы в код что ли) - не знаю как и назвать... Если просто покричать охота - вам не сюда. Потрудитесь вести спор нормально, а не кричать "бред" не отвечая по существу. 
Это предупреждение. 


--------------------

PM   Вверх
w1nd
Дата 16.5.2006, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата
Если просто покричать охота - вам не сюда. Потрудитесь вести спор нормально, а не кричать "бред" не отвечая по существу.

Ваши слова: "то, что вы здесь высказали - бессвязные мысли" - есть ваше личное мнение, не более того. Единственное что можно охарактеризовать, как бессвязное в теме - вопросы (ваши и прочих). 

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


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Domestic Cat
Дата 16.5.2006, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 4
Всего: 172



Цитата(w1nd @  16.5.2006,  10:03 Найти цитируемый пост)

Я не намерен вести споры (тем более нормально), когда за мои слова выдают откровенную чепуху.

Не увидел никакой чепухи, в данной теме вы именно это и утверждали. Если считаете, что ва неправильно поняли - уточните, в чем.  


--------------------

PM   Вверх
chipset
Дата 16.5.2006, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 4
Всего: 164



Цитата(w1nd @  15.5.2006,  11:05 Найти цитируемый пост)

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

А я считаю, что в учебе скромность и отсутствие мании величие тоже немаловажный фактор.
Цитата(w1nd @  14.5.2006,  19:09 Найти цитируемый пост)
Я не считаю это верным или неверным. Просто это будет нарушением принципов ООП.  

А можно по пунктам и с цитатами? Просто видишь-ли, дело в том что теория ООП используется на практике и большинство людей согласны с тем что данные которые надо открыть -- надо открывать, ибо в этом случае данные представляют собой интерфейс.
Ты же, пытаешься посягнуть на фундаментальное. Ок, ноу проблем, никто не сдерживает так сказать, "полёт мысли" и абстрактное мышление. Но будь добр доказать что ты прав.

Цитата(w1nd @  15.5.2006,  11:05 Найти цитируемый пост)
Изначальный вопрос - что может быть странного (или непонятного) в примере наследования квадрата от точки - так и остался без ответа smile 

(пошёл наследовать класс XML ноды от точки) 


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Void
Дата 16.5.2006, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λ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
PM MAIL WWW GTalk   Вверх
powerOn
Дата 16.5.2006, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: нет
Всего: 159



Тут возникло предложение позвонить в Sun Microsystems и попросить заменить класс Object на класс Point ...   smile 
Теперь все от точки наследовать будем!!!   smile  smile  


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
LSD
Дата 16.5.2006, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 9
Всего: 538



Цитата(w1nd @  15.5.2006,  01:53 Найти цитируемый пост)
Как я уже дважды (если не больше) писал в этой теме, GUI делать я в ООП не буду даже и пытаться. Когда я делаю гуевые компоненты в Java, я не отступаю от принятого авторами стандарта. Переписывать существующие не-ООП фреймворки с нуля невыгодно, а гибрид делать невыгодно тем более - всё равно ничего хорошего не получится.

Ну хорошо, предположим что в существующих GUI фреймворках не соблюдаются ООП принципы, и комбинировать эти два подхода не выгодно. Хотя не совсем понятно как получается что:
Цитата(w1nd @  12.5.2006,  00:48 Найти цитируемый пост)
Хорошим примером ООП наверняка может быть отдельно взятый фрагмент в любом из существующих якобы-ООП-фреймворков

при этом если взять, что Java, что .NET там почти все построено на концепции properties, а:
Цитата(w1nd @  12.5.2006,  00:48 Найти цитируемый пост)
Самое жуткое - это, конечно, 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.
PM MAIL WWW   Вверх
Domestic Cat
Дата 16.5.2006, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 4
Всего: 172




Модератор: Сообщение скрыто.



--------------------

PM   Вверх
w1nd
Дата 16.5.2006, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата(chipset @  16.5.2006, 20:56)
А я считаю, что в учебе скромность и отсутствие мании величие тоже немаловажный фактор.

Я тоже так считал. Когда учился.

Цитата(chipset @  16.5.2006, 20:56)
пошёл наследовать класс XML ноды от точки

Назовите свои pro et contra. Пока один лишь Domestic Cat возразил по существу, говоря, что квадрат в реальном мире не может быть представлен, как точка (хоть он в этом и не прав).

Цитата(Domestic Cat @  16.5.2006, 20:16)
Не увидел никакой чепухи, в данной теме вы именно это и утверждали.

Ну а я утверждаю, что подобного не писал smile Процитируйте что-нибудь, будте так любезны. Да, и, развивая тему, разъясните мне, что это было:
Цитата(MoonCat @  16.5.2006, 21:55)
Тут возникло предложение позвонить в Sun Microsystems и попросить заменить класс Object на класс Point ...    
Теперь все от точки наследовать будем!!!
К слову, разъясните мне так же, как все мирятся с вопиющим фактом наследования классов вроде AbstractAction из класса Object. Исходя из верований всех отметившихся, класс Object может быть родителем AbstractAction только в том случае, если будет переименован в Something или что-то в этом духе.

Добавлено @ 23:28 
Цитата(Void @ 16.5.2006,  20:56)
w1nd, два вопроса:
Совместима ли статическая типизация с «хорошим ООП»?
Являются ли примитивные типы нарушением принципов «хорошего ООП»?

Да. Нет. 
Что вы хотели сказать?

Добавлено @ 23:34 
Цитата(LSD @ 16.5.2006,  22:21)
Цитата(w1nd @  15.5.2006,  01:53 Найти цитируемый пост)
Как я уже дважды (если не больше) писал в этой теме, GUI делать я в ООП не буду даже и пытаться. Когда я делаю гуевые компоненты в Java, я не отступаю от принятого авторами стандарта. Переписывать существующие не-ООП фреймворки с нуля невыгодно, а гибрид делать невыгодно тем более - всё равно ничего хорошего не получится.

Ну хорошо, предположим что в существующих GUI фреймворках не соблюдаются ООП принципы, и комбинировать эти два подхода не выгодно. Хотя не совсем понятно как получается что:
Цитата(w1nd @  12.5.2006,  00:48 Найти цитируемый пост)
Хорошим примером ООП наверняка может быть отдельно взятый фрагмент в любом из существующих якобы-ООП-фреймворков

при этом если взять, что Java, что .NET там почти все построено на концепции properties, а:
Цитата(w1nd @  12.5.2006,  00:48 Найти цитируемый пост)
Самое жуткое - это, конечно, properties.


Ну ладно, это не суть важно, вопрос в другом. Были же у вашей системы, модули которые были достаточно автономны, чтобы их можно было бы реализовать "в соответсвии с принципами ООП"?

Не из одних properties все они состоят. Под фрагментами я имел в виду кусок модели классов, способы взаимодействия отдельных классов и прочие подобные детали.
Что касается последнего вопроса - да, безусловно. Что из этого следует?  

Это сообщение отредактировал(а) w1nd - 16.5.2006, 23:38


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
LSD
Дата 17.5.2006, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 9
Всего: 538



Цитата(w1nd @  17.5.2006,  00:21 Найти цитируемый пост)
Не из одних properties все они состоят.

Конечно, но без них они не смогут существовать. Подавляющее большинство взаимодействия мужду объектами идет посредством properties.

Цитата(w1nd @  17.5.2006,  00:21 Найти цитируемый пост)
Что касается последнего вопроса - да, безусловно. Что из этого следует?

И они были написаны в соответсвии с твоими представлениями об ООП? 


--------------------
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.
PM MAIL WWW   Вверх
Void
Дата 17.5.2006, 01:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 11
Всего: 173



Цитата(w1nd @  17.5.2006,  01:21 Найти цитируемый пост)
Что вы хотели сказать?

Я пытаюсь уяснить для себя ваше понимание ООП.

Если убрать из ваших постов излишний апломб и некорректные примеры, я с вами даже соглашусь по большей части. (Впрочем, вполне вероятно, что я вас опять неправильно понял, и вы меня быстро заставите изменить свое мнение).
Вы утверждали, что getters/setters и свойства нарушают инкапсуляцию и создают излишние связи между объектами. Но четкая граница между getter и посылкой сообщения «скажи мне какую-то свою характеристику» объекту так и не была проведена.
Свойство может скрывать сколь угодно сложную логику. Если нет прямого соответствия между значением свойства и каким-либо полем класса, если оно возвращает нечто вычисляемое, существенную информацию об объекте — оно не противоречит ООП и является синтаксическим сахаром над нотацией метода/пары методов, не так ли? (Если не так, я уж и не знаю, что сказать).
Но есть объекты, информация, содержащаяся в полях которых, составляет часть публичного интерфейса. Например, возьмем класс… нет, лучше интерфейс коллекции. Коллекция должна предоставлять метод для перебора своего содержимого — это ее наиболее существенное качество. Но можем ли мы отказать в существовании свойству или getter'у, который будет возвращать число элементов, содержащихся в коллекции? А ведь это тело этого свойства, скорее всего, будет состоять всего лишь из возврата значения поля.
Вы сказали, что примтивным типам не место в ООП. Но так или иначе, без типов, соответствующих, к примеру, множеству целых чисел, не обойтись. Значит, нужны классы, обладающие поведением целых чисел. А они-то как общаться будут с окружающим миром, не выпадая из рамок ООП?

Цитата(w1nd @  13.5.2006,  22:06 Найти цитируемый пост)
экземпляр_класса_квадрат.отобразить_свой_размер_в_статус_баре().

А вам не кажется, что при таком подходе количество излишних связей только возрастает? Ведь теперь класс квадрата обязан знать обо всех типах объектов, в которых ему надо отобразить свой размер. Или введем еще интерфейс нечто_в_чем_можно_отобразить_размер_квадрата?

Цитата(w1nd @  13.5.2006,  19:19 Найти цитируемый пост)
Конечно можно! Как правило, путем отказа от парадигм ООП.

А кто сказал, что отказ от парадигмы ООП — это непременно плохо? Не будьте догматиком. Цель проектирования — не следование парадигмам ООП (которые всяк норовит истолковать по-своему), а повышение уровня абстракции. Так что дело не в «недостаточной объектно-ориентированности» существующих фреймворков, а в том, что так называемое «чистое ООП» не является универсальным подходом. Говоря формальным языком, полностью stateful модель точно так же не всегда подходит для описания предметной области, как и полностью stateless. 


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Domestic Cat
Дата 17.5.2006, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 4
Всего: 172



Цитата(w1nd @  16.5.2006,  14:21 Найти цитируемый пост)
Пока один лишь Domestic Cat возразил по существу, говоря, что квадрат в реальном мире не может быть представлен, как точка (хоть он в этом и не прав).

Речь шла (как я понял и на чем делал упор) о геометрии, а не вообще квадрате в любом контексте. И в этом случае подобное наследование ничем не лучше приведенных NotGonnaGetUs примеров. 
Цитата(w1nd @  16.5.2006,  14:21 Найти цитируемый пост)
Ну а я утверждаю, что подобного не писал

Относительно наследования вы утверждали что
1. Квадрат нужно наследовать от точки, тк у квадрата есть те же поля что и у точки
2. Пример номер два: наследовать квадрат от Size
3. Пример номер 3: Company можно наследовать от Contact.
Может вы этого не писали?
  


--------------------

PM   Вверх
w1nd
Дата 17.5.2006, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата(Void @ 17.5.2006,  01:20)

Я пытаюсь уяснить для себя ваше понимание ООП.
Если убрать из ваших постов излишний апломб и некорректные примеры, я с вами даже соглашусь по большей части.

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

Цитата(Void @ 17.5.2006,  01:20)
Вы сказали, что примтивным типам не место в ООП.

Да нет, я пытался точно ответить на вопрос "вы считаете". Я не считаю примитивные типы недопустимыми. 

Цитата(Void @ 17.5.2006,  01:20)
Вы утверждали, что getters/setters и свойства нарушают инкапсуляцию и создают излишние связи между объектами. Но четкая граница между getter и посылкой сообщения «скажи мне какую-то свою характеристику» объекту так и не была проведена.
Свойство может скрывать сколь угодно сложную логику. Если нет прямого соответствия между значением свойства и каким-либо полем класса, если оно возвращает нечто вычисляемое, существенную информацию об объекте — оно не противоречит ООП и является синтаксическим сахаром над нотацией метода/пары методов, не так ли? (Если не так, я уж и не знаю, что сказать).
Но есть объекты, информация, содержащаяся в полях которых, составляет часть публичного интерфейса. Например, возьмем класс… нет, лучше интерфейс коллекции. Коллекция должна предоставлять метод для перебора своего содержимого — это ее наиболее существенное качество. Но можем ли мы отказать в существовании свойству или getter'у, который будет возвращать число элементов, содержащихся в коллекции? А ведь это тело этого свойства, скорее всего, будет состоять всего лишь из возврата значения поля.

Если мы начнем считать все методы, возвращающие некоторое значение свойством (о которых я говорил), то далеко уйдем. Я имел в виду именно свойства java-бинов или подобных классов, то есть с getter'ом и setter'ом.

В свойствах я вижу три беды (это навскидку, возможно я что-нибудь забыл).
Во-первых, навязывается существование того или иного свойства объекту (а также его тип - пользователю объекта), тогда как в процессе "эволюции" это свойство может поменять тип или вообще стать ненужным. То есть, как я говорю - лишняя связь, которую придется поддерживать.
Во-вторых, свойство навязывает структурный подход к взаимодействию с объектом: получить значение свойства, произвести некоторые вычисления, результат поместить обратно или передать другому объекту. Что происходит? Логика, свойственная объекту, вынесена из него. Например, часто повторяющийся во всех GUI-фреймворках приём с компонентом и контейнером: допустим, произошло событие, которое контейнеру необходимо передать своим компонентам. Контейнер получает свойства компонент, анализирует их (может ли компонент обработать данное событие) и передает событие на обработку. По объектной идеологии компонент просто должен получить событие. Дальше он либо его обработает (если может), либо вернет контейнеру или остальным компонентам; в этом случае нет необходимости в свойстве state компонента, а логика контейнера значительно более проста.
В-третьих, мы даем право пользователю объекта интерпретировать свойство так, как он того хочет, что не есть правильно. Ведь тогда никто не помешает отобразить размеры ящиков в апельсинах или что-нибудь в этом роде.

Вообще, в реализации множества методов-обработчиков-сообщения может быть всего лишь возврат (или присваивание) некоторого атрибута класса. Дело-то не в этом, в а подходе (пресловутая вывернутость на изнанку) - объект сам управляет своими атрибутами. И подход этот приносит свои плоды - в общем случае можно без рефакторинга половины проекта значительно модифицировать реализацию класса. 

Цитата(Void @ 17.5.2006,  01:20)
Или введем еще интерфейс нечто_в_чем_можно_отобразить_размер_квадрата?

Точнее, нечто_в_чем_можно_отобразить_текстовую_информацию. Я это уже писал.

Цитата
А кто сказал, что отказ от парадигмы ООП — это непременно плохо? <...>

Вот, мы наконец-то подобрались к источнику беспокойства участников обсуждения. Я не призываю отказаться от существующих подходов! Я призываю отделить мух от котлет. И это я тоже уже писал. 


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
w1nd
Дата 17.5.2006, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата(Domestic Cat @  17.5.2006, 09:02)
Речь шла (как я понял и на чем делал упор) о геометрии, а не вообще квадрате в любом контексте. И в этом случае подобное наследование ничем не лучше приведенных NotGonnaGetUs примеров.

Относительно наследования вы утверждали что
1. Квадрат нужно наследовать от точки, тк у квадрата есть те же поля что и у точки
2. Пример номер два: наследовать квадрат от Size
3. Пример номер 3: Company можно наследовать от Contact.
Может вы этого не писали?

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

Я писал:
  • Модель классов в конкретном проекте не должно быть проекцией объектов реального мира. Потому что отягощает. Если у меня в проекте используется иерархия из двух классов, но в реальном мире эта иерархия насчитывает сотни и сотни классов, зачем они все мне? Обобщение имеет смысл только в том случае, когда это где-то используется. В примере в контактом и компанией вы указывали на возможные проблемы при расширении данных контакта. Так если по стеклу молотком ударить - оно разобьется. Без всяких проблем в этом случае создается еще один наследник контакта (персона, например) и никаких изменений в существющем коде не потребуется. Если мне потребуется обобщить - опять же, надстройку над иерархией в никто не заметит. Потому что кода, рассчитанного на новую модель еще нет. 
  • Отношение is-a (из наличия которого мы делаем вывод о корректности наследования) определяется свойственностью полей [B]и методов родителя наследнику.[/B] Что означает слово свойственный? Я вкладываю в это понятие отнюдь не совпадение в названии или типе. И уж точно не принципиальную возможность разместить какую-то информацию в участке памяти (NotGonnaGetUs), занимаемой полями. Теперь: точка, размер и квадрат. Поля и методы, принадлежащие точке, свойственны квадрату потому, что он тоже имеет координаты. То же самое с размером. Все методы, работающие с координатами, будучи примененными к квадрату, отработают корректно. То же самое с размером. Дальше, вы говорили, что вызывая метод paint() точки пользователь получит квадрат и сильно будет этим ошарашен. Во-первых, пользователь, конструирующий точку получит точку. Во-вторых, методы, работающие с массивами точек получат то, что сконструировал пользователь. В-третьих, я могу пожелать, чтобы точки у меня отображались, как квадраты 10х10. В-четвертых, методам, работающим с верхним в иерархии классом всё равно.

Что касается примеров NotGonnaGetUs (и вашей позиции, кстати), человек просто решил для себя, что я не прав. Отреагировал на некое ключевое слово (фразу), вырванное из контекста повествования. И примеры его никак не проистекают из моих слов.
 


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Domestic Cat
Дата 17.5.2006, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 4
Всего: 172



Цитата(w1nd @  17.5.2006,  03:01 Найти цитируемый пост)
Модель классов в конкретном проекте не должно быть проекцией объектов реального мира. Если у меня в проекте используется иерархия из двух классов, но в реальном мире эта иерархия насчитывает сотни и сотни классов, зачем они все мне?


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

Цитата(w1nd @  17.5.2006,  03:01 Найти цитируемый пост)
# Отношение is-a (из наличия которого мы делаем вывод о корректности наследования) определяется свойственностью полей и методов родителя наследнику.

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

свойственны 

наследникам, но отрицаете что слово является(есть) должно быть фактором в построении иерархии наследования. По какому принципу тогда вы делаете вывод о свойственности полей/методов? 
Такой выбор наследования не может быть правильным, тк свойственность методов или полей вы можете определить лишь на данный момент. Завтра или через год требования к продукту изменятся, и ваш базовый класс получит те методы, которые несвойственны наследникам.
Почему-то вы хоть и говорите о том,  что вроде как строго придерживаетесь ООП в рассуждениях, но все-таки забываете любой учебник по ООП говорит о том, что наследование есть специализация, уточнение существующего класса; базовый класс является более общим случаем наследников. Вы-то можете как угодно определять наследование, но в таком случае и разговор ни о чем - речь ведь идет об общепринятых понятиях.
Для меня и Company, и Contact отражают некоторые свойства реальных компаний и контактов, и исходя из реальных объектов я понимаю, что компания не есть контакт, а квадрат не есть точка. Это немного более высокий уровень абстракции, чем свойственность методов и полей, и потому правильный, тк позволяет отразить отношение данных классов более полно. Потому здесь и не будет ошибки такой как
Цитата(w1nd @  17.5.2006,  03:01 Найти цитируемый пост)
В примере в контактом и компанией вы указывали на возможные проблемы при расширении данных контакта. 


Добавлено @ 15:08 
Цитата(w1nd @  17.5.2006,  01:49 Найти цитируемый пост)
Во-первых, навязывается существование того или иного свойства объекту (а также его тип - пользователю объекта), тогда как в процессе "эволюции" это свойство может поменять тип или вообще стать ненужным. То есть, как я говорю - лишняя связь, которую придется поддерживать.

Метод - точно такая же связь. Никаких отличий нет.

Цитата(w1nd @  17.5.2006,  01:49 Найти цитируемый пост)
Во-вторых, свойство навязывает структурный подход к взаимодействию с объектом:

Если так рассуждать, то должны существовать только void методы.


Цитата(w1nd @  17.5.2006,  01:49 Найти цитируемый пост)
В-третьих, мы даем право пользователю объекта интерпретировать свойство так, как он того хочет, что не есть правильно

Почему? Ну проедположим метод что-то возвратил  и соответственно возвращенное значение можно интрерпретировать как угодно. В чем разница? 

Цитата(w1nd @  17.5.2006,  01:49 Найти цитируемый пост)
Я не призываю отказаться от существующих подходов! Я призываю отделить мух от котлет.

Ну и отделите на здоровье. Напишите свой небольшой фреймворк, построенный на вашем толкоании ООП. А дальше и посмотрите, насколько правильны ваши рассуждения. Коммунизм тоже был правилен в теории но на практике оказалось совсем иначе. 


--------------------

PM   Вверх
w1nd
Дата 17.5.2006, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата(Domestic Cat @  17.5.2006, 14:55)
Если так рассуждать, то должны существовать только void методы.

В идеале - да.

Цитата(Domestic Cat @  17.5.2006, 14:55)
свойственность методов или полей вы можете определить лишь на данный момент <...> и Company, и Contact отражают некоторые свойства реальных компаний и контактов

Снова одно и то же. Вы читаете именно то, что выделили как цитату? Да, я могу определить поля и методы лишь на данный момент, но базовый класс в дальнейшем менять я не собираюсь! Я могу сколько угодно обобщать, могу создавать новых наследников - нет необходимости менять базовый класс. Или приведите пример (отличный от того, что вы приводили с добавлением пола в контакт, ибо в том случае я показал, как следовало это сделать).
А классы отражают свойства не реальных объектов, а объектов данной модели. Ничего больше. В такой модели состав и содержание полей той же компании может полностью отличаться от реального "прототипа". 

Цитата(Domestic Cat @  17.5.2006, 14:55)
исходя из реальных объектов я понимаю, что компания не есть контакт

В программе, предназначенной для каталогизации контактов, например, все объекты - контакты. Никаких других не может возникнуть никогда. Объекты внутри данной программы - и есть самые что ни есть реальные объекты.

Цитата(Domestic Cat @  17.5.2006, 14:55)
Метод - точно такая же связь. Никаких отличий нет.

Между чем нет никакой разницы в случае компонента, обладающего свойством size (Dimension) и компонентом без доступа к этому свойству, но методом resize(int, int)?

      

Это сообщение отредактировал(а) w1nd - 17.5.2006, 16:37


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Domestic Cat
Дата 17.5.2006, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 4
Всего: 172



Цитата(w1nd @  17.5.2006,  06:41 Найти цитируемый пост)
но базовый класс в дальнейшем менять я не собираюсь! 

Признайтесь, делали ли вы реальные проекты или нет smile Или все ваши рассуждения построены только на теории?  


--------------------

PM   Вверх
w1nd
Дата 17.5.2006, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата(Domestic Cat @ 17.5.2006,  16:15)
Цитата(w1nd @  17.5.2006,  06:41 Найти цитируемый пост)
но базовый класс в дальнейшем менять я не собираюсь! 

Признайтесь, делали ли вы реальные проекты или нет smile Или все ваши рассуждения построены только на теории?

Реальные проекты целиком на ООП - никогда. Только отдельные модули. Но цитата к данному вопросу не подходит. 

Это сообщение отредактировал(а) w1nd - 17.5.2006, 16:40


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
NotGonnaGetUs
Дата 17.5.2006, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 25.2.2005
Где: Москва

Репутация: 8
Всего: 12



Цитата(w1nd)

Если мы начнем считать все методы, возвращающие некоторое значение свойством (о которых я говорил), то далеко уйдем. Я имел в виду именно свойства java-бинов или подобных классов, то есть с getter'ом и setter'ом.

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


Раз вы так любите разделять мух, давайте поразделяем.

Цитата

Во-первых, навязывается существование того или иного свойства объекту (а также его тип - пользователю объекта), тогда как в процессе "эволюции" это свойство может поменять тип или вообще стать ненужным. То есть, как я говорю - лишняя связь, которую придется поддерживать.

Вызов _любого_ метода связывает вызывающий класс с вызываемым.
Если метод возвращает какое-либо значение или требует каких-либо параметров, то происходит и связь по "типу"(с).

Здесь нет ничего спецефического для getter/setter. 

Пример с Date и String прозвучавший из ваших уст не решает эту проблему.
Он приводит только к невозможности воспользоваться статической типзацией для контроля типов. 
Вместо того, чтобы при смене формата хранения даты внести исправления в зависимные классы (т.к. они перестанут компилироваться), придётся в ручную искать все использования String, что далеко не тривиальная задача.
Альтернатива - поставлять вместе со String парсер для разбора этой строки и превращения её в date. 
Спрашивается, чем это лучше простого возврата Date?

Цитата

Во-вторых, свойство навязывает структурный подход к взаимодействию с объектом: получить значение свойства, произвести некоторые вычисления, результат поместить обратно или передать другому объекту. Что происходит? Логика, свойственная объекту, вынесена из него. Например, часто повторяющийся во всех GUI-фреймворках приём с компонентом и контейнером: допустим, произошло событие, которое контейнеру необходимо передать своим компонентам. Контейнер получает свойства компонент, анализирует их (может ли компонент обработать данное событие) и передает событие на обработку. По объектной идеологии компонент просто должен получить событие. Дальше он либо его обработает (если может), либо вернет контейнеру или остальным компонентам; в этом случае нет необходимости в свойстве state компонента, а логика контейнера значительно более проста.

Кому навязывает структурный подход? Мне нет. Вам?

"во всех 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, прибегая при этом к сомнительной терминологии. Это не серьёзно.

------

Цитата

Модель классов в конкретном проекте не должно быть проекцией объектов реального мира.

Отношение is-a (из наличия которого мы делаем вывод о корректности наследования) определяется свойственностью полей и методов родителя наследнику. 


Модель классов никогда не является моделью объектов реального мира. 
Кстати, вы не считаете случайно геометричекие объекты объектами реального мира? )

Прицип подстановки говорит: B is-a A если в любой программе A можно заменить на B и программа будет работать точно также.
Всё просто и не надо изобретать "свойственность".

Определите операции над классами Point, Size и Square  и тогда можно будет судить о том, правомерно наследование или нет.

Т.к. вы этого не сделали, мы вправе предположить наиболее очевидное использование для этих классов - моделирование геометрических объектов.

Поптайтесь-ка вычислить расстояние между двумя произвольными объектами(расстояние - длинна кратчайшего отрезка соединяющего два объекта): 
1. (point, point)
2. (point, square)
3. (square, square)
4. (yyy, xxx) // другие объекты.

Особенно интересен случай 2, и варианты, когда в метод вычислитель будет попадать класс Square приведённый к Point.

Нет, честное слово, очень интересно увидеть "идеалогически" верное решение этой проблемы в вашем исполнении.
Общий каркас, без математики.   
PM MAIL   Вверх
Domestic Cat
Дата 17.5.2006, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 4
Всего: 172



Цитата(w1nd @  17.5.2006,  07:38 Найти цитируемый пост)
Но цитата к данному вопросу не подходит. 

Почему?  


--------------------

PM   Вверх
chipset
Дата 17.5.2006, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 4
Всего: 164



Цитата(w1nd @  16.5.2006,  13:21 Найти цитируемый пост)
Назовите свои pro et contra. 

Это просто не нужно в текущих задачах. Кроме того, как я упомянул, я защищаю ОБЩЕПРИНЯТУЮ методику а для того чтобы сбить эту методику с её позиции нужно ВАМ привести аргументы pro.
Т.е. к примеру я прихожу куда-нибудь и говорю, - Солнце крутится вокруг Земли, попробуйте доказать что это не так! Ага, нормально, а аргументы есть? В том плане что никто-же не будет мне доказывать что Земля крутится вокруг Солнца потому-что это проходят в школе с другой стороны мне придется привести кучу доказательств того что Солнце крутится вокруг Земли.
Цитата(w1nd @  16.5.2006,  13:21 Найти цитируемый пост)
Пока один лишь Domestic Cat возразил по существу, говоря, что квадрат в реальном мире не может быть представлен, как точка (хоть он в этом и не прав).

Ну. Ещё квадрат может быть представлен как набор описаний молекул хлорида натрия с детализацией до кварков. И ч0?  


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Void
Дата 17.5.2006, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 11
Всего: 173



Цитата(w1nd @  17.5.2006,  12:49 Найти цитируемый пост)
Цитата
А кто сказал, что отказ от парадигмы ООП — это непременно плохо? <...>

Вот, мы наконец-то подобрались к источнику беспокойства участников обсуждения. Я не призываю отказаться от существующих подходов! Я призываю отделить мух от котлет. И это я тоже уже писал.

Замечательно. Ну и зачем тогда был нужен этот спор о терминах, бессмысленнный и беспощадный? Неужели вопрос, что нужно понимать под якобы правильным ООП, стоил обсуждения на семи страницах, если правильное ООП оказывается вовсе не эквивалентно правильному дизайну?
Цитата(w1nd @  17.5.2006,  17:41 Найти цитируемый пост)
Цитата(Domestic Cat @  17.5.2006, 14:55)
Если так рассуждать, то должны существовать только void методы.
В идеале - да.

ОК. Напишем на знаменах: «Stateful — это наше все». Чем это поможет в реальных задачах идеального мира, где каким-то чудом все программное окружение оказалось выдержано в таком духе?
Цитата(w1nd @  17.5.2006,  12:49 Найти цитируемый пост)
В-третьих, мы даем право пользователю объекта интерпретировать свойство так, как он того хочет, что не есть правильно. Ведь тогда никто не помешает отобразить размеры ящиков в апельсинах или что-нибудь в этом роде.

А эту проблему надо решать строгой типизацией, а не отказом от свойств. Вы предлагаете решить проблему введением черного ящика, который обладает исключительным знанием о назначении своего содержимого. А почему не значение, обладающее структурным (а не identity) равенством, и лишь описывающее, что с ним надо делать, оставляя окончательное решение на откуп пользователю?
В погоне за foolproof дизайном вы теряете расширяемость. 


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
w1nd
Дата 18.5.2006, 02:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата(NotGonnaGetUs @  17.5.2006, 16:40)
Вызов _любого_ метода связывает вызывающий класс с вызываемым. Если метод возвращает какое-либо значение или требует каких-либо параметров, то происходит и связь по "типу"(с). Здесь нет ничего спецефического для getter/setter.

Несомненно. А вся программа - суть трудноподдающийся учету набор связей. Но, наверное, есть разница между типом, определенным в некоторой библиотеке и стандартным типом? Или двумя библиотечными типами и тремя (или более)? Чем больше свойств - тем больше типов, которые доступны пользователю и должны поддерживаться. А ведь свойства эти при подходе "объект сам управляет своими данными" (см. ниже новой термин) просто не нужны.

Цитата(NotGonnaGetUs @  17.5.2006, 16:40)
Пример с Date и String прозвучавший из ваших уст не решает эту проблему.
Он приводит только к невозможности воспользоваться статической типзацией для контроля типов. 
Вместо того, чтобы при смене формата хранения даты внести исправления в зависимные классы (т.к. они перестанут компилироваться), придётся в ручную искать все использования String, что далеко не тривиальная задача.
Альтернатива - поставлять вместе со String парсер для разбора этой строки и превращения её в date. 
Спрашивается, чем это лучше простого возврата Date?

Это с Исходников? Там говорится о формате хранения даты внутри класса Date или о самом Date, а не о шаблонах для парсинга или формате хранения в двоичных файлах. Хотя даже если бы речь шла именно об этом, весь код для исправления все равно сосредоточен в календаре, а не в строках или местах, где используются строки. Поясните, что вы имели в виду.

Цитата(NotGonnaGetUs @  17.5.2006, 16:40)
Кому навязывает структурный подход? Мне нет. Вам?
"во всех GUI-фреймворках". В Swing компонент получает те события на которые он подписался. Никакой анализ контейнер не выполняет.

Мне, вам, всем остальным. Про Swing уж не рассказывайте - там этого навалом. Загляните в исходники java.awt.Container. Попробуйте переопределить processEvent() компонента и получить хоть одно событие, не разрешенное в eventMask.

Цитата(NotGonnaGetUs @  17.5.2006, 16:40)
"По объектной идеологии компонент просто должен". Вы пытаетесь описать chain of responsibility. Данный подход с большим натягом применим к GUI. AWT хорошо показало недостататки такого решения. 
Возможно оно делает логику контейнера более простой, но чертовски усложняет налаживание взаимодействия между _большим_ количеством компонент.

Если вам так удобнее (chain of responsibility) - да. Это естественный шаблон для тех случаев, когда нельзя "залезть" в поля другого класса. И, кстати, почему вы считаете его малоприменимым для GUI?

AWT показал недостатки такого метода кому? Вам? И что же, вы перестали использовать Swing?

Цитата(NotGonnaGetUs @  17.5.2006, 16:40)
Вы вообще представляете какая цель приследовалась при создании спецификации на java beans? Или для вас java bean это просто "класс данных"?

А это-то вы мне зачем говорите? Или мне нужно в двадцатый, тридцатый, сотый раз повторить, что я и не думаю осуждать этот подход? Он просто является сомнительным, бедовым с позиций ООП. Вы сразу скажите, сколько раз мне следует написать эту мантру, я копипастом для вас постараюсь набросать.

Цитата(NotGonnaGetUs @  17.5.2006, 16:40)
Без javabeans не было бы визуальных конструкторов gui для кастомных компонент, о чём так сильно мечатли в конце 90х.

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

Цитата(NotGonnaGetUs @  17.5.2006, 16:40)
Мы? Я не даю такого права.

А кто у вас спрашивает? Расскажите, как вы управитесь с распределением прав на примере JFrame.getState() или JFrame.getExtendedState(). Или на примере отображения размера ящиков в апельсинах.

Цитата(NotGonnaGetUs @  17.5.2006, 16:40)
Способов заставить человека правильно "понимать" два и оба не совершенны.
Первый, описать правильное понимание в javaDoc'e к классу. (Всегда найдётся тот, кто не станет ничего читать, т.к. он уже "перестал учиться" и ему теперь всё можно).
Второй, ввести в код как можно больше проверок и бить по руками за "неверное" использование. (Реализуемо только для тривиальных случаев, н-р, проверок диапазонов значений, asserts).

Истинно не совершенны. Для JavaDoc нужно иметь время со стороны автора, и желание его читать со стороны пользователя. А ввести проверки не получится - свойство получено пользователем объекта, проанализировано, на основании анализа созданы некие классы, вызваны некие методы. Где и что проверять?

Цитата(NotGonnaGetUs @  17.5.2006, 16:40)
Все три ваши пункта относятся в равной степени к любым методам класса, а не только getter/setter

Только в том случае, когда кто-то эти методы не очень хорошо продумал. Но в случае с getter+setter - всегда.

Цитата(NotGonnaGetUs @  17.5.2006, 16:40)
Java bean не всегда плохой дизайн, плохой дизайн не всегда java bean.
Вам знакомо понятие data transfer object? 

Наличие setter'ов и getter'ов (в том или ином виде) неизбежно в классах со сложной процедурой инициализации.
Шаблоны factory, builder, inversion of control бессмысленно называть "процедурными извращениями", они неотъемлемая часть мира объектов.

Злосчастный JFrame, которому вы запрещаете иметь get/set Title, ещё один пример, когда объект не должен управлять своим аттрибутом.
Он должен отобразить title в нужном месте окна, но он не может знать какое у него должно быть значение. 

Вы держите в голове тривиальный пример data object'a (попались на этом что ли?) и развиваете целую концепцию о пагубности getter/setter, прибегая при этом к сомнительной терминологии. Это не серьёзно.

Еще и еще раз обдумайте мой вопрос о послания для вас, состоящего из мантр "... я не собираюсь осуждать существующие подходы...". 

Про JFrame. Не нравится слово "управлять" - хорошо, пусть будет "распоряжаться". Титул JFrame может инициалиироваться из чего угодно и сколько угодно раз. Я не говорил, что нужно вообще выкорчевать оттуда этот атрибут. Достаточно удалить метод getTitle().

Не нравится терминология - предложите свою. Обсудим.
И снова напоминаю о мантрах: "я говорю о пагубности только в отношении ООП". Укажите нужное число повторений.

Цитата(NotGonnaGetUs @  17.5.2006, 16:40)
Модель классов никогда не является моделью объектов реального мира. 
Кстати, вы не считаете случайно геометричекие объекты объектами реального мира? )

Этот вопрос не по адресу - спросите у Domestic Cat.

Цитата(NotGonnaGetUs @  17.5.2006, 16:40)
Прицип подстановки говорит: B is-a A если в любой программе A можно заменить на B и программа будет работать точно также.

Спасибо за более простую формулировку. 

Цитата(NotGonnaGetUs @  17.5.2006, 16:40)
Определите операции над классами Point, Size и Square  и тогда можно будет судить о том, правомерно наследование или нет.

Т.к. вы этого не сделали, мы вправе предположить наиболее очевидное использование для этих классов - моделирование геометрических объектов.

Наиболее очевидное использвание, говорите? Наиболее очевидным было бы решить, что Point содержит пару полей для координат, а Size - поле для размера. Этого достаточно. Наиболее очевидным было бы сказать: "не обязательно этот вариант наследования является верным на все случаи жизни; определите атрибуты и операции, тогда можно будет судить о правомерности наследования". 
НО.
Я только множество раз прочитал различные вариации на тему своей неправоты, но ни разу - попытку оценить эту связку, исходя из наиболее очевидной структуры или попытку уточнить эту самую структуру. Единственное, чего удалось добиться - точка не есть квадрат по букве геометрии, жизненным реалиям и потому, что "я туда такой метод/поле добавлю, что точно сломается". Так что вас можно поздравить - хоть и со второго поста, но вы первым пришли к дельной мысли. Определяем операции:
  • Point(int x, int y) - void move(int deltaX, int deltaY)
  • Size(int value) - void grow(int delta)
  • Square

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


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Domestic Cat
Дата 18.5.2006, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 4
Всего: 172



Цитата(w1nd @  17.5.2006,  17:38 Найти цитируемый пост)
Единственное, чего удалось добиться - точка не есть квадрат по букве геометрии, жизненным реалиям и потому, что "я туда такой метод/поле добавлю, что точно сломается". Так что вас можно поздравить - хоть и со второго поста, но вы первым пришли к дельной мысли. Определяем операции:    * Point(int x, int y) - void move(int deltaX, int deltaY)
    * Size(int value) - void grow(int delta)
    * Square
А вот для вычисления расстояний между объектами и точкой данная модель никак не подойдет из-за необходимости наделить класс Point несвойственным ему методом для поиска координаты, ближайшей к заданной.  

Уважаемый, стандартные операции, которые вы здесь преподносите как откровение - не есть стандартные если мы рассматриваем эти объекты как геометрические. Посмотрите хотя бы на класс Point в Java2D.
Здесь подойдет, тут не подойдет... Извините, но подойдет всегда если не наследовать квадрат от Point. Это не очевидно? Какие свойственно - несвойственно? В геометрии квадрат нельзя заменить словом точка, отсюда и следует что у точки есть методы, несвойственные квадрату и наоборот... "Дельная мысль". 

Цитата(w1nd @  17.5.2006,  17:38 Найти цитируемый пост)
А вот для вычисления расстояний между объектами и точкой данная модель никак не подойдет из-за необходимости наделить класс Point несвойственным ему методом для поиска координаты, ближайшей к заданной.  

 smile Программный продукт в 100% случаев меняется в процессе разработки и саппорта, мало того, к меняются функциональные требования. Потому такой подход неприменим, тк вы не знаете какие требования к вам предъявят завтра. Потому это и не есть ООП - покажите хоть одну солидную книгу где проповедуется подобный подход...  


--------------------

PM   Вверх
NotGonnaGetUs
Дата 18.5.2006, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 25.2.2005
Где: Москва

Репутация: 8
Всего: 12



Цитата(w1nd)

Но, наверное, есть разница между типом, определенным в некоторой библиотеке и стандартным типом? Или двумя библиотечными типами и тремя (или более)? Чем больше свойств - тем больше типов, которые доступны пользователю и должны поддерживаться. А ведь свойства эти при подходе "объект сам управляет своими данными" (см. ниже новой термин (в каком ниже?))просто не нужны.
...
Поясните, что вы имели в виду.


Тип String самый что не на есть стандартный.
Давайте все return value первратим в объекты типа String  содержащие "нужным" образом отформатированные данные.

Можно обойтись одним единственным типом на все случаи жизни!

Замечаете разницу? Дело не в количестве типов и их принадлежности к стандартным библиотекам, а в том какая им отведена роль в приложении.


Цитата(w1nd)

Про Swing уж не рассказывайте - там этого навалом. Загляните в исходники java.awt.Container. 

Имя пакета java.awt ни на какие мысли не наводит?

Цитата(w1nd)

AWT показал недостатки такого метода кому? Вам? И что же, вы перестали использовать Swing?

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


Цитата(w1nd)

А это-то вы мне зачем говорите? Или мне нужно в двадцатый, тридцатый, сотый раз повторить, что я и не думаю осуждать этот подход? Он просто является сомнительным, бедовым с позиций ООП. Вы сразу скажите, сколько раз мне следует написать эту мантру, я копипастом для вас постараюсь набросать.
...
Еще и еще раз обдумайте мой вопрос о послания для вас, состоящего из мантр "... я не собираюсь осуждать существующие подходы...". 

Затем, что вы пишите такие вещи, как те, что я выделил болдом.
Что вы собираетесь или не собираетесь делать меня занимает мало.

В java beans нет ничего бредового с позиций ООП. 

Рекомендую познакомиться со спецификациями, задачами и инструментами для их решения живущими вокруг java beans.
http://java.sun.com/products/javabeans/index.jsp

Мантра для медитации: "data object != javabeans".
Повторять до просветления.

Цитата(w1nd)

А кто у вас спрашивает? Расскажите, как вы управитесь с распределением прав на примере JFrame.getState() или JFrame.getExtendedState(). Или на примере отображения размера ящиков в апельсинах.

А ввести проверки не получится - свойство получено пользователем объекта, проанализировано, на основании анализа созданы некие классы, вызваны некие методы. Где и что проверять?

С каким "распределением прав", ещё один "новый термин"? 
Повторяю медленно, по буквам.
_Любой_ метод можно использовать не верно. Ничего нового в эту проблему геттеры и сеттеры не вносят.
Медитировать на класс String.

Цитата(w1nd)

Спасибо за более простую формулировку. 

Мне очень интересно было бы узнать, с каких позиций вы рассуждаете об ООП, если вам не знакомы основополагающие понятия связанные с оо-методом?

Цитата(w1nd)

Наиболее очевидное использвание, говорите? Наиболее очевидным было бы решить, что Point содержит пару полей для координат, а Size - поле для размера. Этого достаточно. Наиболее очевидным было бы сказать: "не обязательно этот вариант наследования является верным на все случаи жизни; определите атрибуты и операции, тогда можно будет судить о правомерности наследования". 
НО.
Я только множество раз прочитал различные вариации на тему своей неправоты, но ни разу - попытку оценить эту связку, исходя из наиболее очевидной структуры или попытку уточнить эту самую структуру. Единственное, чего удалось добиться - точка не есть квадрат по букве геометрии, жизненным реалиям и потому, что "я туда такой метод/поле добавлю, что точно сломается". Так что вас можно поздравить - хоть и со второго поста, но вы первым пришли к дельной мысли. Определяем операции:
Point(int x, int y) - void move(int deltaX, int deltaY)
Size(int value) - void grow(int delta)
Square

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

Ангел мой, что же вы такое говорите? 

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

Для вас не большое пояснение.

При функциональная декомпозиции задача разбивается на подзадачи. Если подзадача оказалась недостаточно проста, процесс разбиения продолжается.
Такой подход безусловно приводит к главное цели - решению конкретной задачи, но при этом есть два существенных недостатка.
Множесто методов созданных для решения задачи _зависит от способа разбиения задачи на подзадачи_, порядок вызвов методов строго регламентирован.
Как следствие, решая родственную задачу, мы не можем использовать уже существующий код. 

Как избежать этих проблем? Поставить данные на первое место.
Почему это работает? Потому что данные изменяются _существенно_ реже, чем поведение.
Класс выступает в качестве новой единицы декомпозиции. 
В "принципах ООП" содержатся рекомендации (не догмы), как лучше выделять классы.

Что же получается у вас?

Невинное требование приводит к необходимости изменять или даже создавать параллельно новую иерархию классов, хотя данные не изменились: точка осталась точкой, квадрат - квадратом.
Почему? Да потому, что ваши ОО-познания всего лишь набор слов, а на практике всё таже функциональная декомпозиция и наличие у JFrame #getTitle и #setTitle в качестве оправдания.

Кстати, вернёмся к тому, о чём я говорил в первом сообщении.

Решить задачу вычисления расстояния между двумя объектами согласно вашей (новаторской) трактовке ООП нельзя вовсе, чтобы не скатиться к "процедурному коду" (с)w1nd.
Нельзя из-за того, что для решения этой задачи недостаточно информации ни у одного из объектов - они _должны_ взаимодействовать, а это приводит к необходимости выставить наружу данные, которые будут "получены пользователем объекта, проанализированы, на основании анализа будут созданы некие классы" (с)w1nd.   

Это сообщение отредактировал(а) NotGonnaGetUs - 18.5.2006, 14:39
PM MAIL   Вверх
w1nd
Дата 18.5.2006, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата(NotGonnaGetUs @  18.5.2006, 14:36)
Имя пакета java.awt ни на какие мысли не наводит? <...>
И мне в том числе.  AWT уже никто не пользуется добрую сотню лет, пользуются Swing. Судя по последнему вашему вопросу вы не понимаете разницы между AWT и Swing и принятыми в них моделями обработки событий.

А вас не смущает тот факт, что компоненты Swing - всё те же компоненты AWT? Никто не пользуется smile  Большая часть событий, поступающих Swing'овым компонентам - события AWT, очередь событий AWT никуда не делась. И способы взаимодействия компонент со времен AWT не изменились и вряд ли изменятся. 

Цитата(NotGonnaGetUs @  18.5.2006, 14:36)
каким "распределением прав", ещё один "новый термин"? 
Повторяю медленно, по буквам.
_Любой_ метод можно использовать не верно. <...>
если вам не знакомы основополагающие понятия связанные с оо-методом

Можно еще ошибаться в названии методов. Правда, компилятор не поймет.

Модератор: Оставляю, чтобы все видели. Будете переходить на личности - будет бан.
Термин? С какой высоты падали? 
Какие понятия? Чьи термины? Не надо выдавать чьи-то формулировки за "общепринятые".  Вы читаете или просто текст распознаёте?

Цитата(NotGonnaGetUs @  18.5.2006, 14:36)
Решить задачу вычисления расстояния между двумя объектами согласно вашей (новаторской) трактовке ООП нельзя вовсе, чтобы не скатиться к "процедурному коду" (с)w1nd.
Нельзя из-за того, что для решения этой задачи недостаточно информации ни у одного из объектов - они _должны_ взаимодействовать, а это приводит к необходимости выставить наружу данные, которые будут "получены пользователем объекта, проанализированы, на основании анализа будут созданы некие классы" (с)w1nd.

Легко и непринужденно. Ни в чем не отступая от ООП. Да, кстати, укажите слова "процедурному коду", если найдёте. Вы просто НЕ ЧИТАЕТЕ того, что я пишу: "приводит к необходимости выставить наружу данные" smile 

Да, не утруждайтесь мне разъяснять, что есть ООП, JavaBeans, шаблоны, хороший тон в проектировании. Ваши усилия пропадают зря: вы не сообщите мне ничего нового или интересного, а ваше понимание этих вопросов - это только ваше понимание.

Цитата
В java beans нет ничего бредового с позиций ООП. 

"Бедового". Свойства в JavaBeans противоречат ООП.

    

Это сообщение отредактировал(а) w1nd - 18.5.2006, 20:57


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Domestic Cat
Дата 18.5.2006, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 4
Всего: 172



Цитата(w1nd @  18.5.2006,  11:40 Найти цитируемый пост)
Да, не утруждайте мне разъяснять, что есть ООП, JavaBeans, шаблоны, хороший тон в проектировании. Ваши усилия пропадают зря: вы не сообщите мне ничего нового или интересного, а ваше понимание этих вопросов - это только ваше понимание.

smile 

Не могу понять, почему вы в этом так уверены. Ну говорилось бы в учебниках по ооп что мол проперти плохо, но нужно идти на компромисс... Ну хоть бы на своем богатом опыте вы заработали подобное знание, чтобы можно было сказать - вот примеры моих ООП приложений, их объектная модель гораздо лучше того, что пишете вы... Но ведь ни то ни другое.

 


--------------------

PM   Вверх
Void
Дата 18.5.2006, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 11
Всего: 173



Цитата(w1nd @  18.5.2006,  22:40 Найти цитируемый пост)
Не надо выдавать чьи-то формулировки за "общепринятые"

Цитата(w1nd @  18.5.2006,  22:40 Найти цитируемый пост)
Да, не утруждайтесь мне разъяснять, что есть ООП, JavaBeans, шаблоны, хороший тон в проектировании. Ваши усилия пропадают зря: вы не сообщите мне ничего нового или интересного, а ваше понимание этих вопросов - это только ваше понимание.

Тем не менее вы в данный момент пытаетесь выдать свои формулировки за абсолютную истину. Если нет, то я не понимаю вообще смысла этого спора.
Цитата(w1nd @  18.5.2006,  22:40 Найти цитируемый пост)
Цитата(NotGonnaGetUs @  18.5.2006, 14:36)
Решить задачу вычисления расстояния между двумя объектами согласно вашей (новаторской) трактовке ООП нельзя вовсе, чтобы не скатиться к "процедурному коду" <…>

Легко и непринужденно. Ни в чем не отступая от ООП.

Ждем с нетерпением. 


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Irokez
Дата 18.5.2006, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


индеец
***


Профиль
Группа: Участник Клуба
Сообщений: 1180
Регистрация: 20.10.2004

Репутация: нет
Всего: 53



Цитата(w1nd @  17.5.2006,  16:38 Найти цитируемый пост)
Реальные проекты целиком на ООП - никогда.

я бы уже после этого закрыл спор smile  
PM   Вверх
skyboy
Дата 18.5.2006, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 1
Всего: 260



Асилил  smile Особо улыбнуло следующее: квадрат - суть точка, точка имеет размер(Si!), а квадрат имеет координаты(впервые слышу, честно говоря... координаты имеет каждая из вершин квадарта, но не квадрат в целом). Конечно, это мелочи на фоне развёрнутых боевых действий  smile Так и не понял, в чём же свойства виноваты? Как уже было замечено(вполне справедливо) свойства, в отличии от публичных полей, просто замаскированный синтаксисом вызов методов - где тут нарушение инкапсуляции? 
PM MAIL   Вверх
w1nd
Дата 18.5.2006, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата
Тем не менее вы в данный момент пытаетесь выдать свои формулировки за абсолютную истину. Если нет, то я не понимаю вообще смысла этого спора.

Господин NotGonnaGetUs имел смелость предположить, что незнание мною известной ему формулировки говорит о моем незнании формулируемого.  

Цитата
Ждем с нетерпением. 


Код

Point {
    public int x, y;
}

Polygon {
    private Point coord;
    public int distance(Point p);
    public int distance(Polygon p);
    protected Point findNearestPointFor(Point p);
}


Этого хватит. Да, если вы мне захотите сказать, что я сам был против возврата данных (как NotGonnaGetUs) - перечитайте мои посты.

Добавлено @ 00:05 
Цитата(skyboy @ 18.5.2006,  23:16)
Как уже было замечено(вполне справедливо) свойства, в отличии от публичных полей, просто замаскированный синтаксисом вызов методов - где тут нарушение инкапсуляции?

Как уже было замечено (вполне справедливо), свойства, в отличие от обычных публичных полей, просто замаскированы парой методов. Но при этом остаются публичными полями.   

Это сообщение отредактировал(а) w1nd - 19.5.2006, 08:46


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
DeadSoul
Дата 19.5.2006, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

Репутация: нет
Всего: 11



Цитата(w1nd @  11.5.2006,  19:02 Найти цитируемый пост)
Цитата
Наследование - это отношение is-a
Именно так. Но вы (как и многие) допускаете распространенную ошибку - отождествляете эти классы с объектами реального мира. Для квадрата свойственны все поля и методы координаты и размера - именно это (все поля и методы) определяет наличие отношения is-a для классов.    

Спорные аргументы приводите.

http://forum.vingrad.ru/index.php?showtopi...st&p=736064 


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
skyboy
Дата 19.5.2006, 01:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 1
Всего: 260



Цитата

Как уже было замечено (вполне справедливо), свойства, в отличие от обычных публичных полей, просто замаскированы парой методов. Но при этом остаются публичными полями.  

Я правильно понял? Вы против данных, связанных с конкретным экземплярам объекта, как таковых? Т.е. из связки код+данные просто выбрасываем вторую часть и оставляем только методы? А что же тогда методы будут обрабатывать? Скажем, для отрисовки чего-то надо будет не просто вызвать метод отрисовки, а и обьяснить, в каком месте рисовать и какого размера(ведь данные у нас в объекте не хранятся - надо передавать)? smile  
PM MAIL   Вверх
w1nd
Дата 19.5.2006, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата(skyboy @ 19.5.2006,  01:08)
Я правильно понял? Вы против данных, связанных с конкретным экземплярам объекта, как таковых? Т.е. из связки код+данные просто выбрасываем вторую часть и оставляем только методы? А что же тогда методы будут обрабатывать? Скажем, для отрисовки чего-то надо будет не просто вызвать метод отрисовки, а и обьяснить, в каком месте рисовать и какого размера(ведь данные у нас в объекте не хранятся - надо передавать)? smile

Нет, я против свободного доступа к данным объекта. 


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
DeadSoul
Дата 19.5.2006, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

Репутация: нет
Всего: 11



w1nd, умница. 


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
Exception
Дата 20.5.2006, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 2
Всего: 186



Я бы сейчас с большой радостью поделился своими ошибками.. Как раз вроде наследования компании от контакта. И к чему это привело. Но ведь Вам всё равно плевать на других, лишь бы Вашу идею никто не смог оспорить. Да ну, с Вами неинтересно. Очень напоминает тема вот что:
http://forum.vingrad.ru/index.php?showtopi...44&view=all
Особенно мне нравится последний пост - "Усекли?". Видимо, с такой аргументацией, Ваше мышление тоже никто не "усечёт". 
PM   Вверх
w1nd
Дата 20.5.2006, 01:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата(Exception @ 20.5.2006,  00:29)
Я бы сейчас с большой радостью поделился своими ошибками.. Как раз вроде наследования компании от контакта. И к чему это привело. Но ведь Вам всё равно плевать на других, лишь бы Вашу идею никто не смог оспорить. Да ну, с Вами неинтересно. Очень напоминает тема вот что:
http://forum.vingrad.ru/index.php?showtopi...44&view=all
Особенно мне нравится последний пост - "Усекли?". Видимо, с такой аргументацией, Ваше мышление тоже никто не "усечёт".

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

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


   

Это сообщение отредактировал(а) w1nd - 20.5.2006, 01:15


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
skyboy
Дата 20.5.2006, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 1
Всего: 260



w1nd, против свободного доступа к данным методам самого же объекта?! А кто ж их тогда будет обрабатывать?  smile  
PM MAIL   Вверх
Exception
Дата 20.5.2006, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 2
Всего: 186



ОК.
Код
class Point
{
public int X;
public int Y;
void Draw(StatusBar sb)
}
class Rectangle : Point
{
public Point[] Points;
overrides void Draw(StatusBar sb);
}
/****/
Point p = new Point()
p.X = 5;
p.Y = 5;
p.Draw(myStatusBar);
p = new Rectangle() // у Вас такое вполне нормально?
p.Draw(myStatusBar); // вместо прямоугольника рисуется точка

Такое поведение нельзя назвать нормальным. 
PM   Вверх
NotGonnaGetUs
  Дата 20.5.2006, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 25.2.2005
Где: Москва

Репутация: 8
Всего: 12



Цитата(w1nd)

А вас не смущает тот факт, что компоненты Swing - всё те же компоненты AWT? Никто не пользуется   Большая часть событий, поступающих Swing'овым компонентам - события AWT, очередь событий AWT никуда не делась. И способы взаимодействия компонент со времен AWT не изменились и вряд ли изменятся. 


Компоненты awt и компоненты swing находятся в различных иерархиях наследовния. 
Попробуйте, смеха ради, смешать те и другие компоненты.

Очередь событий не имеет никакого отношения к моделям обработки событий. 

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

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

-----

Цитата(w1nd)

Термин? С какой высоты падали? 
Какие понятия? Чьи термины? Не надо выдавать чьи-то формулировки за "общепринятые".  Вы читаете или просто текст распознаёте?


Хотелось бы читать, но приходится распознавать:

"объект сам управляет своими данными" (см. ниже новой термин)"  - так и не увидел, где это ниже...

"как вы управитесь с распределением прав на примере JFrame.getState() или JFrame.getExtendedState()."  -  прав на что и между кем их нужно распределять?

Насчёт чьих-то формулировок это круто smile Оказывается "принцип подстановки Лисков" придумал я. Хочу премию за это.

Кстати о терминах:
Цитата(w1nd)

З. Ы. У любого геометрического объекта, между прочим, есть центр, а у точки отсутствует размер, поэтому любой объект - суть точка. 

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

У любого многоугольника (являющегося геометрическим объектом), который нельзя вписать в окружность, не будет "центра". 

Цитата(w1nd)

Согласиться с чем? Что чепуха?  Еще раз, на пальцах: есть некий объект, есть его проекция на плоскость, которая полностью умещается в одну ячейку координатной сетки плоскости (объект находится очень далеко от плоскости), т. е. проекция данного объекта вырождена в точку.

Проекция не зависит от расстояния до плоскости. (с) учебник геометрии

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

-----

Цитата(w1nd)

Цитата(NGGU)

Решить задачу вычисления расстояния между двумя объектами согласно вашей (новаторской) трактовке ООП нельзя вовсе, чтобы не скатиться к "процедурному коду" (с)w1nd.

Нельзя из-за того, что для решения этой задачи недостаточно информации ни у одного из объектов - они _должны_ взаимодействовать, а это приводит к необходимости выставить наружу данные, которые будут "получены пользователем объекта, проанализированы, на основании анализа будут созданы некие классы" (с)w1nd.


Да, кстати, укажите слова "процедурному коду", если найдёте. 


Я всегда полагал (со ссылкой на работы классиков "поднявшихся вверх по служебной лестнице" smile),  что "структурный" это значит без использования операторов перехода (goto), а "процедурный" это когда есть процедуры/функции.

Вы творчески переосмыслили эти термины:
Цитата(w1nd)

Поэтому в структурно-ориентированной среде я практикую структурный подход. А в процедурно-орентированной ни за что не буду внедрять объекты.  
...
свойство навязывает структурный подход к взаимодействию с объектом: получить значение свойства, произвести некоторые вычисления, результат поместить обратно или передать другому объекту. 
...
ООП практически невозможно внедрить частично в структурно-ориентированный проект. 
...
Геттеры/сеттеры - это как раз нарушение инкапсуляции (замаскированный прием структурного программирования). 


У вас противопоставляются "структурно-ориентированный" и "процедурно-орентированный" "подходы" между собой и с ООП.

Понять с каких позиций вы противопоставляете С-О и П-О, я так и не смог.
Разницу между ПО и ООП я вижу только в способе декомпозиции, о чём писал выше. 
"не ООП", как я представляю, это "процедурный код с объектами": процедуры помещённые случайным образом в классы (стиль C-шников насильно пересаженных на C++)...

Поскольку getter/setter (доступ к данным) по вашим словам "бредовое ООП", что равнозначно "не ООП", то получаем что получаем: вам придётся писать "процедурный код".

Ах, да. Доступ к данным (c позиций "ООП"): 
Цитата(w1nd)

Да, если вы мне захотите сказать, что я сам был против возврата данных (как NotGonnaGetUs) - перечитайте мои посты.

Перечитал одно:
Цитата(w1nd)

 Мы можем послать объекту сообщение (вызвать метод): "сделай что-то", но никогда не можем запросить у объекта данные.   

другое:
Цитата(w1nd)

Цитата(w1nd)

Доступ к данным должен быть невозможен. 
Цитата(???)

Кто это сказал? 


Вообще-то это имеет какое-то отношение к инкапсуляции, и говорят об этом все авторы, пишущие об ООП. 

третье:
Цитата(w1nd)

Цитата(???)

В чем принципиальная разница между мессагами "верни мне массив твоих координат" и "верни мне твою площадь"? 

Да ни в чем. Ни то, ни другое не нужно. От объекта нужен только функционал. Для чего его координаты или площадь? Где-нибудь нарисовать? Это сделает сам объект

четвёртое:
Цитата(w1nd)

Цитата(???)

Почему тогда объект не может сообщить свой размер? Я не понимаю! .

Я не считаю это верным или неверным. Просто это будет нарушением принципов ООП.  


----

Цитата(w1nd)

Само существование методов вроде DrawPoint или CreatePolygon полностью противоречит принципам ООП. Только сам объект может себя рисовать или создавать.


Во первых _объект_ сам себя создать в приципе не может. Объект всегда создаётся кем-то, посредством вызова конструктора.
Существуют ситуации, когда создатель объекта не может (не известно на момент написания кода) или не должен (из соображений инкапсуляции) знать объект какого класса он создаёт. Решения подобных проблем задокументированы в виде паттернов ООП.
Выходит паттерны ООП полностью "противоречат приципам ООП"?! 

----
Цитата(w1nd)

Код

Point {
    public int x, y;
}

Polygon {
    private Point coord;
    public int distance(Point p);
    public int distance(Polygon p);
    protected Point findNearestPointFor(Point p);
}


Вы уже не считаете, что наследование от точки это хорошая идея, гуд, но, О УЖАС(!),  у класса Point публичные поля! Это же "структурное программирование"(с)w1nd!

А как же утверждение: 

Цитата(w1nd)

С собственными атрибутами может работать только сам объект. Если некоему объекту X требуются данные квадрата, единственный путь - реализовать в квадрате обработчик сообщения (метод), который передаст эти данные объекту X.


Согласно ему должно быть написано такое:

Код

Point {
     private  int x, y;
     public void plsGiveMeXAndY(Polygon p);
}

Polygon {
    private Point coord;
    public int distance(Point p);
    public int distance(Polygon p);
    protected Point findNearestPointFor(Point p);

    public void setXAndY(int x, int y);
}


Нет! Не то. setXAndY() может вызвать кто угодно! Надо сделать интерфейс!

Код


Interface PointConsumer {
    void setData(int x, int y);
}

Point {
     private  int x, y;
     public void plsGiveMeXAndY(PointConsumer c);
}

Polygon {
    private class Consumer implements PointConsumer {
            void setData(int x, int y){
                   setXAndY(x, y);
            }
 
    }
    private Point coord;
    public int distance(Point p) {
          ...
          p.plsGiveMeXAndY(new Consumer());
          ...
    } 
    public int distance(Polygon p);
    protected Point findNearestPointFor(Point p);

    private void setXAndY(int x, int y);
}


Чёрт, а как же получить x и у  из метода setXAndY в методе вызвавшем plsGiveMeXAndY?
Сделать поля? А если нужно будет у разных точек узнать x и у? Значит нужны локальные переменные для хранения !
Хм. А этого добиться?  Сделаем MutableInteger!

Код

class MutableInteger {
      private int value;
      public void setValue(int value) {
          this.value = value;
      }
      public int getValue() {
          return value;
     }
}

Interface PointConsumer {
    void setData(int x, int y);
}

Point {
     private  int x, y;
     public void plsGiveMeXAndY(PointConsumer c);
}

Polygon {
    private class Consumer implements PointConsumer {
            private Mutable x,y;
            public Consumer(MutableInteger x, MutableInteger y){
                   this.x = x;
                   this.y = y;
            }
            void setData(int x, int y){
                   this.x.setValue(x);
                   this.y.setValue(y);
            }
    }
    private Point coord;
    public int distance(Point p) {
          ...
          MutableInteger x = new MutableInteger();
          MutableInteger y = new MutableInteger();
          p.plsGiveMeXAndY(new Consumer(x,y));
          
          ...
    } 
    public int distance(Polygon p);
    protected Point findNearestPointFor(Point p);
}


Так, уже лучше..., но что-то не даёт покоя... Ах, да! У MutableInteger есть getter/setter smile

Кажется мне, как и w1nd'у, не удалось написать правильную по w1nd ОО программу, не скатившись к структурному/процедруному/плохому ооп (нужное подчеркнуть) smile
   

Это сообщение отредактировал(а) NotGonnaGetUs - 20.5.2006, 15:32
PM MAIL   Вверх
LSD
Дата 20.5.2006, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 9
Всего: 538



Цитата(NotGonnaGetUs @  20.5.2006,  16:12 Найти цитируемый пост)
У любого многоугольника (являющегося геометрическим объектом), который нельзя вписать в окружность, не будет "центра".

Ромб не всегда можно вписать в окружность, но тем не менее центр у него есть. Другое дело что не для всякой геометрической фигуры можно дать определение центра. 


--------------------
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.
PM MAIL WWW   Вверх
NotGonnaGetUs
Дата 20.5.2006, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 25.2.2005
Где: Москва

Репутация: 8
Всего: 12



Цитата(LSD)

Ромб не всегда можно вписать в окружность, но тем не менее центр у него есть. Другое дело что не для всякой геометрической фигуры можно дать определение центра.  

Автор привёл определение "центра", как равноудалённой точки от вершин многоугольника. У робма такой точки нет.

 
PM MAIL   Вверх
chipset
Дата 20.5.2006, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 4
Всего: 164



Цитата(NotGonnaGetUs @  20.5.2006,  08:11 Найти цитируемый пост)
У робма такой точки нет.

У большинства геом. фигур нету такой точки smile 


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
w1nd
Дата 20.5.2006, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата(NotGonnaGetUs @  20.5.2006, 15:12)
Компоненты awt и компоненты swing находятся в различных иерархиях наследовния. 

Очередь событий не имеет никакого отношения к моделям обработки событий. 

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

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

Во-первых, это не совсем так (про иерархию) - вспомните окна, посмотрите, что переопределяет JComponent. В-вторых, очередь событий как раз имеет отношение к тому, куда и как попадает событие. В-третьих, см. java.awt.Component.enableEvents(). В четвертых, на всё, что касается диспетчеризации событий ввода, компоненты Swing никак не влияют. 

Цитата(NotGonnaGetUs @  20.5.2006, 15:12)
"объект сам управляет своими данными" (см. ниже новой термин)"  - так и не увидел, где это ниже...

"Распоряжается".

Цитата(NotGonnaGetUs @  20.5.2006, 15:12)
"как вы управитесь с распределением прав на примере JFrame.getState() или JFrame.getExtendedState()."  -  прав на что и между кем их нужно распределять?

Это к тому, что число, возвращаемое этими методами, пользователь JFrame может интерпретировать как угодно.

Цитата(NotGonnaGetUs @  20.5.2006, 15:12)
Насчёт чьих-то формулировок это круто  Оказывается "принцип подстановки Лисков" придумал я.

Я такого (что вы что-то придумали) не говорил. Я говорил о том, что используемые вами термины не могут быть общеизвестными.

Цитата
У любого многоугольника (являющегося геометрическим объектом), который нельзя вписать в окружность, не будет "центра".

Геометрическим центром любой выпуклой фигуры является точка, равноудаленная от её вершин.

Цитата
Проекция не зависит от расстояния до плоскости.

Только в случае с параллельной проекцией.

Цитата(NotGonnaGetUs @  20.5.2006, 15:12)
Ах, да. Доступ к данным (c позиций "ООП")

К данным объекта. К членам-данным объекта. Речь все время шла только об этом.

Цитата(NotGonnaGetUs @  20.5.2006, 15:12)
Во первых _объект_ сам себя создать в приципе не может. Объект всегда создаётся кем-то, посредством вызова конструктора.


Я имел в виду, что в случае с точно определенным типом фигур было бы неверным делать метод, который создаст нужную фигуру в зависимости от числа переданных в параметрах вершин. Согласен, это к ООП или не-ООП не имеет отношения. Но в случае с методом Draw, рисующим объект - имеет место нарушение инкапсуляции, если только этот метод не вызывает соответствующий метод объекта.

Цитата(NotGonnaGetUs @  20.5.2006, 15:12)
Вы уже не считаете, что наследование от точки это хорошая идея, гуд, но, О УЖАС(!),  у класса Point публичные поля! Это же "структурное программирование"(с)w1nd!

Point в данном случае не является классом. Это комплексный тип, в одном ряду с примитивными. 

Цитата(NotGonnaGetUs @  20.5.2006, 15:12)
Вы творчески переосмыслили эти термины

Возможно, я действительно не прав, используя понимание этих терминах некоторыми "классиками". В будущем их использовать не буду.

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

Добавлено @ 18:52 
Про центр объекта: 
  • В примере нет ромба.
  • Я дважды давал определение геометрического центра, там явно сказано о выпуклости многоугольника.
Добавлено @ 19:02 
Цитата(Exception @ 20.5.2006,  12:19)
ОК.
Код
class Point
{
public int X;
public int Y;
void Draw(StatusBar sb)
}
class Rectangle : Point
{
public Point[] Points;
overrides void Draw(StatusBar sb);
}
/****/
Point p = new Point()
p.X = 5;
p.Y = 5;
p.Draw(myStatusBar);
p = new Rectangle() // у Вас такое вполне нормально?
p.Draw(myStatusBar); // вместо прямоугольника рисуется точка

Такое поведение нельзя назвать нормальным.

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

Это сообщение отредактировал(а) w1nd - 20.5.2006, 19:03


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Void
Дата 20.5.2006, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 11
Всего: 173



Цитата(w1nd @  20.5.2006,  20:49 Найти цитируемый пост)
С примера о квадрате и точке - используя принцип Лисков, покажите, что такое наследование неправомерно всегда, вне зависимости от применения

Здесь кто-то уже высказал ключевой момент, что говорить о нарушении LSP имеет смысл только в рамках контракта, который предоставляет пользователям базовый класс, его спецификаций. То есть вне зависимости от применения ничего конкретно сказать нельзя. Я могу представить ситуацию, когда наследование квадрата от точки будет оправданно (и это тоже уже кто-то говорил).
Но решение о наследовании принимается не на основании свойственности данных одного класса другому. DeadSoul привел хороший пример. 


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
w1nd
Дата 20.5.2006, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата(Void @ 20.5.2006,  20:29)
Здесь кто-то уже высказал ключевой момент, что говорить о нарушении LSP имеет смысл только в рамках контракта, который предоставляет пользователям базовый класс, его спецификаций. То есть вне зависимости от применения ничего конкретно сказать нельзя. Я могу представить ситуацию, когда наследование квадрата от точки будет оправданно (и это тоже уже кто-то говорил).

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

Цитата(Void @ 20.5.2006,  20:29)
Но решение о наследовании принимается не на основании свойственности данных одного класса другому. DeadSoul привел хороший пример.

В примере, приведенном DeadSoul также говорится о том, что целесообразность модели зависит от применения. И решение о наследовании чего-либо из чего-либо принимается как раз в зависимости от контекста.   

Это сообщение отредактировал(а) w1nd - 20.5.2006, 21:07


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Domestic Cat
Дата 20.5.2006, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 4
Всего: 172



Цитата(w1nd @  20.5.2006,  12:06 Найти цитируемый пост)
В примере, приведенном DeadSoul также говорится о том, что целесообразность модели зависит от применения. И решение о наследовании чего-либо из чего-либо принимается как раз в зависимости от контекста.   

Цитата(w1nd @  20.5.2006,  12:06 Найти цитируемый пост)
В том-то и дело, что меня хотят убедить, что такого (с квадратом) не может быть, потому что не может быть никогда.


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


--------------------

PM   Вверх
w1nd
Дата 20.5.2006, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата(Domestic Cat @ 20.5.2006,  21:38)
Гы, это ж и я говорил. Только вот вы невнимательно читаете оппонентов. Речь ведь (напомню раз в пятый) идет о геометрии, а не о чем-то еще, и именно вы пытаетесь убедить на геометрическом примере что наследовать от точки можно. Кстати, вы уже забыли конкретный же пример с компаниями и контактами.

Не понял, в чем я проявил невнимательность? Я всё время подразумеваю, что речь идет о геометрических фигурах. И что с компаниями и контактами? 


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Domestic Cat
Дата 21.5.2006, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 4
Всего: 172



Цитата(w1nd @  20.5.2006,  13:25 Найти цитируемый пост)
Я всё время подразумеваю, что речь идет о геометрических фигурах.


Цитата(w1nd @  20.5.2006,  12:06 Найти цитируемый пост)
В том-то и дело, что меня хотят убедить, что такого (с квадратом) не может быть, потому что не может быть никогда.


См. стр. 1 - в данном случае наследовать квадрат от точки нельзя тк квадрат не есть точка. Какие пояснения еще нужны?   


--------------------

PM   Вверх
Exception
Дата 21.5.2006, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 2
Всего: 186




Модератор: Сообщение скрыто.

PM   Вверх
w1nd
Дата 21.5.2006, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата(Domestic Cat @  21.5.2006, 11:59)
См. стр. 1 - в данном случае наследовать квадрат от точки нельзя тк квадрат не есть точка. Какие пояснения еще нужны?

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

Это сообщение отредактировал(а) w1nd - 21.5.2006, 18:50


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Domestic Cat
Дата 21.5.2006, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 4
Всего: 172



Вы собственно чего хотели сейчас сказать? (извините тупого программера, который только и делает, что представляет себе сферических коней, в отличие от Вас - О Великий, Который Знает Истину, за непонимание, однако я действительно Вас не понял). 
Какая вам разница что я себе представляю - коня или сноповязалку?

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

Все. Ждем-с.  

  


--------------------

PM   Вверх
w1nd
Дата 21.5.2006, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата
Докажите, что квадрат есть точка в геометрии

Точка квадратом в геометрии не является. Вы, надеюсь, довольны. В той же геометрии точка на плоскости может быть проекцией квадрата.

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

Это сообщение отредактировал(а) w1nd - 21.5.2006, 22:27


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Domestic Cat
Дата 21.5.2006, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 4
Всего: 172



Цитата(w1nd @  21.5.2006,  13:22 Найти цитируемый пост)
В той же геометрии точка на плоскости может быть проекцией квадрата.

Проекцией квадрата на плоскость может быть отрезок, ромб, прямоугольник. Так что, наследовать квадрат и от этих трех классов?
Цитата(w1nd @  21.5.2006,  13:22 Найти цитируемый пост)
но есть задачи, когда она не просто уместна, но и наиболее предпочтительна.

Возможно. Приведите пример.  


--------------------

PM   Вверх
w1nd
Дата 22.5.2006, 01:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата(Domestic Cat @ 21.5.2006,  22:29)
Проекцией квадрата на плоскость может быть отрезок, ромб, прямоугольник. Так что, наследовать квадрат и от этих трех классов?

Если не требуется больше ничего, что помешало бы - почему нет? Большая модель классов только запутывает. 

Цитата(Domestic Cat @ 21.5.2006,  22:29)
Возможно. Приведите пример.

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

Это сообщение отредактировал(а) w1nd - 22.5.2006, 01:12


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
NotGonnaGetUs
Дата 22.5.2006, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 25.2.2005
Где: Москва

Репутация: 8
Всего: 12



Цитата(w1nd)
Во-первых, это не совсем так (про иерархию) - вспомните окна, ...

Не хочу окна. 

Вами было высказано следующее:

"Во-вторых, свойство навязывает структурный подход к взаимодействию с объектом: получить значение свойства, произвести некоторые вычисления, результат поместить обратно или передать другому объекту. Что происходит? Логика, свойственная объекту, вынесена из него. Например, часто повторяющийся во всех GUI-фреймворках приём с компонентом и контейнером: допустим, произошло событие, которое контейнеру необходимо передать своим компонентам. Контейнер получает свойства компонент, анализирует их (может ли компонент обработать данное событие) и передает событие на обработку. По объектной идеологии компонент просто должен получить событие. Дальше он либо его обработает (если может), либо вернет контейнеру или остальным компонентам; в этом случае нет необходимости в свойстве state компонента, а логика контейнера значительно более проста."

Мною были приведёны в пример Awt и Swing, которые показывают, что свойства ничего подобного _не навязывают_ (В Awt используется событийная модель с chain of responsibility, в Swing основанная на подписке на сообщения (кстати, swing компоненты удовлетворяют спецификациям javabeans на 100%)).

Если вы не согласны с этим утверждением - так и скажите. Сравнение AWT и Swing - это offtopic. 

-----

Цитата(w1nd)
 Это к тому, что число, возвращаемое этими методами, пользователь JFrame может интерпретировать как угодно.

offtopic, т.к не имеет отношения к свойствам.
Безусловно, вместо int лучше использовать enum (since 1.5).

-----

Цитата(w1nd)
 
Я такого (что вы что-то придумали) не говорил. Я говорил о том, что используемые вами термины не могут быть общеизвестными.


(Это была шутка...)

Могут и есть.

Да, если спросить сантехника, он не будет знать, что такое принцип подстановки Барбары Лисков, но для людей от computer science, утверждающих о владении ООП, такое не знание непростительно.

Цитата(w1nd)
 
"Геометрическим центром" любой выпуклой фигуры является точка, равноудаленная от её вершин.


Именно из этого определения и следует, что "геометрического центра" не будет у любого выпуклуго n-угольника не вписанного в окружность.

Н-р, у ромба.

Цитата(w1nd)
 
Добавлено @ 18:52 

Про центр объекта: 
* В примере нет ромба.
* Я дважды давал определение геометрического центра, там явно сказано о выпуклости многоугольника.

Не так важно, что есть в примере. 

Было высказано утверждение о том, что любой геометрический объект имеет центр. Было приведено определение, которое позволяет оперделить является ли точка "центром". Утверждение противоречит опредлению. Всё.

Робм - это выпуклый 4-х угольник. 

Обратитесь к определению "выпуклый многоугольник" в учебнике геометрии.

-----

Цитата(w1nd)
 
Point в данном случае не является классом. Это комплексный тип, в одном ряду с примитивными. 
 
Согласно вашему утверждению, любой класс с геттрами и сеттерами можно смело обзывать комплексными типом,
что звучит как анекдот.

В полностью ООП языке не может быть примитивных типов. Их существование не является украшением java.
Н-р, в Eiffel, C# и многих других языках - примитивных типов нет (не путать примитивный тип с константами).

-----

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

w1nd, я выдаю за ваши слова только то, что вы писали.

Рекомендую вас саму перечитать ещё раз этот топик. Я не поленился, сделал это уже три раза, пытаясь найти что-нибудь здравое среди ваших утверждений.
 
Вам кажется, что вы пишите одно, а вас понимаю неправильно (причём все)?
Так может быть стоит умерить эмоции и попытаться излагать свои мысли чётко и ясно?
Например, не использовать термины в значениях отличающихся от общепринятых (или хотя бы сопровождать их доходчивыми определениями, что бы никому не нужно было за вас додумывать).

-----

Цитата(w1nd)

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


Ок, давайте ещё раз, тоже самое.

Пусть у нас есть два класса: А и B.
Согласно LSP, "B" может быть наследником(подтипом) "А", только если _любая_ программа выраженная в терминах "А" останется _корректной_ после замены "А" на "B".
Если это условие выполняется, то можно гарантировать, что существующий код не придётся переписывать при появлении нового наследника класса.

Коротко и красиво, но тут есть подводные камни: что такое _любая_ и как определить _корректность_?

Прежде чем ответить на эти вопросы, посмотрим на следующие классы: 
Код
 
class A {
        private int x;
        public A(int x) {this.x =x;}
        public int foo(){return x+x;}
}

Код
 
class B {
        private int x;
        public B(int x) {this.x =x;}
        public int foo(){return x*x;}
}
?

У них абсолютно идентичные интерфейсы и различное поведение. Допустимо ли наследовать 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) Заморозка противоречит стремлению создавать простой для модификации и расширения код. Если отказаться от этой цели, 
то можно и не городить огород с ООП, а обойтись функциональной декомпозицией и любым процедурным языком. 


Что в этих рассуждениях вызывает вопросы?




 
PM MAIL   Вверх
Domestic Cat
Дата 22.5.2006, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 4
Всего: 172



Цитата(w1nd @  21.5.2006,  16:10 Найти цитируемый пост)
Допустим, вам нужно представить, как будет выглядеть изображение на составном экране или еще на какой-нить поверхности. Точки (из которых будет состоять эта поверхность, ваш будущий холст) будут родителями для самых разнообразных классов - от текстуры до телевизора. 

Можно допустить что такая ситуация возможна, но пример неочевиден и к геометрии имеет весьма отдаленное отношение. 


Цитата(w1nd @  21.5.2006,  16:10 Найти цитируемый пост)
Если не требуется больше ничего, что помешало бы - почему нет? Большая модель классов только запутывает. 

См здесь  


--------------------

PM   Вверх
w1nd
Дата 22.5.2006, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата(NotGonnaGetUs @  22.5.2006, 15:22)
Могут и есть.

Да, если спросить сантехника, он не будет знать, что такое принцип подстановки Барбары Лисков, но для людей от computer science, утверждающих о владении ООП, такое не знание непростительно.

Не могут, не есть, не пить. Это подтверждает опыт, мой и моих многочисленных коллег. 

Как увидел слова "владение ООП", сразу вспомнил фразу из резюме: "профессионально овладел компьютером". Я ничем таким не овладевал, напраслина это. Мне достаточно понимания. 

Ладно, пока все разговоры о анекдотичности примеров или неприменимости определений не более чем буквоедство. Теперь поправка по существу вопроса: "наследовать человека от его левой руки, вместо того, чтобы использовать композицию" было бы неестественно наяву. Для конкретной модели классов человек может состоять и из одной левой руки и, может быть, колеса от телеги. Вообще из чего угодно. 

Скажите, ваши разъяснения применимы к ситуации, описанной здесь?
  

Это сообщение отредактировал(а) w1nd - 22.5.2006, 23:08


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
NotGonnaGetUs
Дата 23.5.2006, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 25.2.2005
Где: Москва

Репутация: 8
Всего: 12



Цитата(w1nd)

Это подтверждает опыт, мой и моих многочисленных коллег. 


Грустно и за вас, и за ваших коллег.

Цитата(w1nd)

Теперь поправка по существу вопроса: "наследовать человека от его левой руки, вместо того, чтобы использовать композицию" было бы неестественно наяву. Для конкретной модели классов человек может состоять и из одной левой руки и, может быть, колеса от телеги. Вообще из чего угодно. 


По существу был бы следующий вопрос: почему никто в здравом уме не использует наследование для моделирования отношения "has" между концептуальными классами.

А ваш вопрос не по существу. Вы опять берётесь за свою любимую функциональную декомпозицию. 

Что такое "конкретная модель классов"? 

Никакая задача не навязывает "конкретную модель классов". 
Для решения _любой_ задачи можно использовать какие угодно классы, н-р, можно их вообще не использовать.
Однако решения можно _сравнивать_ между собой. 
Если вы утверждаете, что для решения задачи Х нужно наследовать человека от его левой руки, я скажу, что это глупо и смешно, потому что можно привести решение, которое будет _лучше_. 

Лучше или хуже не абсолютные категории. Это отражение вполне конкретных проблем с которыми столкивалась индустрия программного обеспечания на различных этапах своего развития. 
Различные "принципы ООП" (теже шаблоны GRASP, как наиболее полное собрание этих принципов) это своего рода указатели: куда нужно идти, чтобы не попасть в не приятную историю. 

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



Цитата(w1nd)

Скажите, ваши разъяснения применимы к ситуации, описанной здесь?

Ссылка "Здесь" не ведёт ни в какое конкретное место.
 
PM MAIL   Вверх
w1nd
Дата 23.5.2006, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата(NotGonnaGetUs @  23.5.2006, 11:12)
Грустно и за вас, и за ваших коллег.

Не печальтесь. Новые имена для старых вещей сути этих вещей не изменяют.

Цитата
Ссылка "Здесь" не ведёт ни в какое конкретное место.

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

Это сообщение отредактировал(а) w1nd - 23.5.2006, 20:52


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Domestic Cat
Дата 23.5.2006, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 4
Всего: 172



Цитата(w1nd @  23.5.2006,  11:49 Найти цитируемый пост)
"Допустим, вам нужно представить, как будет выглядеть изображение на составном экране или еще на какой-нить поверхности. Точки (из которых будет состоять эта поверхность, ваш будущий холст) будут родителями для самых разнообразных классов - от текстуры до телевизора."   

Напомню - речь с самого начала шла о геометрии, что было уточнено неоднократно. Точка в геометрии определяется так:
Цитата

То́чка — абстрактный объект в пространстве, обладающий координатами, но не имеющий размеров, массы, направленности и каких-либо других геометрических или физических характеристик.

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


--------------------

PM   Вверх
skyboy
Дата 23.5.2006, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 1
Всего: 260



w1nd, тогда любой класс должен включать в себя интерфейс с методом "представить в виде точки". Пересчет проекции в точку будет зависеть от фигуры - потому реализация всё равно будет разнесена по конкретным классам. Использования наследования классов не требуется.   

Это сообщение отредактировал(а) skyboy - 24.5.2006, 00:24
PM MAIL   Вверх
NotGonnaGetUs
Дата 24.5.2006, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 25.2.2005
Где: Москва

Репутация: 8
Всего: 12



Цитата(w1nd)

Не печальтесь. Новые имена для старых вещей сути этих вещей не изменяют.

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


Цитата(w1nd)

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


Тоже самое на русском языке, плз. Или, лучше, сразу на java.
А то у вас опять не разбери что и в каких значениях: экран/поверхность/точка/холст/текстуры. 

И заодно разрулите, почему составные части экрана называются точками.

---

Кстати, я правильно понимаю, что вы продолжаете настаивать на том, что наследовать квадрат от точки и человека от руки это замечательные решения? smile  

Это сообщение отредактировал(а) NotGonnaGetUs - 24.5.2006, 11:55
PM MAIL   Вверх
w1nd
Дата 24.5.2006, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



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

Незачем.

Цитата
Тоже самое на русском языке, плз.

Это прозвучало в теме три раза. Точка может быть представлена любым объектом для отображения на поверхности, состоящей из этих объектов. 

Цитата
Кстати, я правильно понимаю, что вы продолжаете настаивать на том, что наследовать квадрат от точки и человека от руки это замечательные решения?

Именно так.  


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
NotGonnaGetUs
Дата 25.5.2006, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 25.2.2005
Где: Москва

Репутация: 8
Всего: 12



Цитата(w1nd)

Цитата(NGGU)

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


Незачем.


Трудно комментировать такое сильное утверждение smile)

Цитата(w1nd)

Это прозвучало в теме три раза. Точка может быть представлена любым объектом для отображения на поверхности, состоящей из этих объектов. 

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

Где задача-то?

Единственное, что я могу из ваших бессвязных фраз предположить:

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

Код

class Point {
       private int x,y;
}
class Polygon {
       private List<Point> apexes;
       public boolean contain(Point point) { 
              ...; //оперделяем содержится ли точка внутри многоугольника
       }
}
class Cell {
      private Polygon bounds; //самая простая имплементация

      public void draw(Point point) {
            if (canDraw(point)) {
                   ...; // отмечаем ячейку как содержащую точку
            }
      }

      public boolean canDraw(Point point) {
            return bounds.contain(point);
      }
}
class Pane {
       private List<Cell> cells;

       public void drawPoint(Point point){
              for(Cell cell: cells) { //наипростейший алгоритм отрисовки
                    сell.draw(point); 
              }
       }
}


Не вижу в упор, кто должен наследоваться от точки и зачем.
Не согласны?
Сформулируете внятно свою задачу и покажите зачем вам для её решения нужно наследоваться от точки.


Цитата(w1nd)

Цитата(NGGU)

Кстати, я правильно понимаю, что вы продолжаете настаивать на том, что наследовать квадрат от точки и человека от руки это замечательные решения? 

Именно так.   

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

Вами были выдвинуты тезисы:
- наследование нужно использовать для моделирования отношения has
- объект не должен никому давать доступ к своим данным
- свойства и javabeans не-ООП
- все GUI не-ООП

Защитить свою позицию вы не смогли. 

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

Цитата(w1nd)

2simanyay Тем, кому так трудно что-либо представить, не пощупав (увидев код), я отвечу: "fuck yourself". Это можно перевести, как: "учитесь использовать собственную голову по назначению".  


Мне, н-р, абсолютно не трудно представить к какому коду приводит ваша позиция.
Вот тут это было проделано http://forum.vingrad.ru/index.php?showtopi...st&p=737660
Вы почему-то (хотя я ни на шаг не отступил от ваших слов) отказались обсуждать полученный результат, тем самым признав, что за свои слова вы не отвечаете. А если это так, то пытаться что-то представить самому из ваших слов просто бесполезное занятие. Так что Линус Торвальдс дважды прав. 
PM MAIL   Вверх
w1nd
Дата 26.5.2006, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата(NotGonnaGetUs @  25.5.2006, 10:41)
После ваших перлов с геометрическим центром выпуклуго многоугольника, я уже мало удивляюсь подобным вашим выскзываниям.

Это не мой перл, определение я нашел в сети. К сожалению, неверное. На самом деле не имеет значения, является ли координата квадрата его центром (я такого предположения не высказывал, просто поддержал по причине незнания определения геометрического центра). 

Надо ли мне перестать воспринимать ваши слова из-за опечаток/ошибок/противоречий в ваших сообщениях? Или вам нечего возразить, но очень хочется? 

Цитата(NotGonnaGetUs @  25.5.2006, 10:41)
Единственное, что я могу из ваших бессвязных фраз предположить

Аплодисменты. Пожалуй, вы всё же не умеете читать. Я сформулировал задачу предельно ясно четыре раза в этой теме. 

Еще раз. Задача - показать результат выполнения рисунка в мозаике. Воспроизвести рисунок с помощью камешков, стёклышек или кафельных плиток. Так как камешков, стёклышек или плиток под рукой может не оказаться, сделать программу, которая выведет на экран рисунок, выполненный в мозаике, элементами которой может быть любой отображаемый объект. 

Если вам снова непонятно, срочно нанимайте преподавателя русского языка и литературы.

Цитата(NotGonnaGetUs @  25.5.2006, 10:41)
Ну вы бы снизошли тогда до меня и показали бы где я ошибаюсь пытаясь показать, что наследование в подобных ситуациях не уместно.

Вами были выдвинуты тезисы:
- наследование нужно использовать для моделирования отношения has
- объект не должен никому давать доступ к своим данным
- свойства и javabeans не-ООП
- все GUI не-ООП

Защитить свою позицию вы не смогли.

Я привел пример. Если считать это сообщение, то уже пять раз.

А на тезисах хотелось бы остановится подробнее. Разъяните, термин "отношение has", - для меня это что-то новое. 

Остальные тезисы, приведенные вами, к примеру не имеют отношения. Это ответы на вопросы или реплики оппонентов. С чего вы вообще взяли, что с их помощью я пытался защищать пример наследования?!

Цитата(NotGonnaGetUs @  25.5.2006, 10:41)
Мне, н-р, абсолютно не трудно представить к какому коду приводит ваша позиция. <...>
А если это так, то пытаться что-то представить самому из ваших слов просто бесполезное занятие. Так что Линус Торвальдс дважды прав.

Вот и представляйте. На счет слов я уже высказался, а Линус Торвальдс может быть правым, левым, верхним или нижним - это его проблемы.







 


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Domestic Cat
Дата 26.5.2006, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 4
Всего: 172



w1nd временно забанен 

simanyay - аналогично  

Причина - нецензурная лексика.  


--------------------

PM   Вверх
Exception
Дата 26.5.2006, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 2
Всего: 186



No comments. Чувствую, что мне нечего сказать. Человек так и не подкрепил свою идею реальным примером кода и позволяет себе указывать всем вокруг, что они неправы.
 
PM   Вверх
Domestic Cat
Дата 26.5.2006, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 4
Всего: 172




Модератор: Сообщение скрыто.



--------------------

PM   Вверх
Exception
Дата 26.5.2006, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 2
Всего: 186




Модератор: Сообщение скрыто.

PM   Вверх
NotGonnaGetUs
Дата 29.5.2006, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 25.2.2005
Где: Москва

Репутация: 8
Всего: 12



Уже разбанили? Можно продолжать?

Цитата(w1nd)

Это не мой перл, определение я нашел в сети. К сожалению, неверное. На самом деле не имеет значения, является ли координата квадрата его центром (я такого предположения не высказывал, просто поддержал по причине незнания определения геометрического центра). 


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


Цитата(w1nd)

Надо ли мне перестать воспринимать ваши слова из-за опечаток/ошибок/противоречий в ваших сообщениях? Или вам нечего возразить, но очень хочется? 


Если вы видите противоречая/ошибки в моих сообщениях, то напишите об этом.
И я либо соглашусь, что был не прав, либо объясню, что вы не поняли в моих словах.
Опечатки можно не комментировать.

Цитата(w1nd)

Аплодисменты. Пожалуй, вы всё же не умеете читать. Я сформулировал задачу предельно ясно четыре раза в этой теме. 


Пожалуй не соглашусь. Предельно ясной формулировки озвучено не было. 

Цитата(w1nd)

Еще раз. Задача - показать результат выполнения рисунка в мозаике. Воспроизвести рисунок с помощью камешков, стёклышек или кафельных плиток. Так как камешков, стёклышек или плиток под рукой может не оказаться, сделать программу, которая выведет на экран рисунок, выполненный в мозаике, элементами которой может быть любой отображаемый объект. 

Уже лучше, но я же просил код. Что от чего вы хотите отнаследовать? Продемонстрируйте, чтобы не было вопросов.

Что мы имеем:
Мозаика(Mosaic) состоит из кусочков (Сell) произвольного размера, цвета, формы. 
Задача стоит в том, чтобы отобразить картинку в мозаику и изобразить мозаику на экране.
Алгоритм преобразования картинки - не известен.

Первое что приходит на ум:

Код

interface Mosaic { //Готовая мозаика.
     List<Cell> getCells();
}

interface Cell {  //Произвольный кусочек
     Renderer getRenderer(); //один и тот же кусочек может отображаться по разному
}

interface Renderer {
     void render(Graphics g); 
}

interface MosaicBuilder {
       Mosaic createMosaic(BufferedImage picture); //реализует алгоритм отображения картинки в мозаику
}

class MosaicRenderer {
       private Mosaic mosaic;
       MosaicRenderer(Mosaic mosaic) {
               this.mosaic = mosaic;
       }
       public void render(Graphics g){ //тут можно наложить какие-нибудь эффекты и т.п.
               for(Cell cell: mosaic.getCells()) {
                       cell.getRenderer().render(g);
               }
       }
}

сlass Usage {
        public static void main(String[] args) {
                 new JFrame(){
                       {
                                BufferedImage image = loadImage(...);
                                Mosaic mosaic =  new ConcreteMosaicBuilder().createMosaic(image);
                                final MosaicRenderer renderer = new MosaicRenderer(mosaic);
                  
                                getContentPane().add(new JComponent(){
                                         public void paint(Graphics g){
                                                  renderer.render(g);
                                         }
                                });
                                setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                       }
                 }.setVisible(true);
        }
}


Конкретные кусочки можно представить так:
 
Код

abstract class PolygonalCell implement Cell {
       protected Polygon bounds = new Polygon();
       protected Color color = Color.BLACK;
        
       public Color getColor() {
            return color;
       }
       
       public Polygon getBounds(){
            return new Polygon(bounds.xpoints, bounds.ypoints, bound.npoints); //или типа того 
       }
       
       protected void rotate(Point rotateCenter, int angle) {             
                ...;  //вращает полигон вокруг заданной точки
       }
      
       public Renderer getRenderer(){
               return new PolygonalRenderer(this);
       }
}

class PolygonalRenderer implements Renderer {
         private PolygonalCell cell;
         PolygonalRenderer(PolygonalCell cell) {
                 this.cell = cell;
         }

         public void  render(Graphics g) {
                  g.setColor(cell.getColor()); 
                  g.fillPolygon(cell.getPolygon());
         }
}

сlass SquareCell extends PolygonalCell {
       SquareCell(Point center, int size, int angle, Color defaultColor){
                 bounds.add(center.x - size/2, center.y - size/2);
                 bounds.add(center.x + size/2, center.y - size/2);
                 bounds.add(center.x + size/2, center.y + size/2);
                 bounds.add(center.x - size/2, center.y + size/2);
                 
                 color = defaultColor;

                 rotate(center, angle);
       } 
}

сlass TriangleCell extends PolygonalCell { 
       ...;
}



Цитата(w1nd)

А на тезисах хотелось бы остановится подробнее. Разъяните, термин "отношение has", - для меня это что-то новое. 

одно из отношений между объектами.

is-a - человек это млекопитающее
has - человек владеет сумкой

Цитата(w1nd)

Остальные тезисы, приведенные вами, к примеру не имеют отношения. Это ответы на вопросы или реплики оппонентов. С чего вы вообще взяли, что с их помощью я пытался защищать пример наследования?!

Все тезисы, влючая пропущенный про "комплексные типы", это утверждения прозвучавшие из ваших уст, с которыми я не согласен.
Я приводил аргументы в защиту своей точки зрения и не получил ответа с вашей стороны. 
Я "не брал, что с их помощью вы пытаетесь защищать пример наследования". 
Наследование - это один из этих тезисов.



Цитата(w1nd)

Вот и представляйте. На счет слов я уже высказался, а Линус Торвальдс может быть правым, левым, верхним или нижним - это его проблемы.

Угу, а я высказался на счёт вашего высказывания smile За свои слова нужно отвечать.

   

Это сообщение отредактировал(а) NotGonnaGetUs - 29.5.2006, 11:43
PM MAIL   Вверх
Страницы: (10) [Все] 1 2 3 ... Последняя »
Ответ в темуСоздание новой темы Создание опроса
Правила ведения Религиозных войн
Smartov
1. Уважайте собеседника
2. Собеседник != враг
3. Старайтесь воздерживаться от тем вида "Windows Rulez" или "Linux Rulez"

С уважением, Smartov.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Религиозные войны | Следующая тема »


 




[ Время генерации скрипта: 0.5763 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.