LINUX.ORG.RU

Зачем нужно ООП

 


2

3

Далёк я буду от правды если скажу, что единственная причина появления ООП - нельзя было сказать draw(circle) и draw(rectange) в одной программе (где rectange и circle - переменные с различными структурами)?

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

Пусть будет racket, а не limbo.

Мне просто интересно было. Я знаю как наследовать модули в Racket и в CL (там чуть сложнее, но то, что пакеты — первоклассные объекты, спасает). А про лимбо всегда думал как про потомка паскаля. В паскале и обероне точно модули не расширяемые так как весь интерфейс надо прописывать явно (нет формулировки «экспортровать всё импортированное»).

monk ★★★★★
()
Ответ на: комментарий от no-dashi

Ваш нормальные динамические языки уже научились строгой типизации с compile-time проверками

Если речь, например, про Racket, то да. Более того, все нарушения структуры макросов или опечатки в именах переменных на этапе ввода в DrRacket проверяются.

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

это кривое мертвое подделие?

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

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

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

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

потому-что это костыли и признание несостоятельности

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

В процессе разработки действительно малополезно, но по окончании, когда производится только исправление ошибок, не менее полезная штука, чем valgrind для C/C++.

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

костыли и признание несостоятельности

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

написать пару лишних тестов

пара лишних тестов - не серебряная пуля

не заморачиваться такими вопросами, когда тебе это не нужно

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

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

К какой именно части цитаты претензия? Почему ты думаешь что KDE, винда итд - написаны огромными сворами индусов?

lovesan ★★★
()

Не понимаешь ООП - вон из профессии!!!

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

Претензий нет. Ты в контексте обсуждения ООП утверждаешь что «программирование как вид деятельности не масштабируется», я задаю логичный вопрос - а как развиваются такие масштабные проекты как KDE или Windows 10? Либо ты ошибаешься и программирование (в том числе с помощью средств ООП) хорошо масштабируется, либо...А что тут может быть либо?

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

Чувак, все очень просто. В крупных командах - два-три человека делают всю работу, а остальные нужны для ИБД и отмывания бабла.

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

Да, именно так. Да хоть для разработки гугла.

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

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

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

Ты упоролся, там десятки миллионов строк кода. Просто чтоб набрать их с клавиатуры 3 человекам жизней не хватит.

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

ОК, пусть так. Но тогда получается что твоё исходное утверждение «программирование как вид деятельности не масштабируется» - ложь. Если как ты утверждаешь для 2-3 человек десятки миллионов строк кода не проблема, то программирование не просто хорошо, а превосходно масштабируется с помомщью «кодогенерации и копипасты».

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

да, так и есть. слава роботам!

И ты опять же не понял исходное утверждение. Я говорил как раз о том что программирование это не кирпичи складывать, и нельзя просто взять и нанять 100 индусов и дать им жабу и ооп, и ожидать что все будет отлично через 3 условных месяца. Горизонтальное масштабирование в программировании как виде деятельности - не работает. «Мифический человекомесяц», вот все это.

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

нельзя просто взять и нанять 100 индусов и дать им жабу и ооп, и ожидать что все будет отлично через 3 условных месяца

Windows. 1000 индусов и всё отлично. Что-то не сходятся твои утверждения с реальностью либо я тебя не понимаю.

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

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

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

Ты очень плохо знаешь, что такое команда разработки Windows

Да, но я подозреваю что ты тоже не входишь в эту команду и даже в совет директоров MS ))

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

Но в том и дело, что там 10 миллионов будет без кодогенерации и копипасты (кстати, какие 10 миллионов? мы вроде о крупных проектах говорим, а 10кк строк - это средней величины студенческая поделка, с такой действительно полдесятка индусов справится).

