Здравствуйте, Воронков Василий, Вы писали:
ВВ>Налицо неумелое проектирование. _Чайник_ должен быть представлен как отдельный объект, _Вода_ также как отдельный объект. _Чайник_с_водой_ представляет собой объект, отнаследованный от объектов _Чайник_ и _Вода_.
С чего это отнаследованный? Самая типичная агрегация.
public abstract class Content
{
public vitual double Weight
{get;}
public vitual double Volume
{get;}
}
public abstract class LiquidContent : Content
{
public vitual double BoilTemperature
{get;}
public bool IsBoiled
{
get
{
return _temperature >= DoilTemperature;
}
}
}
public class WaterContent
{
public WaterContent(double count) {...}
public override double BoilTemperature
{
get { return 100f; }
}
}
public interface IContentProvider
{
Content GetContent(double count);
}
public class Tap : IContentProvider
{
WaterContent GetWater(double count)
{
try
{
_waterPipe.QueryWater(count);
catch (WaterAbortedBySomebodyException)
{
throw new NoWaterInTapException("Воду выпили жиды");
}
}
Content IContentProvider.GetContent(double count)
{
return GetWater(count);
}
}
public interface IContentContainer
{
double ContentRoom
{get;}
void PutContent(LiquidContent content);
}
public class Teapot : IContentContainer
{
public double ContentRoom {...}
public void PutContent(LiquidContent content)
{
if (content.Volume > (ContentRoom - _alreadyContained))
throw new OverflowException();
_alreadyContained += content.Volume;
}
}
public interface IFireable
{
bool IsFired
{get;}
void Fire(FireSource source);
}
public abstract class FireSourceProvider
{
public abstract FireSource CreateFireSource();
}
public abstract class FireSource : IFireable
{
protected abstract IsFired
{get;}
public abstract void Fire(FireSource source);
public bool DoFire(IFireable what)
{
while (!what.IsFired)
{
what.Fire(this);
if (IsFired)
return false;
}
return true;
}
}
public class Match : FireSource
{
public override bool IsFired
{
get { return _isFired; }
}
public override void Fire() {...}
}
public class MatchBox : FireSourceProvider
{
public override FireSource CreateFireSource()
{
if (_matchCount = 0)
throw new NotEnoughMatchesException();
_matchCount--;
return new Match();
}
}
public class Stove : IFireable
{
public bool IsFired
{
get { return _isFired; }
}
public void Fire()
{
...
_isFired = true;
}
public void PutOn(object what)
{
...
}
}
А теперь собственно требуемый код:
const double overflowPreventVolume = 0.05f;
Teapot teapot = Home.Instance.Kitchen.PlatesAndDishesShelf.Extract("Teapot #1");
double requiredContentCount = teapot.ContentRoom - teapot.Content.Volume - overflowPreventVolume;
if (requiredContentCount > 0)
teapot.PutContent(Home.Instance.Kitchen.Tap.GetContent(requiredContentCount));
MatchBox matchBox = Home.Instance.Kitchen.SmallShelf.Extract("MatchBox");
Stove stove = Home.Instance.Kitchen.Stove;
while (!stove.IsFired)
{
int atemptCount = 0;
const totalAtempts = 10;
FireSource match = matchBox.CreateFireSource();
while (!match.IsFired)
{
match.Fire(null);
atemtpCount++;
if (atemptCount > totalAtempts)
throw new ArgumentException("Черт побери, какого фига спички мокрые!");
}
match.DoFire(stove);
}
stove.PutOn(teapot);
const int checkInterval = 30000;
while (!teapot.Content.IsBoiled)
System.Threading.Sleep(checkInterval);
Так что нефиг свою криворукость списывать на недостатки ООП.
Здравствуйте, Евгений Коробко, Вы писали:
ЕК>Собственно, факт известный. ООП жертвует частью скорости в пользу более простому программированию. Например, как ни крути, а string работает медленнее непосредственной работы с char* ЕК>(не верите? попробуйте написать оператор + для строк и посчитайте, сколько будет копирований в операции a=b+c).
Ха-Ха-Ха. Еще один! Пару недель как обсуждали строки в С и в С++. Ребята, С++ порвет С на строках на раз-два. Просто потому, что на нем можно написать код, который выльется в простых случаях ровно в тот же асм, что и аналог на С, а в сложных — выберет более оптимальную стратегию благодаря возможности обмениваться дополнительными данными. Нет никакого просада производительности в ООП. ЕК>Просто скорость работы программы — это лишь один из факторов. ООП предлагает переспределить ресурсы в пользу экономии времени программиста. ЕК>Asm -> C -> C++ -> C#. Налицо всё большая удобность для программиста и всё меньшая эффективность. Но процессорное время дешевле, чем время работы программиста.
Это миф. На практике оказывается, что чем более общие концепции предоставляет язык для выражения программистской мысли, тем лучше все работает. Введение инлайнов в плюсах позволило порвать С на коротких функциях. Введение шаблонов помогло порвать его там, где раньше вылизывали библотеки вручную.
Блин, ребята тут на конференции выступали с шаблонным алгоритмом Кули-Тьюки для быстрого фурье-преобразования. Когда число точек — степень 2, он выполняется с той же скоростью, что библиотечный аналог на С. Зато если у вас всего 1000 точек, а не 1024, вокруг библиотечного алгоритма приходится делать кучу припрыгиваний, типа перемасштабирования или добивания 24 точек экстраполяцией. Т.е. либо терять в точности, либо в производительности. А шаблонному алгоритму по барабану — он раскладывает его как 2*2*2*5*5*5 и выполняет за то же время.
Ладно, давайте дальше смотреть. Ага, неэффективная Джава? Ребята, в очень большом классе задач джава рвет серверные приложения на плюсах на раз-два. Потому, что сборка мусора выполняется ой как редко. А плюсы, несмотря на все свои преимущества по сравнению с С, тем не менее все построены на постоянных перевыделениях памяти. Стоит нам попытаться использовать динамический полиморфизм — и упс! мы начинаем считать ссылки, передача указателей теперь не простое копирование, а инкремент/декремент, и каунтер все время колеблется около нуля, пока наконец это пламя ен погаснет... .NET пока еще не прошел горнила оптимизации, ну, да первый С++ тоже действительно имел траблы с производительностью. Ничего, нагонят через пару лет.
... << RSDN@Home 1.1.2 beta 2 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
H_D> — Знаешь анекдот, как программист кипятит чайник. Дано: пустой H_D>чайник, кран, спички, газовая плита. Программа действий: наполнить H_D>чайник водой из-под крана, поставить на плиту, зажечь газ. Ждать, пока H_D>закипит чайник. Эта программа оформляется как объект. Второй случай. H_D>Все то же самое, но чайник с водой уже стоит на плите. Действия H_D>программиста: вылить воду из чайника и выполнить предыдущий объект. H_D>Которая лишь подтверждает мысль, что ООП везде — это вред и блед, хотя и не отрицает что в бизнес приложениях ООП — это просто круто
Вообщето приведена какая совершенно глупая ООп модель, для данного случая (неверная декомпозиция)..
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
Здравствуйте, Hacker_Delphi, Вы писали:
H_D>Вот отрывок из книши одного очень хорошего писателя: H_D>
H_D> - Долгая история. Все дело в том, что местные программисты пошли
H_D>по неверному пути. Этот путь называется объектно ориентированный подход
H_D>в программировании. На самом деле это мина с часовым механизмом в
H_D>красивой упаковке. В очень красивой упаковке. Как с этим бороться, я
H_D>не знаю. Упустил момент.
H_D> - Мастер, ближе к делу.
H_D> - Знаешь анекдот, как программист кипятит чайник. Дано: пустой
H_D>чайник, кран, спички, газовая плита. Программа действий: наполнить
H_D>чайник водой из-под крана, поставить на плиту, зажечь газ. Ждать, пока
H_D>закипит чайник. Эта программа оформляется как объект. Второй случай.
H_D>Все то же самое, но чайник с водой уже стоит на плите. Действия
H_D>программиста: вылить воду из чайника и выполнить предыдущий объект.
H_D> - Грустно. А нырнуть внутрь объекта нельзя? Туда, где надо газ
H_D>зажечь?
H_D> - Нельзя. Можно добавить новое свойство или действие. В нашем случае
H_D>- воду вылить. Будет новый объект. Но внутрь влезть нельзя. Объект дается
H_D>как единое целое. Никто не знает, что там внутри. Все давно забыли, откуда
H_D>ноги растут. В результате получается колоссальное дублирование кода и данных
H_D>и огромная потеря производительности компьютера. С каждым годом компьютеры
H_D>требуют все больше памяти, а работают все медленнее.
H_D>
чушь какая-то :)))
особенно мне понравилась фраза "выполнить предыдущий объект". Прям функторы :))))
И так далее. "воду вылить. Будет новый объект."
Явно автор не понимает, о чем пишет.
Здравствуйте, Евгений Коробко, Вы писали:
>>Ребята, С++ порвет С на строках на раз-два. Просто потому, что на нем можно написать код, который выльется в простых случаях ровно в тот же асм, что и аналог на С, а в сложных — выберет более оптимальную стратегию благодаря возможности обмениваться дополнительными данными.
ЕК>Глупости. Код (на С++) будет более читабелен. Но менее эффективен. Вот пример:
ЕК>Можешь предложить более эффективную реализацию?
Devil in details.
Как устроена строка? Что происходит в дефолтном конструкторе, в конструкторе копирования?
Есть строки с разделяемым (shared) блоком данных; любые копирования сводятся к инкременту счетчика ссылок, а копирование данных происходит только при попытке записи в совместно используемый блок.
ЕК>Далее, ЕК>x=a+b; ЕК>Что тут будет? a и b передадутся по ссылке, тут всё нормально. Внутри оператора сначала в стеке создастся res (конструктор приватный, всё нормально). Заполнится данными (тоже нормально). А вот с возвратом значения — жопа. Сначала res скопируется в анонимную переменную (конструктором копирования), затем из неё — в x тем же конструктором копирования. Вот здесь и неэффективно, и сделать ничего нельзя. Постоянные копирования — проблема в С++.
Оптимизация возвращаемого значения. Допускается стандартом, реализована некоторыми компиляторами (в том числе VC).
Для тех, кто этого не делает — есть паттерн программирования move constructor. (см. не Гамма..."Паттерны проектирования", а www.CUJ.com и Александреску). Тот же самый std::auto_ptr...
ЕК>Далее, использование класса string располагает к такому коду: ЕК>... ЕК>string s="select * from t where id="+string::number(id); ЕК>... ЕК>что страшно неэффективно по сравнению с ЕК>... ЕК>char sql[128]; ЕК>sprintf(sql,"select * from t where id=%d",id);
А использование stringstream, а использование строк с форматированием (например, в библиотеке Qt)?
>>Это миф. На практике оказывается, что чем более общие концепции предоставляет язык для выражения программистской мысли, тем лучше все работает ЕК>Это верно в смысле надёжности. Для современных программ (которые очень сложны) надёжность зачастую гораздо важнее эффективности. ЕК>Более высокий уровень языка программирования может привести к увеличению эффективности только из-за того, что человек может не справиться с чудовищным объёмом кода на С или асме. Но это — человеческий фактор и к эффективности языка отношения не имеет.
Ну да, конечно. Можно ручками все собрать, в этом плане нет ничего проще. Пишешь спецификацию на VHDL, рожаешь принципиальную схему, и на микросхемах ПЛМ все собираешь. Не, на ПЛМ беспонтово — на заказном чипсете.
Летать будет — не то слово! Но и это не предел.
Знаете ли вы, что обычный одноступенчатый RS-триггер можно сделать на 2 транзисторах? А типовая реализация его занимает 4-6 транзисторов (схема на двух 2И-НЕ).
Что конечный автомат на регистре будет эффективнее (меньшее количество элементов, следовательно, большая частота тактирования), если станет работать с кодами Грея, а не последовательно 1-2-3-4-5?
Что если хорошенько потрясти и попрыгать, то Пень можно раза в полтора ужать, хотя его разработка займет еще десяток лет?
Что студенты выли и бились об стены, сдавая курсовик по арифметико-логическим основам ЦВМ, где нужно было простенькую логику забить на действительно минимальной элементной базе и доказать, что минимальнее не бывает.
Что наши коллеги из Англии задавились жабой купить микроконтроллер с сетевушкой и сделали ethernet-устройство на ПЛМ (ладно еще не на рассыпухе). А потом год мучительных отладок и взаимных упреков?
НАХРЕНА ТАКОЙ ФАКТОР?!
>>Блин, ребята тут на конференции выступали с шаблонным алгоритмом Кули-Тьюки для быстрого фурье-преобразования. Когда число точек — степень 2, он выполняется с той же скоростью, что библиотечный аналог на С. Зато если у вас всего 1000 точек, а не 1024, вокруг библиотечного алгоритма приходится делать кучу припрыгиваний, типа перемасштабирования или добивания 24 точек экстраполяцией. Т.е. либо терять в точности, либо в производительности. А шаблонному алгоритму по барабану — он раскладывает его как 2*2*2*5*5*5 и выполняет за то же время.
ЕК>Это лажа — ты же сравниваешь два разных алгоритма. Применение шаблонов не может влиять на возможность разложения числа точек на простые множители. Так что это не пример.
Это не лажа. Стоимость разработки обобщенного алгоритма на Си без шаблонов, и даже стоимость конкретной специализации алгоритма методом copy-paste — не сравнится с разработкой шаблона на С++.
>>Ладно, давайте дальше смотреть. Ага, неэффективная Джава? Ребята, в очень большом классе задач джава рвет серверные приложения на плюсах на раз-два. Потому, что сборка мусора выполняется ой как редко. А плюсы, несмотря на все свои преимущества по сравнению с С, тем не менее все построены на постоянных перевыделениях памяти. Стоит нам попытаться использовать динамический полиморфизм — и упс! мы начинаем считать ссылки, передача указателей теперь не простое копирование, а инкремент/декремент, и каунтер все время колеблется около нуля, пока наконец это пламя ен погаснет... .NET пока еще не прошел горнила оптимизации, ну, да первый С++ тоже действительно имел траблы с производительностью. Ничего, нагонят через пару лет.
ЕК>По какому критерию ждава рвёт С++? А по скорости разработки! По надёжности программ (ну не упадёт джава по AV!)
ЕК>Чем крупнее блоки, из которых собирается программа, тем менее это эффективно. Тем больше работает принцип чайника. Посмотри, например, на www.wasm.ru. ЕК>цикл ЕК>int *a,*b; ЕК>for(int i=0;i<n;i++) ЕК> a[i]=-b[i]; ЕК>на асме оптимизируется в 7-8 раз.
Да-да, ты еще в С++-компиляторе включи всю отладочную инфу и отруби все оптимизации.
Вот отрывок из книши одного очень хорошего писателя:
- Долгая история. Все дело в том, что местные программисты пошли
по неверному пути. Этот путь называется объектно ориентированный подход
в программировании. На самом деле это мина с часовым механизмом в
красивой упаковке. В очень красивой упаковке. Как с этим бороться, я
не знаю. Упустил момент.
- Мастер, ближе к делу.
- Знаешь анекдот, как программист кипятит чайник. Дано: пустой
чайник, кран, спички, газовая плита. Программа действий: наполнить
чайник водой из-под крана, поставить на плиту, зажечь газ. Ждать, пока
закипит чайник. Эта программа оформляется как объект. Второй случай.
Все то же самое, но чайник с водой уже стоит на плите. Действия
программиста: вылить воду из чайника и выполнить предыдущий объект.
- Грустно. А нырнуть внутрь объекта нельзя? Туда, где надо газ
зажечь?
- Нельзя. Можно добавить новое свойство или действие. В нашем случае
- воду вылить. Будет новый объект. Но внутрь влезть нельзя. Объект дается
как единое целое. Никто не знает, что там внутри. Все давно забыли, откуда
ноги растут. В результате получается колоссальное дублирование кода и данных
и огромная потеря производительности компьютера. С каждым годом компьютеры
требуют все больше памяти, а работают все медленнее.
Которая лишь подтверждает мысль, что ООП везде — это вред и блед, хотя и не отрицает что в бизнес приложениях ООП — это просто круто
... << RSDN@Home 1.1.2 beta 2 >>
15.12.03 11:36: Перенесено модератором из 'Проектирование' — ХД
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Здравствуйте, _Obelisk_, Вы писали:
_O_>Здравствуйте, Hacker_Delphi, Вы писали:
_O_>Это пример криво спроектированного чайника, который инкапсулирован с газовой плитой и водопроводным краном . Поддерживает сия штука лишь методы "ВылитьВоду", "НалитьВодуПоставитьНаПлитуВключитьГаз". Брр.... _O_>Такие "мины с часовым механизмом" закладываются не технологией, а архитектором.
Ну почему надо цепляться за конкретный пример и говорить, что пример неправильный, поэтому автор не прав?
Понятно, что приведенный пример высосан из пальца. Но проблема выделена по моему достаточно ясно : Невозможность(трудоемкость или неудоно) изменить логику работы обьекта, когда он уже спроектирован и написан. И это проблемы ООП, а не архитектора. Архитекор в рамках ООП ДЛЯ ДАННОЙ ЗАДАЧИ может ъхорошо спроектировать обьект. Когда задача измениться, часто приходится делать новый класс обьектов.
Это пример криво спроектированного чайника, который инкапсулирован с газовой плитой и водопроводным краном . Поддерживает сия штука лишь методы "ВылитьВоду", "НалитьВодуПоставитьНаПлитуВключитьГаз". Брр....
Такие "мины с часовым механизмом" закладываются не технологией, а архитектором.
Здравствуйте, Hacker_Delphi, Вы писали:
H_D>Вот отрывок из книши одного очень хорошего писателя: H_D>Которая лишь подтверждает мысль, что ООП везде — это вред и блед, хотя и не отрицает что в бизнес приложениях ООП — это просто круто
Отрывок говорит о вреде излишней инкапсуляции.
Но инкапсуляция не есть фича ООП!!! Она также присуща и процедурному программированию.
В данном случае — имеем криво спроектированный процедурный API.
Почему при демонстрации ООП автор предполагает, что все что можно запехнуто в один большууууууший и еле ворочащийся объект, а в функциональном программировании все гибко?.
Тогда противопоставлю ему такой же плохой пример из функционального программирования:
Его же задача решенная одной монолитной и неповоротливой функцией, ну и... размещенной для сложности в dll поставляемой сторонней компанией:
function Вскипятить_чайник(координаты чайника, координаты крана, координаты плиты, объем газа)
begin
наполнить чайник водой из-под крана
поставить на плиту
зажечь газ
дождаться пока не закипит
end;
Какая здесь гибкость при изменении ТЗ? Надо также ползти в код функции, разбивать их на подфункции, не забыть в 100 местах, где вызывается эта функция добавить вызовы новых функций. И объясните, чем после этого функциональное программирование гибче ООП.
Поэтому присоединяюсь к предыдущим сообщениям о кривости рук проектировщика — тут уже ни ООП ни функциональное програмирование не поможет.
Здравствуйте, Hacker_Delphi, Вы писали:
H_D>Которая лишь подтверждает мысль, что ООП везде — это вред и блед, хотя и не отрицает что в бизнес приложениях ООП — это просто круто
Не-ет, сякундочку...
Ничего я в этом отрывке подтверждающего не нашёл, одни словоизвороты. Никак смысла не пойму, может объяснит кто?
Там две задачи приведены. Посмотрим на первую задачу. Цитировать её не буду. Сразу напишу
type
Чайник = class()
private
procedure НалитьВоды();
procedure ПоставитьНаПлиту()
procedure ЗажечьГаз();
function ЖдатьКогдаЗакипит(): Boolean;
public
procedure Кипятить();
end;
procedure Чайник.Кипятить();
begin
НалитьВоды();
ПоставитьНаПлиту()
ЗажечьГаз();
repeat
until ЖдатьКогдаЗакипит();
end;
В начале нигде не сказано, что условия задачи могут меняться. А потом их взяли, да изменили. И пытаются показать, что раз мы не можем плюхнуться в середину метода Кипятить(), значит это глупо. А менять постановку задачи, значит, правильно, потому как из жизни.
Никто же не мешает модифицировать класс Чайник. Например, сделать метод Кипятить() виртуальным, и заменить его в потомке. А приватные методы сделать protected, раз уж нужно управляемое поведение.
Никто не мешает завести состояние класса чайник. "Вода есть?". "На плите?" "Газ зажжён?" Ждём, когда закипит?" "Чайник закипел?"
В чём фишка-то? В игре слов? Или в проектировании?
Здравствуйте, Ведмедь, Вы писали:
J>>чушь какая-то :))) J>>особенно мне понравилась фраза "выполнить предыдущий объект". Прям функторы :))))
В>Кстати действие тоже можно представить обтектом, пример тому делегаты в .NET :) Ну чем не объект? А выполнить ты его можешь? Можешь :) И что тебе не нравится? :)
я и говорю — функторы. Кстати, попробуй объяснить их 5-летнему ребенку. На пальцах :)
J>>И так далее. "воду вылить. Будет новый объект."
В>Можно добавить новое свойство или действие. В нашем случае В>- воду вылить. Будет новый объект.
В>воду вылить — метод, если добавить новый метод, будет новый класс. Все логично, А вот если оставить только
В>"воду вылить. Будет новый объект." Получается действительно чушь. Не надо вырывать слова их контекста.
это ж надо было додуматься — спроектировать чайник, в который воду можно только налить и вскипятить, а вот вылить уже нельзя :))))))) типа и горлышко забыли пробить, и дно забыли приделать :)
Конечно — получается новый класс — чайник, из которого, наконец-то, можно будет все-таки вылить воду.
J>>Явно автор не понимает, о чем пишет.
В>На самом деле не вижу никаких больших ляпов... ты бы примерно так же 5 летнему ребенку обьяснял. На пальцах.
абсолютно не так я бы ему объяснял. Чайник НЕ МОЖЕТ сам поставиться на плиту, сам залиться водой. А сам вскипятиться может только электрический чайник. Но он, опять же, не может сам включиться.
Здравствуйте, Hacker_Delphi, Вы писали:
H_D>Все то же самое, но чайник с водой уже стоит на плите. Действия H_D>программиста: вылить воду из чайника и выполнить предыдущий объект. H_D> — Грустно. А нырнуть внутрь объекта нельзя? Туда, где надо газ H_D>зажечь? H_D> — Нельзя. Можно добавить новое свойство или действие. В нашем случае
Полная ахинея. В данном случае обьект будет иметь метод — "Вскипятись!". Обьект при этом обладает всей информацией о своём состоянии. И реалиация метода интерфейса обьекта имеет полный доступ к инкапсулированной информации о состоянии обьекта. И поэтому чайник спокойно пропускает ненужные этапы и зажигает под собой газ.
Дык штааа... "Неча на зеркало пенять, коли рожа крива" (С)
А если кто-то сдуру расколотит микроскоп об гвоздь — это не значит что микроскоп SUX, а кувадла — RULEZZ
Здравствуйте, _Obelisk_, Вы писали: _O_>Есть ли подход, который решает эту проблему ?
Да. Это рефакторинг, т.е. набор преобразований объектной модели, сохраняющих семантику. Это когда мы режем статический метод вскипятить на три виртуальных и получаем ту же функциональность, но в более гибкой модели.
... << RSDN@Home 1.1.0 stable >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Ведмедь, Вы писали:
В>Понятно, что приведенный пример высосан из пальца. Но проблема выделена по моему достаточно ясно : Невозможность(трудоемкость или неудоно) изменить логику работы обьекта, когда он уже спроектирован и написан. И это проблемы ООП, а не архитектора. Архитекор в рамках ООП ДЛЯ ДАННОЙ ЗАДАЧИ может ъхорошо спроектировать обьект. Когда задача измениться, часто приходится делать новый класс обьектов.
Здравствуйте, Hacker_Delphi, Вы писали:
H_D>Здравствуйте, LaptevVV, Вы писали: H_D>[skipped] LVV>>"Это спорный вопрос. Я Вам ничего плохого не делал" (с) Лукашин LVV>>Ты лучше скажи что за книжка и где ее взять. H_D>Павел Шумилов (Павел Шумил) "Пойди поймай свою звезду". H_D>Взять — в интернете, лежит на его сайте в свободном доступе... H_D>точнее щаз не скжу — фавориты все потерлись... добавлю только, что сайт тот, который на narod.ru. H_D>PS Данное произведенгие, как и большинство его произведений не издано в бумажном виже.
В бмажном виде изданы 2 или 3 книжки из Слова о драконе и вроде бы я видел "Страшные сказки"
Здравствуйте, jazzer, Вы писали:
J>чушь какая-то J>особенно мне понравилась фраза "выполнить предыдущий объект". Прям функторы ) J>И так далее. "воду вылить. Будет новый объект." J>Явно автор не понимает, о чем пишет.
Да нет, судя по его другому произведения ("Долг перед видом") очень даже понимает.
Просто пишет он не только для тех, кто разбирается в программировании и тем более — в ООП.
ты читай не "объект вскипятить воду", а "метод объекта чайник всипятить воду" то же самое с "вылить воду" — и поямешь, что он описывает все верно
... << RSDN@Home 1.1.2 beta 2 >>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, Hacker_Delphi, Вы писали:
H_D>>Вот отрывок из книши одного очень хорошего писателя: H_D>>
H_D>> - Долгая история. Все дело в том, что местные программисты пошли
H_D>>по неверному пути. Этот путь называется объектно ориентированный подход
H_D>>в программировании. На самом деле это мина с часовым механизмом в
H_D>>красивой упаковке. В очень красивой упаковке. Как с этим бороться, я
H_D>>не знаю. Упустил момент.
H_D>> - Мастер, ближе к делу.
H_D>> - Знаешь анекдот, как программист кипятит чайник. Дано: пустой
H_D>>чайник, кран, спички, газовая плита. Программа действий: наполнить
H_D>>чайник водой из-под крана, поставить на плиту, зажечь газ. Ждать, пока
H_D>>закипит чайник. Эта программа оформляется как объект. Второй случай.
H_D>>Все то же самое, но чайник с водой уже стоит на плите. Действия
H_D>>программиста: вылить воду из чайника и выполнить предыдущий объект.
H_D>> - Грустно. А нырнуть внутрь объекта нельзя? Туда, где надо газ
H_D>>зажечь?
H_D>> - Нельзя. Можно добавить новое свойство или действие. В нашем случае
H_D>>- воду вылить. Будет новый объект. Но внутрь влезть нельзя. Объект дается
H_D>>как единое целое. Никто не знает, что там внутри. Все давно забыли, откуда
H_D>>ноги растут. В результате получается колоссальное дублирование кода и данных
H_D>>и огромная потеря производительности компьютера. С каждым годом компьютеры
H_D>>требуют все больше памяти, а работают все медленнее.
H_D>>
Кстати действие тоже можно представить обтектом, пример тому делегаты в .NET Ну чем не объект? А выполнить ты его можешь? Можешь И что тебе не нравится?
J>И так далее. "воду вылить. Будет новый объект."
Можно добавить новое свойство или действие. В нашем случае
— воду вылить. Будет новый объект.
воду вылить — метод, если добавить новый метод, будет новый класс. Все логично, А вот если оставить только
"воду вылить. Будет новый объект." Получается действительно чушь. Не надо вырывать слова их контекста.
J>Явно автор не понимает, о чем пишет.
На самом деле не вижу никаких больших ляпов... ты бы примерно так же 5 летнему ребенку обьяснял. На пальцах.
Здравствуйте, _Obelisk_, Вы писали:
_O_>Рефакторинг не страхует от кривых рук производещего этот самый рефакторинг. От отладки никуда не деться.
Это от того, что он не поддержиается средой. Я говорю именно о "математическом рефакторинге". Можно было лепить и объектные модели на С, вот только от кривых рук разработчика не было страховки, и в VMT могло оказаться все что угодно. Я прозрачно намекаю?
... << RSDN@Home 1.1.0 stable >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, dad, Вы писали:
К>>Но инкапсуляция не есть фича ООП!!! Она также присуща и процедурному программированию. К>>В данном случае — имеем криво спроектированный процедурный API.
dad>Как же инкапсуляция не фича ООП? dad>три фичи (кита) ООП — инкапсуляция полиморфизм и наследование. гыгы
Полиморфизм и инкапсуляция также (в ограниченной степени) присущи процедурному программированию. С наследованием действительно обломс.
Здравствуйте, Евгений Коробко, Вы писали:
ЕК>как ни крути, а string работает медленнее непосредственной работы с char* (не верите? попробуйте написать оператор + для строк и посчитайте, сколько будет копирований в операции a=b+c).
На каких-то операциях медленнее, а на каких-то — не очень. Смотря что за операция и смотря что за реализация string.
ЕК>Office 97 весом в 2М и летающий на 486-й машине сейчас никому не нужен.
ЕК>Можешь предложить более эффективную реализацию?
Да не нужно. ЕК>Далее, ЕК>x=a+b; ЕК>Что тут будет? a и b передадутся по ссылке, тут всё нормально. Внутри оператора сначала в стеке создастся res (конструктор приватный, всё нормально). Заполнится данными (тоже нормально). А вот с возвратом значения — жопа. Сначала res скопируется в анонимную переменную (конструктором копирования), затем из неё — в x тем же конструктором копирования. Вот здесь и неэффективно, и сделать ничего нельзя. Постоянные копирования — проблема в С++.
Я тебя уверяю, что копирование 4х байт (а кроме m_ptr ничего и не копируется) в большинстве случаев значительно дешевле, чем сканирование строки в поисках нуля.
ЕК>Далее, использование класса string располагает к такому коду: ЕК>... ЕК>string s="select * from t where id="+string::number(id); ЕК>... ЕК>что страшно неэффективно по сравнению с ЕК>... ЕК>char sql[128]; ЕК>sprintf(sql,"select * from t where id=%d",id);
Ну кто тебе это сказал? Почему страшно неэффективно-то? перевыделений много? В данном примере это будет чуть-чуть менее хреновый вариант для C, поскольку sprintf нет нужды бегать по строке несколько раз. Если конкатенаций много, то точно так же заранее резервируется место в таргет-строке и все вырождается в очень близкий код на асме. ЕК>Это верно в смысле надёжности. Для современных программ (которые очень сложны) надёжность зачастую гораздо важнее эффективности. ЕК>Более высокий уровень языка программирования может привести к увеличению эффективности только из-за того, что человек может не справиться с чудовищным объёмом кода на С или асме. Но это — человеческий фактор и к эффективности языка отношения не имеет.
Про надежность я даже не говорю! Я говорю о том, что общий алгоритм в зависимости от конкретных параметров может свернуться в один из нескольких частных случаев, выбирая самый эффективный (например, решая "на ходу" будем распределять память на стеке или в хипе). А вот прекрасно отлизанный частный случай моментально перестает быть самым эффективным при изменении параметров. >>Блин, ребята тут на конференции выступали с шаблонным алгоритмом Кули-Тьюки для быстрого фурье-преобразования. Когда число точек — степень 2, он выполняется с той же скоростью, что библиотечный аналог на С. Зато если у вас всего 1000 точек, а не 1024, вокруг библиотечного алгоритма приходится делать кучу припрыгиваний, типа перемасштабирования или добивания 24 точек экстраполяцией. Т.е. либо терять в точности, либо в производительности. А шаблонному алгоритму по барабану — он раскладывает его как 2*2*2*5*5*5 и выполняет за то же время.
ЕК>Это лажа — ты же сравниваешь два разных алгоритма. Применение шаблонов не может влиять на возможность разложения числа точек на простые множители. Так что это не пример.
Это как раз пример. Это ОДИН И ТОТ ЖЕ АЛГОРИТМ. Просто на С написали один его частный случай. Потому, что иначе пришлось бы писать по версии на каждое значение количества точек. А шаблонная версия превращается ровно в тот же код на асме, что и библиотечный, при совместимых параметрах. Только умеет работать ЕК>По какому критерию ждава рвёт С++? А по скорости разработки! По надёжности программ (ну не упадёт джава по AV!)
Ага. И по производительности тоже рвет. Уверяю. Не везде, но рвет.
ЕК>Чем крупнее блоки, из которых собирается программа, тем менее это эффективно. Тем больше работает принцип чайника. Посмотри, например, на www.wasm.ru. ЕК>цикл ЕК>int *a,*b; ЕК>for(int i=0;i<n;i++) ЕК> a[i]=-b[i]; ЕК>на асме оптимизируется в 7-8 раз.
Хм. Правда?
void Invert(int *a, int *b, int n)
{
for(int i=0;i<n;i++)
a[i]=-b[i];
}
int _tmain(int argc, _TCHAR* argv[])
{
const int n=5;
int a[n],b[]={argc, -1, 2, -2, argc};
Invert(a, b, 5);
for(int i=0;i<n;i++) // подавляем оптимизацию...
std::cout << a[i];
return 0;
}
первые три строки _tmain превращаются при помощи VC++ 8.0 вот во что:
Ну, давай — соптимизируй мне это хотя бы в 2 раза. В 7-8 я не прошу.
Так что хватит сказки-то рассказывать. ASM нынче применим только в тех случаях, когда у языка не хватает выразительности объяснить компилеру, что от него надо. Тогда да — сам пошел, руками все...
... << RSDN@Home 1.1.2 beta 2 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Вы, люди, как обычн опоняли все буквально... Жаль вас, недалеко ушли
Имеется в виду (по сюжету он это рассказывает через N лет после запуска всех этих классов в работу), что когда библиотека классов разрастается (не как STL , а тысячи раз больше), то ты или вообще не имеешь доступа к исходному коду тех первоначальных объектов, либо разбирательство с ними займет ОЧЕНЬ много времени. Там шлось про какие-то очень адвансовые пакеты управления киберами или что-то в таком духе. Это тебе не строчки копировать Писалось все это не одним поколением программеров, так что переделать это — без шансов — там диаграмма иерархии на 900 гиг будет, а исполняются эти проги на сотнях параллельных процессоров (это у самы хпримитивных экземляров) . А вот брать и юзать готовые объекты и, если надо, добавлять в них новую функциональность,- это пожалуйста. Ну не знаешь ты, что этот объект отнаследован в 965 колене от другого, у которого можно немного изменить нужный метод. Пост был о том, что когда библиотека большая и тебе дейтсвительно надо ее расширить (не потратив полжизни на изучение ее структуры ), то возникает проблема того, что ты не знаешь, как оно работает. Вот это автор и хотел показать. В этом и есть проблема ООП, а не в том, что это медленнее функционального программирования на С
Здравствуйте, dad, Вы писали: dad>нет именно определения классов, поскольку создавать объекты класса ты можешь и в явескрипт
в javascript классов нет. Там только объекты.
... << RSDN@Home 1.1.3 beta 2 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Hacker_Delphi, Вы писали:
H_D>Вот отрывок из книши одного очень хорошего писателя: H_D>
H_D> - Долгая история. Все дело в том, что местные программисты пошли
H_D>по неверному пути. Этот путь называется объектно ориентированный подход
H_D>в программировании. На самом деле это мина с часовым механизмом в
H_D>красивой упаковке. В очень красивой упаковке. Как с этим бороться, я
H_D>не знаю. Упустил момент.
H_D> - Мастер, ближе к делу.
H_D> - Знаешь анекдот, как программист кипятит чайник. Дано: пустой
H_D>чайник, кран, спички, газовая плита. Программа действий: наполнить
H_D>чайник водой из-под крана, поставить на плиту, зажечь газ. Ждать, пока
H_D>закипит чайник. Эта программа оформляется как объект. Второй случай.
H_D>Все то же самое, но чайник с водой уже стоит на плите. Действия
H_D>программиста: вылить воду из чайника и выполнить предыдущий объект.
H_D> - Грустно. А нырнуть внутрь объекта нельзя? Туда, где надо газ
H_D>зажечь?
H_D> - Нельзя. Можно добавить новое свойство или действие. В нашем случае
H_D>- воду вылить. Будет новый объект. Но внутрь влезть нельзя. Объект дается
H_D>как единое целое. Никто не знает, что там внутри. Все давно забыли, откуда
H_D>ноги растут. В результате получается колоссальное дублирование кода и данных
H_D>и огромная потеря производительности компьютера. С каждым годом компьютеры
H_D>требуют все больше памяти, а работают все медленнее.
H_D>
H_D>Которая лишь подтверждает мысль, что ООП везде — это вред и блед, хотя и не отрицает что в бизнес приложениях ООП — это просто круто
"Это спорный вопрос. Я Вам ничего плохого не делал" (с) Лукашин
Ты лучше скажи что за книжка и где ее взять.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, Hacker_Delphi, Вы писали:
H_D>Которая лишь подтверждает мысль, что ООП везде — это вред и блед, хотя и не отрицает что в бизнес приложениях ООП — это просто круто
А там не сказано, куда делись громандные функицонально-ориентированные монстры? :-D
Здравствуйте, LaptevVV, Вы писали:
[skipped] LVV>"Это спорный вопрос. Я Вам ничего плохого не делал" (с) Лукашин LVV>Ты лучше скажи что за книжка и где ее взять.
Павел Шумилов (Павел Шумил) "Пойди поймай свою звезду".
Взять — в интернете, лежит на его сайте в свободном доступе...
точнее щаз не скжу — фавориты все потерлись... добавлю только, что сайт тот, который на narod.ru.
PS Данное произведенгие, как и большинство его произведений не издано в бумажном виже.
... << RSDN@Home 1.1.2 beta 2 >>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Здравствуйте, Hacker_Delphi, Вы писали:
H_D>Здравствуйте, LaptevVV, Вы писали: H_D>[skipped] LVV>>"Это спорный вопрос. Я Вам ничего плохого не делал" (с) Лукашин LVV>>Ты лучше скажи что за книжка и где ее взять. H_D>Павел Шумилов (Павел Шумил) "Пойди поймай свою звезду". H_D>Взять — в интернете, лежит на его сайте в свободном доступе... H_D>точнее щаз не скжу — фавориты все потерлись... добавлю только, что сайт тот, который на narod.ru. H_D>PS Данное произведенгие, как и большинство его произведений не издано в бумажном виже.
Большой рахмат!!!!!
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, Алексей Одинцов, Вы писали:
АО>Здравствуйте, Hacker_Delphi, Вы писали:
H_D>>Которая лишь подтверждает мысль, что ООП везде — это вред и блед, хотя и не отрицает что в бизнес приложениях ООП — это просто круто
АО>А там не сказано, куда делись громандные функицонально-ориентированные монстры? :-D
Нет... тот, от чьего имени это все исходит на 300 лет в добровольное отшельничество отлучался...
... << RSDN@Home 1.1.2 beta 2 >>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
LVV>>"Это спорный вопрос. Я Вам ничего плохого не делал" (с) Лукашин LVV>>Ты лучше скажи что за книжка и где ее взять. H_D>Павел Шумилов (Павел Шумил) "Пойди поймай свою звезду". H_D>Взять — в интернете, лежит на его сайте в свободном доступе...
Здравствуйте, Hacker_Delphi, Вы писали:
H_D>Вот отрывок из книши одного очень хорошего писателя: H_D>
[...]
H_D>
H_D>Которая лишь подтверждает мысль, что ООП везде — это вред и блед, хотя и не отрицает что в бизнес приложениях ООП — это просто круто
Этот пример классического непонимания ООП.
Очень хорошее объяснение этому заблуждению можно найти в статье Objects Have Failed.
Objects, as envisioned by the designers of languages like Smalltalk and Actors—long before C++ and Java came around— were for modeling and building complex, dynamic worlds. Programming environments for languages like Smalltalk were written in those languages and were extensible by developers. Because the philosophy of dynamic change was part of the post-Simula OO worldview, languages and environments of that era were highly dynamic.
But with C++ and Java, the dynamic thinking fostered by object-oriented languages was nearly fatally assaulted by the theology of static thinking inherited from our mathematical heritage and the assumptions built into our views of computing by Charles Babbage whose factory-building worldview was dominated by omniscience and omnipotence.
And as a result we find that object-oriented languages have succumb to static thinkers who worship perfect planning over runtime adaptability, early decisions over late ones, and the wisdom of compilers over the cleverness of failure detection and repair.
Здравствуйте, dad, Вы писали:
LVV>>>"Это спорный вопрос. Я Вам ничего плохого не делал" (с) Лукашин LVV>>>Ты лучше скажи что за книжка и где ее взять. H_D>>Павел Шумилов (Павел Шумил) "Пойди поймай свою звезду". H_D>>Взять — в интернете, лежит на его сайте в свободном доступе...
dad>Так это киберпанк какой то , причем тут ООП?
dad>http://lib.udm.ru/lib/RUFANT/SHUMIL/
не — не киберпанк.. если прочитаешь все его произведения — поймешь, что это — science fiction.
Блин! тоже мне программисты... ПОЧЕМУ ВСЕ ВСЕ ПОНЯЛИ ТОЛЬКО БУКВАЛЬНО???
... << RSDN@Home 1.1.2 beta 2 >>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Здравствуйте, George Seryakov, Вы писали:
GS>Здравствуйте, Hacker_Delphi, Вы писали:
LVV>>>Ты лучше скажи что за книжка и где ее взять. H_D>>Павел Шумилов (Павел Шумил) "Пойди поймай свою звезду".
GS>Виндж (рекомендую) тоже по программситам-археологам проходится.
Здравствуйте, Hacker_Delphi, Вы писали:
H_D>Вот отрывок из книши одного очень хорошего писателя: H_D>
H_D> - Долгая история. Все дело в том, что местные программисты пошли
H_D>по неверному пути. Этот путь называется объектно ориентированный подход
H_D>в программировании. На самом деле это мина с часовым механизмом в
H_D>красивой упаковке. В очень красивой упаковке. Как с этим бороться, я
H_D>не знаю. Упустил момент.
H_D> - Мастер, ближе к делу.
H_D> - Знаешь анекдот, как программист кипятит чайник. Дано: пустой
H_D>чайник, кран, спички, газовая плита. Программа действий: наполнить
H_D>чайник водой из-под крана, поставить на плиту, зажечь газ. Ждать, пока
H_D>закипит чайник. Эта программа оформляется как объект. Второй случай.
H_D>Все то же самое, но чайник с водой уже стоит на плите. Действия
H_D>программиста: вылить воду из чайника и выполнить предыдущий объект.
H_D> - Грустно. А нырнуть внутрь объекта нельзя? Туда, где надо газ
H_D>зажечь?
H_D> - Нельзя. Можно добавить новое свойство или действие. В нашем случае
H_D>- воду вылить. Будет новый объект. Но внутрь влезть нельзя. Объект дается
H_D>как единое целое. Никто не знает, что там внутри. Все давно забыли, откуда
H_D>ноги растут. В результате получается колоссальное дублирование кода и данных
H_D>и огромная потеря производительности компьютера. С каждым годом компьютеры
H_D>требуют все больше памяти, а работают все медленнее.
H_D>
Налицо неумелое проектирование. _Чайник_ должен быть представлен как отдельный объект, _Вода_ также как отдельный объект. _Чайник_с_водой_ представляет собой объект, отнаследованный от объектов _Чайник_ и _Вода_. Соответственно, имеем:
функция _Главная_
{
_Чайник_ экземпляр как _Чайник_с_водой_
_Устройство_для_кипячения_::_Кипятить_(экземпляр)
}
_Устройство_для_кипячения
{
функция _Кипятить_(_Чайник_ экземпляр)
{
если (экземпляр есть _Чайник_с_водой_)
кипятить
другое
пошел взад
}
}
Во втором случае просто сокращаем функцию _Главная_ на одну строчку.
Здравствуйте, Hacker_Delphi, Вы писали:
H_D>Вот отрывок из книши одного очень хорошего писателя: H_D>
H_D> - Долгая история. Все дело в том, что местные программисты пошли
H_D>по неверному пути. Этот путь называется объектно ориентированный подход
H_D>в программировании. На самом деле это мина с часовым механизмом в
H_D>красивой упаковке. В очень красивой упаковке. Как с этим бороться, я
H_D>не знаю. Упустил момент.
H_D> - Мастер, ближе к делу.
H_D> - Знаешь анекдот, как программист кипятит чайник. Дано: пустой
H_D>чайник, кран, спички, газовая плита. Программа действий: наполнить
H_D>чайник водой из-под крана, поставить на плиту, зажечь газ. Ждать, пока
H_D>закипит чайник. Эта программа оформляется как объект. Второй случай.
H_D>Все то же самое, но чайник с водой уже стоит на плите. Действия
H_D>программиста: вылить воду из чайника и выполнить предыдущий объект.
H_D> - Грустно. А нырнуть внутрь объекта нельзя? Туда, где надо газ
H_D>зажечь?
H_D> - Нельзя. Можно добавить новое свойство или действие. В нашем случае
H_D>- воду вылить. Будет новый объект. Но внутрь влезть нельзя. Объект дается
H_D>как единое целое. Никто не знает, что там внутри. Все давно забыли, откуда
H_D>ноги растут. В результате получается колоссальное дублирование кода и данных
H_D>и огромная потеря производительности компьютера. С каждым годом компьютеры
H_D>требуют все больше памяти, а работают все медленнее.
H_D>
H_D>Которая лишь подтверждает мысль, что ООП везде — это вред и блед, хотя и не отрицает что в бизнес приложениях ООП — это просто круто
[skip] A>Там две задачи приведены. Посмотрим на первую задачу. Цитировать её не буду. Сразу напишу
[skip]
A>В начале нигде не сказано, что условия задачи могут меняться. А потом их взяли, да изменили. И пытаются показать, что раз мы не можем плюхнуться в середину метода Кипятить(), значит это глупо. А менять постановку задачи, значит, правильно, потому как из жизни.
В точку A>Никто же не мешает модифицировать класс Чайник. Например, сделать метод Кипятить() виртуальным, и заменить его в потомке. А приватные методы сделать protected, раз уж нужно управляемое поведение.
Нет нельзя.. представь, что вместо чайника — объект ядра ОС... (там-то про то, что ОСы ОО стали).
A>Никто не мешает завести состояние класса чайник. "Вода есть?". "На плите?" "Газ зажжён?" Ждём, когда закипит?" "Чайник закипел?"
Только в наследниках... т.е. велосипед
по идее — нужно наоборот делать
... << RSDN@Home 1.1.2 beta 2 >>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Здравствуйте, akasoft, Вы писали:
A>Здравствуйте, Hacker_Delphi, Вы писали:
H_D>>Которая лишь подтверждает мысль, что ООП везде — это вред и блед, хотя и не отрицает что в бизнес приложениях ООП — это просто круто
A>
A>type
A> Чайник = class()
A> private
A> procedure НалитьВоды();
A> procedure ПоставитьНаПлиту()
A> procedure ЗажечьГаз();
A> function ЖдатьКогдаЗакипит(): Boolean;
A> public
A> procedure Кипятить();
A> end;
A>procedure Чайник.Кипятить();
A>begin
A> НалитьВоды();
A> ПоставитьНаПлиту()
A> ЗажечьГаз();
A> repeat
A> until ЖдатьКогдаЗакипит();
A>end;
A>
Вот только что хотел написать то же самое. На самом деле, грамотно спроектированная ОО модель может иметь очень низкие накладные расходы, связанные с поддержанием модели как таковой, а не функциональности приложения. В данном случае надо говорить не о том, что мы теряем при использовании оо подхода, а том, что в итоге приобретается. А приобретается при правильном подходе гораздо больше, чем теряется. Пример с чайником является образцом НЕПРАВИЛЬНОГО моделирования сущностей реального мира с использованием объектов.
Здравствуйте, _Obelisk_, Вы писали:
_O_>Здравствуйте, Ведмедь, Вы писали:
В>>Понятно, что приведенный пример высосан из пальца. Но проблема выделена по моему достаточно ясно : Невозможность(трудоемкость или неудоно) изменить логику работы обьекта, когда он уже спроектирован и написан. И это проблемы ООП, а не архитектора. Архитекор в рамках ООП ДЛЯ ДАННОЙ ЗАДАЧИ может ъхорошо спроектировать обьект. Когда задача измениться, часто приходится делать новый класс обьектов.
_O_>Есть ли подход, который решает эту проблему ?
однозначно? — нет... про что и речь — не нужно делать ОО ОС...
... << RSDN@Home 1.1.2 beta 2 >>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Здравствуйте, _Obelisk_, Вы писали:
_O_>Здравствуйте, Ведмедь, Вы писали:
В>>Понятно, что приведенный пример высосан из пальца. Но проблема выделена по моему достаточно ясно : Невозможность(трудоемкость или неудоно) изменить логику работы обьекта, когда он уже спроектирован и написан. И это проблемы ООП, а не архитектора. Архитекор в рамках ООП ДЛЯ ДАННОЙ ЗАДАЧИ может ъхорошо спроектировать обьект. Когда задача измениться, часто приходится делать новый класс обьектов.
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, _Obelisk_, Вы писали: _O_>>Есть ли подход, который решает эту проблему ? S>Да. Это рефакторинг, т.е. набор преобразований объектной модели, сохраняющих семантику. Это когда мы режем статический метод вскипятить на три виртуальных и получаем ту же функциональность, но в более гибкой модели.
Это не то, ведь мы же перелопачиваем весь код в данном случае, т.е. лезем внутрь всего.
Здравствуйте, _Obelisk_, Вы писали: _O_>Это не то, ведь мы же перелопачиваем весь код в данном случае, т.е. лезем внутрь всего.
Да. Оставаясь в рамках модели, мы не сможем достичь некоторых целей. Что и показано чуть выше по топику. Так что это — именно то. В отличие от разработки модели с нуля, такой рефакторинг позволяет гарантировать функциональность без дополнительной отладки.
... << RSDN@Home 1.1.0 stable >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, _Obelisk_, Вы писали: _O_>>Это не то, ведь мы же перелопачиваем весь код в данном случае, т.е. лезем внутрь всего. S>Да. Оставаясь в рамках модели, мы не сможем достичь некоторых целей. Что и показано чуть выше по топику. Так что это — именно то. В отличие от разработки модели с нуля, такой рефакторинг позволяет гарантировать функциональность без дополнительной отладки.
Рефакторинг не страхует от кривых рук производещего этот самый рефакторинг. От отладки никуда не деться.
Здравствуйте, _Obelisk_, Вы писали:
_O_>Это пример криво спроектированного чайника, который инкапсулирован с газовой плитой и водопроводным краном . Поддерживает сия штука лишь методы "ВылитьВоду", "НалитьВодуПоставитьНаПлитуВключитьГаз". Брр.... _O_>Такие "мины с часовым механизмом" закладываются не технологией, а архитектором.
Это пример криво проектирующего Чайника-архитектора
К>Отрывок говорит о вреде излишней инкапсуляции. К>Но инкапсуляция не есть фича ООП!!! Она также присуща и процедурному программированию. К>В данном случае — имеем криво спроектированный процедурный API.
Как же инкапсуляция не фича ООП?
три фичи (кита) ООП — инкапсуляция полиморфизм и наследование. гыгы
(Все сказанное не отнсится к самому первичному посту — явно литературный диспут)
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
Собственно, факт известный. ООП жертвует частью скорости в пользу более простому программированию. Например, как ни крути, а string работает медленнее непосредственной работы с char* (не верите? попробуйте написать оператор + для строк и посчитайте, сколько будет копирований в операции a=b+c).
Просто скорость работы программы — это лишь один из факторов. ООП предлагает переспределить ресурсы в пользу экономии времени программиста.
Asm -> C -> C++ -> C#. Налицо всё большая удобность для программиста и всё меньшая эффективность. Но процессорное время дешевле, чем время работы программиста.
Office 97 весом в 2М и летающий на 486-й машине сейчас никому не нужен.
>Ребята, С++ порвет С на строках на раз-два. Просто потому, что на нем можно написать код, который выльется в простых случаях ровно в тот же асм, что и аналог на С, а в сложных — выберет более оптимальную стратегию благодаря возможности обмениваться дополнительными данными.
Глупости. Код (на С++) будет более читабелен. Но менее эффективен. Вот пример:
string operator + (const string& s1,const string s2)
{
string res(...); // private конструктор без инициализации
res.set_length(s1.length()+s2.length());
strcpy(res.m_ptr,s1.m_ptr);
// strcat(res.m_ptr,s2.m_ptr); — неправильно
strcpy(res.m_ptr+s1.length(),s2.m_ptr);
return res;
}
Можешь предложить более эффективную реализацию?
Далее,
x=a+b;
Что тут будет? a и b передадутся по ссылке, тут всё нормально. Внутри оператора сначала в стеке создастся res (конструктор приватный, всё нормально). Заполнится данными (тоже нормально). А вот с возвратом значения — жопа. Сначала res скопируется в анонимную переменную (конструктором копирования), затем из неё — в x тем же конструктором копирования. Вот здесь и неэффективно, и сделать ничего нельзя. Постоянные копирования — проблема в С++.
Далее, использование класса string располагает к такому коду:
...
string s="select * from t where id="+string::number(id);
...
что страшно неэффективно по сравнению с
...
char sql[128];
sprintf(sql,"select * from t where id=%d",id);
>Это миф. На практике оказывается, что чем более общие концепции предоставляет язык для выражения программистской мысли, тем лучше все работает
Это верно в смысле надёжности. Для современных программ (которые очень сложны) надёжность зачастую гораздо важнее эффективности.
Более высокий уровень языка программирования может привести к увеличению эффективности только из-за того, что человек может не справиться с чудовищным объёмом кода на С или асме. Но это — человеческий фактор и к эффективности языка отношения не имеет.
>Блин, ребята тут на конференции выступали с шаблонным алгоритмом Кули-Тьюки для быстрого фурье-преобразования. Когда число точек — степень 2, он выполняется с той же скоростью, что библиотечный аналог на С. Зато если у вас всего 1000 точек, а не 1024, вокруг библиотечного алгоритма приходится делать кучу припрыгиваний, типа перемасштабирования или добивания 24 точек экстраполяцией. Т.е. либо терять в точности, либо в производительности. А шаблонному алгоритму по барабану — он раскладывает его как 2*2*2*5*5*5 и выполняет за то же время.
Это лажа — ты же сравниваешь два разных алгоритма. Применение шаблонов не может влиять на возможность разложения числа точек на простые множители. Так что это не пример.
>Ладно, давайте дальше смотреть. Ага, неэффективная Джава? Ребята, в очень большом классе задач джава рвет серверные приложения на плюсах на раз-два. Потому, что сборка мусора выполняется ой как редко. А плюсы, несмотря на все свои преимущества по сравнению с С, тем не менее все построены на постоянных перевыделениях памяти. Стоит нам попытаться использовать динамический полиморфизм — и упс! мы начинаем считать ссылки, передача указателей теперь не простое копирование, а инкремент/декремент, и каунтер все время колеблется около нуля, пока наконец это пламя ен погаснет... .NET пока еще не прошел горнила оптимизации, ну, да первый С++ тоже действительно имел траблы с производительностью. Ничего, нагонят через пару лет.
По какому критерию ждава рвёт С++? А по скорости разработки! По надёжности программ (ну не упадёт джава по AV!)
Чем крупнее блоки, из которых собирается программа, тем менее это эффективно. Тем больше работает принцип чайника. Посмотри, например, на www.wasm.ru.
цикл
int *a,*b;
for(int i=0;i<n;i++)
a[i]=-b[i];
на асме оптимизируется в 7-8 раз.
Здравствуйте, Евгений Коробко, Вы писали:
ЕК>Но это — человеческий фактор и к эффективности языка отношения не имеет.
Можно провокационный вопрос — а для чего вобще существуют языки программирования?
ЕК>По какому критерию ждава рвёт С++? А по скорости разработки! По надёжности программ (ну не упадёт джава по AV!)
И по производительности тож бывает.
ЕК>Чем крупнее блоки, из которых собирается программа, тем менее это эффективно. Тем больше работает принцип чайника. Посмотри, например, на www.wasm.ru. ЕК>цикл ЕК>int *a,*b; ЕК>for(int i=0;i<n;i++) ЕК> a[i]=-b[i]; ЕК>на асме оптимизируется в 7-8 раз.
Здравствуйте, Hacker_Delphi, Вы писали:
H_D> — Грустно. А нырнуть внутрь объекта нельзя? Туда, где надо газ H_D>зажечь? H_D> — Нельзя. Можно добавить новое свойство или действие. В нашем случае H_D>- воду вылить. Будет новый объект. Но внутрь влезть нельзя. Объект дается
Здравствуйте, Sinclair, Вы писали:
S>Ладно, давайте дальше смотреть. Ага, неэффективная Джава? Ребята, в очень большом классе задач джава рвет серверные приложения на плюсах на раз-два. Потому, что сборка мусора выполняется ой как редко. А плюсы, несмотря на все свои преимущества по сравнению с С, тем не менее все построены на постоянных перевыделениях памяти.
C++ дает возможность реализовать любую стратегию выделения и освобождения памяти, в том числе и сборку мусора like Java. Другой вопрос уже — какими трудозатратами это обернется. Есть и еще более оптимальные варианты Например — выделять часть своих объектов в специальном пуле, а когда они стали не нужны — просто убить этот пул вместе со всеми объектами. Порой можно даже деструкторы не звать В ряде сценариев такой сценарий будет вполне пригоден, и где там будет Java по скорости? Упирается все в тот же сакраментальный вопрос — а сколько времени уйдет на отладку? Ну и прямые руки опять же очень нужны... а за прямые руки нужно хорошо платить — проще нанять пару-тройку недоученных студентов и посадить за яву.
Здравствуйте, Дарней, Вы писали:
Д>C++ дает возможность реализовать любую стратегию выделения и освобождения памяти, в том числе и сборку мусора like Java.
Ну, если быть совсем честным, то именно "как Java" не выйдет. Java (как и .NET) использует метаданные для анализа графа достижимости. В плюсах придется предоставлять эти метаданные вручную (например, регистрировать указатели). Д>Другой вопрос уже — какими трудозатратами это обернется. Есть и еще более оптимальные варианты Например — выделять часть своих объектов в специальном пуле, а когда они стали не нужны — просто убить этот пул вместе со всеми объектами.
Согласен. На плюсах можно реализовать очень неплохbt сценарии управления памятью. Но основная проблема в том, что все они требуют использования вспомогательных классов вместо С-style указателей и функций. При этом запретить использование такого legacy-подхода нельзя. А это означает, что нерадивый программист где-то вызовет malloc — и упс... Д>Ну и прямые руки опять же очень нужны... а за прямые руки нужно хорошо платить — проще нанять пару-тройку недоученных студентов и посадить за яву.
Именно. Хороший код малыми силами — вот наш девиз.
... << RSDN@Home 1.1.2 beta 2 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, Дарней, Вы писали:
S>Ну, если быть совсем честным, то именно "как Java" не выйдет. Java (как и .NET) использует метаданные для анализа графа достижимости. В плюсах придется предоставлять эти метаданные вручную (например, регистрировать указатели).
угу. smart-pointer'ы или макросы (тьфу-тьфу-тьфу) наверняка спасут отца русской демократии. Хотя если быть совсем уж честным, реализации метаданных для С++ тоже есть — Qt, например. Если нет желания завязываться на библиотеку — можно использовать аналогичный подход и сделать своими силами хотя бы простенький генератор метаданных (не так это и страшно, как звучит)
S>Согласен. На плюсах можно реализовать очень неплохbt сценарии управления памятью. Но основная проблема в том, что все они требуют использования вспомогательных классов вместо С-style указателей и функций. При этом запретить использование такого legacy-подхода нельзя. А это означает, что нерадивый программист где-то вызовет malloc — и упс...
безусловно — помешать кому-то накосячить в С++ никак не получится. А использовать вспомогательные классы — это совсем не проблема, на то и есть шаблоны.
S>Именно. Хороший код малыми силами — вот наш девиз.
Так что преимущества Явы по скорости — это спекуляция...
При желании и наличии ресурсов (sic!) код на С++ можно оптимизировать так, что любой managed-код будет плестись далеко в хвосте. При сравнениях Java vs C++ vs .NET про возможности оптимизации обычно забывают.
Хотя возможно, что введение генериков в .NET разрыв подсократит — посмотрим, что у них получится
Здравствуйте, Дарней, Вы писали:
Д>Так что преимущества Явы по скорости — это спекуляция... Д>При желании и наличии ресурсов (sic!) код на С++ можно оптимизировать так, что любой managed-код будет плестись далеко в хвосте. При сравнениях Java vs C++ vs .NET про возможности оптимизации обычно забывают.
Такой подход нас заведет очень далеко. Потому, что в managed коде тебе никто не запрещает выделить один раз пару сотен метров под байтовый массив и реализовать свой deterministic finalization поверх него. Корявенько конечно будет, но "далеко в хвосте" превратится в лучшем случае в "плотно в затылок". Подобный подход на самом деле используется народом, который клепает performance-critical сервисы на жабе. И он действительно сильно помогает.
В общем, предлагаю этот подход замять и подумать над тем, какие возможности по оптимизации общих алгоритмов предоставляют наши подходы. Плюсы несомненно быстрее С, как я уже упоминал, по простой причине — они позволяют написать алгоритмы более общего вида, преобразующиеся в тот же самый asm, что и частные алгоритмы на С. С быстрее ассемблера потому, что на нем можно написать алгоритмы более общего вида. Когда выходит новый процессор, нам уже не надо скрупулезно менять местами опкоды, учитывая его особенности — достаточно просто перекомпилять новым компилятором.
Теперь поглядим на managed среды. В пассиве у них GC. А что в активе?
— JIT теоретически может генерить более оптимальный код, благодаря тому, что он компиляет не под x86 Blend, а под конкретный Model, Stepping, и Extension Set.
— Хотспоттинг теоретически позволяет делать глобальные оптимизации, недоступные С++ по определению (если только не весь код лежит в одном main.cpp ) Д>Хотя возможно, что введение генериков в .NET разрыв подсократит — посмотрим, что у них получится
Верно. Посмотрим, что они сделают к версии 1.5 Пока что у .NET по поводу производительности есть теоретические преимущества и практические недостатки . Хотя это, конечно же, не умалает его практических преимуществ по скорости разработки (а мы действительно живем в таком мире, где для подавляющего большинства софта Time To Market играет значительно более важную роль, чем performance. Возможность выпустить продукт на полгода раньше конкурентов вполне может привести к захвату рынка, несмотря на 50% недостаток в производительности. Увы.)
... << RSDN@Home 1.1.2 beta 2 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, Дарней, Вы писали:
S>Такой подход нас заведет очень далеко. Потому, что в managed коде тебе никто не запрещает выделить один раз пару сотен метров под байтовый массив и реализовать свой deterministic finalization поверх него. Корявенько конечно будет, но "далеко в хвосте" превратится в лучшем случае в "плотно в затылок". Подобный подход на самом деле используется народом, который клепает performance-critical сервисы на жабе. И он действительно сильно помогает.
таки да. С другой стороны — и все преимущества GC такой подход сведет на нет, и даст разработчикам широкое поле для совершения косяков
S>В общем, предлагаю этот подход замять и подумать над тем, какие возможности по оптимизации общих алгоритмов предоставляют наши подходы. Плюсы несомненно быстрее С, как я уже упоминал, по простой причине — они позволяют написать алгоритмы более общего вида, преобразующиеся в тот же самый asm, что и частные алгоритмы на С. С быстрее ассемблера потому, что на нем можно написать алгоритмы более общего вида. Когда выходит новый процессор, нам уже не надо скрупулезно менять местами опкоды, учитывая его особенности — достаточно просто перекомпилять новым компилятором.
с этим еще можно поспорить. Без агрессивной оптимизации кода (которая зачастую приводит к вырождению проги из С++ в "плоский" С) прога на С++ будет все-таки медленнее, чем сишная прога. За всё нужно расплачиваться, за удобство программирования — в том числе.
Положение выравнивается только благодаря шаблонам (пример с сортировкой массива через std::sort и сишный sort — это уже просто классика). Только много ли програмеров толково их используют?
S>Теперь поглядим на managed среды. В пассиве у них GC. А что в активе?
я бы назвал еще возможность динамической генерации кода — в потенциале тоже очень могучий механизм оптимизации
S>Верно. Посмотрим, что они сделают к версии 1.5 Пока что у .NET по поводу производительности есть теоретические преимущества и практические недостатки .
это был бы просто праздник Ну а пока у них получается на удивление достойный продукт (за вычетом некоторых странностей)... который наверняка займет определенную нишу
Здравствуйте, Hacker_Delphi, Вы писали:
H_D>Вот отрывок из книши одного очень хорошего писателя: H_D>
H_D> - Долгая история. Все дело в том, что местные программисты пошли
H_D>по неверному пути. Этот путь называется объектно ориентированный подход
H_D>в программировании. На самом деле это мина с часовым механизмом в
H_D>красивой упаковке. В очень красивой упаковке. Как с этим бороться, я
H_D>не знаю. Упустил момент.
H_D> - Мастер, ближе к делу.
H_D> - Знаешь анекдот, как программист кипятит чайник. Дано: пустой
H_D>чайник, кран, спички, газовая плита. Программа действий: наполнить
H_D>чайник водой из-под крана, поставить на плиту, зажечь газ. Ждать, пока
H_D>закипит чайник. Эта программа оформляется как объект. Второй случай.
H_D>Все то же самое, но чайник с водой уже стоит на плите. Действия
H_D>программиста: вылить воду из чайника и выполнить предыдущий объект.
H_D> - Грустно. А нырнуть внутрь объекта нельзя? Туда, где надо газ
H_D>зажечь?
H_D> - Нельзя. Можно добавить новое свойство или действие. В нашем случае
H_D>- воду вылить. Будет новый объект. Но внутрь влезть нельзя. Объект дается
H_D>как единое целое. Никто не знает, что там внутри. Все давно забыли, откуда
H_D>ноги растут. В результате получается колоссальное дублирование кода и данных
H_D>и огромная потеря производительности компьютера. С каждым годом компьютеры
H_D>требуют все больше памяти, а работают все медленнее.
H_D>
H_D>Которая лишь подтверждает мысль, что ООП везде — это вред и блед, хотя и не отрицает что в бизнес приложениях ООП — это просто круто
Да ну, бред какой. Да, есть такой прием в риторике — сделать заведомо ложное утверждение, а на его основе построить цепочку логичных следствий. Поскольку следствия действительно объективны, то оппнент теряет из виду тот факт, что сделаны то они на основе ложного утверждения.
>> в результате получается колоссальное дублирование кода и данных
Это при том, что одно из основных назначений ООП — повторное использование, т.е. борьба с дублированием.
Что касается конкретного примера — там надо унаследоваться от этого объекта перекрыть метод "зачечь газ", добавив туда проверку на наличие воды.
И вообще, там допущена грубая ошибка проектирования: действия по своей природе не являющиеся атомарными, объединены в одну транзакцию.
Так что проблема не в ООП, а в неверном понимании ООП.
Здравствуйте, Hacker_Delphi, Вы писали:
H_D>Нет нельзя.. представь, что вместо чайника — объект ядра ОС... (там-то про то, что ОСы ОО стали).
Очень это интересно, где разрабатываются такие ОСи, в которых пользователю можно менять объекты ядра не имея исходников, менять задачи ОС и пр. И кому оно надо?
Т.е. недовольство вызвано тем, что в ОО ОСях нельзя менять ядро? Странно это ))))))))))))
P.S. принимайте все за шутку, как и дурь про чайник.
Здравствуйте, Дарней, Вы писали:
Д>таки да. С другой стороны — и все преимущества GC такой подход сведет на нет, и даст разработчикам широкое поле для совершения косяков
Короче говоря, все это очень старые и очень распространенные заблуджения. И что языки высокого уровня медленнее, и что сборка мусора снижает производительность, и что XML ПО СУТИ страшно тормозно. Спорить можно, но бесполезно. Я так думаю, что эти заблуждения сродни еще одному — "про мышку и клавиатуру", связано непонятно с чем и неисправимо.
Здравствуйте, Poudy, Вы писали:
P>Короче говоря, все это очень старые и очень распространенные заблуджения. И что языки высокого уровня медленнее, и что сборка мусора снижает производительность, и что XML ПО СУТИ страшно тормозно. Спорить можно, но бесполезно. Я так думаю, что эти заблуждения сродни еще одному — "про мышку и клавиатуру", связано непонятно с чем и неисправимо.
и практика эти "заблуждения" прекрасно подтверждает, как ни странно. Обидно, да?
Ну, любезный, у меня Office XP работал на P166MMX, 48 MB RAM. И при этом бытсрее, чем 97. А до этого стоял Office 2000. Он тоже быстрее 97, хотя и медленнее XP. Так что не надо — сначала проверяйте, а потом слова собеседника сомнению подвергайте!
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, dad, Вы писали:
К>>>Но инкапсуляция не есть фича ООП!!! Она также присуща и процедурному программированию. К>>>В данном случае — имеем криво спроектированный процедурный API.
dad>>Как же инкапсуляция не фича ООП? dad>>три фичи (кита) ООП — инкапсуляция полиморфизм и наследование. гыгы
К>Полиморфизм и инкапсуляция также (в ограниченной степени) присущи процедурному программированию. С наследованием действительно обломс.
мда.. значит кроме как наследование... у ООП нет явных приемуществ?! гы2
а экспонирование типов-интерфейсов?
К>>Полиморфизм и инкапсуляция также (в ограниченной степени) присущи процедурному программированию. С наследованием действительно обломс.
MA>мда.. значит кроме как наследование... у ООП нет явных приемуществ?! гы2 MA>а экспонирование типов-интерфейсов?
полноценным ОО инстурментом считается тот, который пердоставляет возможности разработки
с использование наслед, инкапс, полиморф, создания классов, сериализацию, многопоточность,
и еще кое что. таковым является, например, ява.
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
К>>>Полиморфизм и инкапсуляция также (в ограниченной степени) присущи процедурному программированию. С наследованием действительно обломс.
MA>>мда.. значит кроме как наследование... у ООП нет явных приемуществ?! гы2 MA>>а экспонирование типов-интерфейсов?
dad>полноценным ОО инстурментом считается тот, который пердоставляет возможности разработки dad>с использование наслед, инкапс, полиморф, создания классов, сериализацию, многопоточность, dad>и еще кое что. таковым является, например, ява.
всё очень размыто...
многопоточность — это всего лишь один из классов при чем тут ОО...
а ...создания классов... я бы сказал... конструкторы экземпляров классов
MA>>>мда.. значит кроме как наследование... у ООП нет явных приемуществ?! гы2 MA>>>а экспонирование типов-интерфейсов?
dad>>полноценным ОО инстурментом считается тот, который пердоставляет возможности разработки dad>>с использование наслед, инкапс, полиморф, создания классов, сериализацию, многопоточность, dad>>и еще кое что. таковым является, например, ява.
MA>всё очень размыто...
это у тебя размыто.
MA>а ...создания классов... я бы сказал... конструкторы экземпляров классов
нет именно определения классов, поскольку создавать объекты класса ты можешь и в явескрипт
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
Здравствуйте, Ведмедь, Вы писали:
В>Ну почему надо цепляться за конкретный пример и говорить, что пример неправильный, поэтому автор не прав?
Исходная посылка неверна, следовательно статья смысла не имеет.
В>Понятно, что приведенный пример высосан из пальца. Но проблема выделена по моему достаточно ясно : Невозможность(трудоемкость или неудоно) изменить логику работы обьекта, когда он уже спроектирован и написан. И это проблемы ООП, а не архитектора.
Это пальцем в небо. Еси процедура написана, то нихрена ты с ней не сделаешь. Если программа написана, тож самое. Куда ни ткни, то все парадигмы отстойные. Пишется всягда то, что надо в лижайшем и немного отдаленном удущем. Как написать нечто на все случаи жизни знает только великий Джа. Я так не умею.
Здравствуйте, dad, Вы писали:
dad>>>полноценным ОО инстурментом считается тот, который пердоставляет возможности разработки dad>>>с использование наслед, инкапс, полиморф, создания классов, сериализацию, многопоточность, dad>>>и еще кое что. таковым является, например, ява.
MA>>а ...создания классов... я бы сказал... конструкторы экземпляров классов
dad>нет именно определения классов, поскольку создавать объекты класса ты можешь и в явескрипт
разработка с использованием наследования = создание (написание ) классов
наверно руками или с помощью RAD?
Здравствуйте, Larm, Вы писали:
L> Там шлось про какие-то очень адвансовые пакеты управления киберами или что-то в таком духе. Это тебе не строчки копировать Писалось все это не одним поколением программеров, так что переделать это — без шансов — там диаграмма иерархии на 900 гиг будет, а исполняются эти проги на сотнях параллельных процессоров (это у самы хпримитивных экземляров) .
Да-а... Зачем только с ООП связались, глупые... Не связывались бы => не написали бы столько... (вообще бы не написали почти ничего) => и проблем не было бы... и киберов этих... кому они только нужны?
L> А вот брать и юзать готовые объекты и, если надо, добавлять в них новую функциональность,- это пожалуйста. Ну не знаешь ты, что этот объект отнаследован в 965 колене от другого, у которого можно немного изменить нужный метод. Пост был о том, что когда библиотека большая и тебе дейтсвительно надо ее расширить (не потратив полжизни на изучение ее структуры ), то возникает проблема того, что ты не знаешь, как оно работает. Вот это автор и хотел показать. В этом и есть проблема ООП, а не в том, что это медленнее функционального программирования на С
dad>>>>полноценным ОО инстурментом считается тот, который пердоставляет возможности разработки dad>>>>с использование наслед, инкапс, полиморф, создания классов, сериализацию, многопоточность, dad>>>>и еще кое что. таковым является, например, ява.
MA>>>а ...создания классов... я бы сказал... конструкторы экземпляров классов
dad>>нет именно определения классов, поскольку создавать объекты класса ты можешь и в явескрипт
MA>разработка с использованием наследования = создание (написание ) классов MA>наверно руками или с помощью RAD?
да действительно — наседование неотъемлемая часть возможносити создания классов
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
Здравствуйте, Plutonia Experiment, Вы писали:
PE>Здравствуйте, Ведмедь, Вы писали:
В>>Ну почему надо цепляться за конкретный пример и говорить, что пример неправильный, поэтому автор не прав?
PE>Исходная посылка неверна, следовательно статья смысла не имеет.
В>>Понятно, что приведенный пример высосан из пальца. Но проблема выделена по моему достаточно ясно : Невозможность(трудоемкость или неудоно) изменить логику работы обьекта, когда он уже спроектирован и написан. И это проблемы ООП, а не архитектора.
PE>Это пальцем в небо. Еси процедура написана, то нихрена ты с ней не сделаешь. Если программа написана, тож самое. Куда ни ткни, то все парадигмы отстойные. Пишется всягда то, что надо в лижайшем и немного отдаленном удущем. Как написать нечто на все случаи жизни знает только великий Джа. Я так не умею.
Я тоже не великий Джа ( а ксати, кто это такой? )
НА самом деле имется ввиду то что ООП не являеется панацей от всех бед. На данном этапе развития роазработки ПО ООП лучше других подходов решает текущие задачи. ( Ну может быть еще АОП вклинится в ближайшее время ). НО не факт что это лучший из возможных, это луший из известных подходов. Возможно в дальнейшем будет найдело лучшее средство. И будет ли это дальшнейшим развитием ООП или будет иметь другие корни это еще открытый вопрос.
Здравствуйте, Ведмедь, Вы писали:
В>Я тоже не великий Джа ( а ксати, кто это такой? )
Мнение о том что великий Джа умеет писать программы нестандартным образом сильно преувеличенно, так же как и то что только Билли может писать программы ж#$@#ой
А Джа это... (пы-ы-ыф...) Джа он бог и ему можно... (пы-ы-ыф)
Здравствуйте, maikLa, Вы писали:
L>Здравствуйте, Ведмедь, Вы писали:
В>>Я тоже не великий Джа ( а ксати, кто это такой? )
L>Мнение о том что великий Джа умеет писать программы нестандартным образом сильно преувеличенно, так же как и то что только Билли может писать программы ж#$@#ой
L>А Джа это... (пы-ы-ыф...) Джа он бог и ему можно... (пы-ы-ыф)
А где можно нарыть свящзенные тексты про Джа? Где живут его адепты и вся остальная информация о Джа?
Здравствуйте, maikLa, Вы писали:
L>Здравствуйте, Larm, Вы писали:
L>> Там шлось про какие-то очень адвансовые пакеты управления киберами или что-то в таком духе. Это тебе не строчки копировать Писалось все это не одним поколением программеров, так что переделать это — без шансов — там диаграмма иерархии на 900 гиг будет, а исполняются эти проги на сотнях параллельных процессоров (это у самы хпримитивных экземляров) .
L>Да-а... Зачем только с ООП связались, глупые... Не связывались бы => не написали бы столько... (вообще бы не написали почти ничего) => и проблем не было бы...
тож постоянно задумываюсь : ЧЕГО БУДЕТ НО БУДЕТ НЕЧТО (совсем немного после периода .NET )
Здравствуйте, Ведмедь, Вы писали:
В>Здравствуйте, maikLa, Вы писали:
L>>Здравствуйте, Ведмедь, Вы писали:
В>>>Я тоже не великий Джа ( а ксати, кто это такой? )
L>>Мнение о том что великий Джа умеет писать программы нестандартным образом сильно преувеличенно, так же как и то что только Билли может писать программы ж#$@#ой
L>>А Джа это... (пы-ы-ыф...) Джа он бог и ему можно... (пы-ы-ыф)
В>А где можно нарыть свящзенные тексты про Джа? Где живут его адепты и вся остальная информация о Джа?
Здравствуйте, Ведмедь, Вы писали:
В>А где можно нарыть свящзенные тексты про Джа? Где живут его адепты и вся остальная информация о Джа?
Джа — это бог растафарианской религии (про растаманов слыхал? так вот, это не просто планокуры, а религия такая).
В сети об этом можно почитать:
всерьёз — коротенько здесь и весьма подробно здесь
не всерьёз — классические растаманские сказки
Здравствуйте, Зверёк Харьковский, Вы писали:
ЗХ>Здравствуйте, Ведмедь, Вы писали:
В>>А где можно нарыть свящзенные тексты про Джа? Где живут его адепты и вся остальная информация о Джа?
ЗХ> не всерьёз — классические растаманские сказки
Не всерьез — ссылка такая же как и предудщая, если не сложно исправь...
................ AVK>while (!teapot.Content.IsBoiled) AVK> System.Threading.Sleep(checkInterval); AVK>[/c#]
AVK>Так что нефиг свою криворукость списывать на недостатки ООП.
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, dad, Вы писали: dad>>нет именно определения классов, поскольку создавать объекты класса ты можешь и в явескрипт S>в javascript классов нет. Там только объекты.
Как так классов нет? Не скажу, конечно, что там полноценная поддержка ООП, но описать вой класс там вполне возможно
Здесь мы описываем класс
Здравствуйте, seregaa, Вы писали: S>Как так классов нет? Не скажу, конечно, что там полноценная поддержка ООП, но описать вой класс там вполне возможно S>Здесь мы описываем класс
Это не класс. Это функция — генератор объектов.
... << RSDN@Home 1.1.3 beta 2 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, seregaa, Вы писали: S>>Как так классов нет? Не скажу, конечно, что там полноценная поддержка ООП, но описать вой класс там вполне возможно S>>Здесь мы описываем класс S>Это не класс. Это функция — генератор объектов.
Наверное так оно и есть.
Класс на самом деле нигде не описывается.
Здравствуйте, seregaa, Вы писали:
S>Наверное так оно и есть. S>Класс на самом деле нигде не описывается.
Это очевидно хотя бы из того, что в любой момент я могу кнопке приписать метод или свойство, поменяв, таким образом, ее структуру, и не затрагивать другие кнопки.
Вместо классов есть прототипы — когда ты делаешь new Date или new Array, клонируется специальный "корневой" объект, доступ к которому можно получить при помощи свойства Array.prototype. Точнее, у всех объектов JScript есть свойство prototype, которое и возвращает объект, клонируемый операцией new.
... << RSDN@Home 1.1.3 beta 2 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Hacker_Delphi, Вы писали:
H_D>Вот отрывок из книши одного очень хорошего писателя:
итд, итп
Я конечно тут новенький. На правильность мнения не претендую.
Но хочу заметить, что в некоторых ХОРОШИХ книжках по ПРОЕКТИРОВАНИЮ
есть один постулатик:
ООП — это головная боль и проблемы (подобные подводной мине), если не потратил очень много времени на Проектирование.
И ООП — это супер, если не пожалел сил на проектирование.
В этом вся суть.
Вообще из моего опыта пргр. хочу заметить, что при ООП-программировании рано или поздно приходится садится и заниматься НОРМАЛЬНЫМ проектированием, иначе код загаживается страшно.
При функциональном пргр. можно и обойтись.