Тут ситуация примерно как с распараллеливанием софта - есть некоторая «линейная» нераспраллеливаемая часть, и остаток, который можно распихать по независимым нодам. Так вот, по факту все содержание программирования исключительно в том, чтобы привести задачу к виду с «минимальной» линейной частью. Тогда и оказывается, что какие-то там пара сотен тысяч строк десятой винды пишутся 3 людьми, а оставшиеся сотня-другая миллионов - прекрасно распределяются между любым разумным количеством индусов.

anonymous
()

Очевидно же. Если draw(circle) и draw(rectange) работают правильно, то в circle и rectange есть байтик по которому draw их различает. Чудес не бывает.

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

Эм. Лимбо из план9, его придумывали и пиарили Керриган и Ритчи вроде

Я понял: http://en.wikipedia.org/wiki/Limbo_(programming_language)

Но синтаксис модулей сильно напоминает паскаль/ада. Вот я и заинтересовался как в таких языках можно красиво прикрутить расширение/наследование модулей.

monk ★★★★★
()
Ответ на: комментарий от no-dashi

Да ну? Ты сдаешь в сортировку контейнер, ты отдаешь в сортировку компаратор. И если второе может быть функцией, то первое - объект, со свойствами (размером) и методами/операциями - типа «обменять i'й и j'й элемент местами», «взять подмножество» и т.п. Аналогично с тем же поиском - на входе контейнер/итератор и компаратор (возможно и контейнер-приемник), на выходе - объект или множество объектов.

CL-USER> (sort (list 1 2 3 4 5 6 7) #'>)
(7 6 5 4 3 2 1)

Ох уж это мне ООП головного мозга. Воистину, людям-молоткам везде мерещатся гвозди.

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

Теперь делаем предположение, что внутри списка не простые сравниваемые сущности:

v.add(new Location(1,2));
v.add(new Location(3,10));
v.add(new Location(5,11));
v.add(new Location(11,5));
final Location me = new Location(5.5,6.1);
Collections.sort( v,
   new Comparator<Location> { 
      public int compare(Location l1, Location l2) {
         if (distance(l1,me)>distance(l2,me)) return 1;
         if (distance(l1,me)<distance(l2,me)) return -1;
         return 0;
      }
   }
);
После этого твой код превращается в то же самое с точностью до синтаксических конструкций.

no-dashi ★★★★★
()
Ответ на: комментарий от monk

Я знаю как наследовать модули в Racket

А вот отнаследоваться от абстрактного класса в racket нельзя. Классам в ракетке соответствуют юниты, а не модули. Собственно именно это (возможность «уточнить» зависимости «задним числом», в потомке) и есть основная фишка, которую ООП дает поверх модулей.

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

что внутри списка не простые сравниваемые сущности

Значит и функцию сортировки нужно передать не простую:

CL-USER> (sort '((1 "Jon") (2 "Jan") (3 "Иван")) 
               #'(lambda (x y) (funcall #'> (car x) (car y))))
((3 "Иван") (2 "Jan") (1 "Jon"))
CL-USER> (sort '((1 "Jon") (2 "Jan") (3 "Иван")) 
               #'(lambda (x y) (funcall #'string<= (cadr x) (cadr y))))
((2 "Jan") (1 "Jon") (3 "Иван"))
CL-USER> 

Однако, это всё к делу не относится. Лучше объясни, в какой момент (list ...) стал объектом (или классом?)?

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

Лучше объясни, в какой момент (list ...) стал объектом (или классом?)?

А в какой момент он перестал быть классом с набором операций/методов и свойств?

no-dashi ★★★★★
()
Ответ на: комментарий от Manhunt

людям естественно думать в терминах объектов и их (взаимо)действий.

Ага. Так и вижу. Собирается девочка Саша за хлебом и думает: «Так, мне нужен родительский класс Магазин от которого я отнаследую класс Булочная. В Магазине я определю виртуальный метод покупка() и переопределю её в Булочной. Или нет, может покупка() должна быть методом класса Деньги?». Спрашивает у подружки Яны, а та ей в ответ: «Ты что, дурёха. Так за хлебом сейчас никто не ходит. Для начала реализуй абстрактную фабрику синглетонов. Вот тебе книга <<Паттерны проектирования проектов похода за хлебом>>, прочитай, а то как из деревни приехала.».

Очень естественно так думать, да.

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

так речь там идет о проверке в compile time, притом что язык должен быть динамическим.

CL-USER> (+ 1 2 3 "Абырвалг")
Argument Y is not a NUMBER: "Абырвалг"
   [Condition of type SIMPLE-TYPE-ERROR]

Restarts:
 0: [RETRY] Retry SLIME REPL evaluation request.
 1: [*ABORT] Return to SLIME's top level.
 2: [ABORT] Abort thread (#<THREAD "repl-thread" RUNNING {10079E8063}>)

Фразу «argument is not a number» сам переведёшь или помочь?

ugoday ★★★★★
()
Ответ на: комментарий от no-dashi

А в какой момент он перестал быть классом с набором операций/методов и свойств?

Кажется, я всё понял. Функция это объект. Продолжение это объект. Замыкание --- вообще объект-объект. И даже небо, даже аллах.

Вот, дети, что бывает, когда человек слишком долго программирует на Яве.

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

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

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

К модулю обращаются через интерфейс, модуль может иметь множество имплементации, загружается нужная имплементация динамически. Можно сделать и «фабрику», в принципе. Т.е. для модулей вполне себе реализуется принцип открыт/закрыт по Б.Мейеру.

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

А в эрланге можно что хочешь с чем хочешь сравнивать.

.. определив операцию сравнения для соответствующих типов. Чем это отличается от переопределения операторов в плюсах или компараторов в жабе, кроме синтаксиса?

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

Хотя не, это я напутал, это не расширяемость. Расширяемость придётся руками, как я понимаю. Но самое главное, что реализация модуля не зафиксирована жестко.

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

Кажется, я всё понял. Функция это объект.

Функция несущая контекст - да, объект. И как ты этот объект определяешь, уже чисто особенности языка. Ты правильно понял. Потому что ООП - это мягко говоря не только ключевое слово «class» в спецификации языка.

no-dashi ★★★★★
()
Ответ на: комментарий от no-dashi

определив операцию сравнения

Не надо ничего определять. Открой шел и сравнивай что хочешь с чем хочешь.

Чем это отличается от переопределения операторов в плюсах или компараторов в жабе, кроме синтаксиса?

Тем, что нужно написать ровно 0 строк кода.

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

Функция несущая контекст - да, объект.

Здравствуйте, мы всё ещё говорим о list?

Функция несущая контекст - да, объект.

Или монада. Смотря чем упарывался человевек-молоток.

ugoday ★★★★★
()
Ответ на: комментарий от no-dashi

Функция несущая контекст - да, объект.

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

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

Тем, что нужно написать ровно 0 строк кода.

Да-да, а правила сравнения священый эрланг возьмет из астрала.

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

Правила он конечно возьмет из головы пользователя и разработчика астрал. Надо только подумать «отсортировать по фамилии», сказать (sort-list (list)) - и он отсортирует по фамилии. Потом подумать «отсортировать по имени», сказать (sort-list (list)) - и он отсортирует по имени. Потом подумать «а теперь снова по фамилии, но в обратном порядке», написать (sort-list (list)) - и он отсортирует по фамилии в обратном порядке!

no-dashi ★★★★★
()
Ответ на: комментарий от no-dashi

а правила сравнения

… у тебя наверное тоже объект, да? С инкапсуляцией и полиморфизмом небось? Пс, чувак, не хочешь немного приватных членов класса?

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

Абстрактный пример. Функция как объект с оператором вызова.

class Function {
    Context contextVars;
    Function(args,...) { context.assign(args); }
    ResultType <call>(a,b,c) {
         return context.arg1*a + context.arg2*b+context.arg3*c;
    }
}
Function f = new Function(a1,a2,a3);
f(1,2,3);
f(2,3,4);
Что такое f - это функция или объект?

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

Это тебе лучше у хаскельнутых спрашивать.

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