|
|
|
О правилах разработки...
|
|||
|---|---|---|---|
|
#18+
Добрый день! Мысль мне подкинули, хочется услышать, что по этому поводу опытные думают. "Класс должен быть или абстрактным, или финальным". Объяснение- "иначе конфликтует требование к конкретной функциональности и идеи для потомков". -- Алексей Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2007, 16:15 |
|
||
|
О правилах разработки...
|
|||
|---|---|---|---|
|
#18+
GKS_Samara Мысль мне подкинули, хочется услышать, что по этому поводу опытные думают. "Класс должен быть или абстрактным, или финальным". Объяснение- "иначе конфликтует требование к конкретной функциональности и идеи для потомков". С моей точки зрения это экстремизм. Например, иногда удобнее формулировать общие для предков свойства, интерпретируя это как конструкцию "как правило". [src] # как правило, у собаки 4 ноги класс Собака: def числоНог(self): return 4; # у собаки перееханной трамваем число ног зависит от собаки класс СобакаПерееханнаяТрамваем(Собака): def __init__(self, числоНог): self.числоНог = числоНог def числоНог(self): return self.числоНог [src] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2007, 16:50 |
|
||
|
О правилах разработки...
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2007, 16:51 |
|
||
|
О правилах разработки...
|
|||
|---|---|---|---|
|
#18+
belugin Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Вот именно поэтой причине (код выше) и возникают мысли, что наследование главное зло на планете и следует всеми возможными способами его избегать :) "Число ног" - это просто изменяемое свойство "Собаки". При помощи наследование можно создавать классификации только на основе неизменяемых свойств объектов. Классификации на основе изменяемых свойств (перееханные и перетраханные собаки) - в основном ноненс. GKS_Samara "иначе конфликтует требование к конкретной функциональности и идеи для потомков". Если LSP не нарушается, то всё будет в порядке. Можно в свободное время помедитировать над классом Object c методами Equals, HashCode. Или посмотреть на шаблон Composite в различных имплементациях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2007, 17:37 |
|
||
|
О правилах разработки...
|
|||
|---|---|---|---|
|
#18+
GKS_SamaraМысль мне подкинули, хочется услышать, что по этому поводу опытные думают. "Класс должен быть или абстрактным, или финальным". Выдающаяся глупость, сказать которую может только человек, который никогда не погружался в программирование глубже использования готовых решений. Красота такого подхода легко демонстрируется на простом примере. Допустим, я хочу сделать компонент "как JLabel", но в дополнение к его функционалу обладающий еще какой-нибудь мелкой деталью. Например, приобретающий красный цвет, если надпись в нем содержит грамматическую ошибку. Естественное решение - наследоваться от JLabel. А какой у нас JLabel - абстрактный али финальный? Если второе - наше желание идет лесом, и мы начинаем извращаться. Если первое - значит, страдают все, кому нужен JLabel без дополнений и кто в результате не может просто так взять и инстанциировать его. Таким образом с практической точки зрения это сведется вот к чему: выпуская любую библиотеку классов, я буду вынужден продублировать каждый публичный ее класс. Если раньше были, допустим, JLabel, JButton, JText - то теперь я должен буду сделать JLabel, JFinalLabel, JButton, JFinalButton, JText, JFinalText. В результате чего всем участникам процесса станет намного, намного удобнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2007, 17:53 |
|
||
|
О правилах разработки...
|
|||
|---|---|---|---|
|
#18+
softwarerКрасота такого подхода легко демонстрируется на простом примере. Допустим, я хочу сделать компонент "как JLabel", но в дополнение к его функционалу обладающий еще какой-нибудь мелкой деталью. Например, приобретающий красный цвет, если надпись в нем содержит грамматическую ошибку. Естественное решение - наследоваться от JLabel. Вот сейчас смотрю на иерархию (все имена вымышленные, любые совпадения считать случайными): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. и думаю: а всякое ли "естественное решение" небезобразно? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2007, 18:06 |
|
||
|
О правилах разработки...
|
|||
|---|---|---|---|
|
#18+
NotGonnaGetUsи думаю: а всякое ли "естественное решение" небезобразно? :) Как Вам сказать... думаю, Вы уже пару лет как в курсе моего мнения относительно красоты явовских решений; имхо авторы набросились на специализацию классов примерно так же, как неумный человек - на поклонение Господу. Это вызывает вполне понятные последствия и у кода, опирающегося на эти классы. Тем не менее, принципа это ничуть не трогает. Задача "взять и немного доработать напильником" - одна из наиболее распространенных в практическом программировании. Если мы вдруг попробуем решать ее не наследованием - натолкнемся на две проблемы: во-первых, необходимость строить иерархию классов, параллельную уже существующей (совершенно идиотское занятие и особенно при отсутствии множественного наследования; тот же Swing это хорошо показывает); во-вторых, несовместимость наших классов со стандартными (как следствие - невозможность для любого стандартного кода, в том числе третьих авторов, работать с нашими объектами). Вторую проблему придется смягчать введением стопроцентно покрывающих класс интерфейсов.... в общем, уйма геморроя на пустом месте. Все оттого, что кому-то захотелось поиграть в солдатики. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2007, 18:18 |
|
||
|
О правилах разработки...
|
|||
|---|---|---|---|
|
#18+
NotGonnaGetUs... Вот сейчас смотрю на иерархию (все имена вымышленные, любые совпадения считать случайными): возможно глупый вопрос как ты сделал такое представление иерархии ? ручками или утилитой кокой? мне понравилось это простое и понятное текстовое представление дерева ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2007, 18:39 |
|
||
|
О правилах разработки...
|
|||
|---|---|---|---|
|
#18+
softwarer Тем не менее, принципа это ничуть не трогает. Задача "взять и немного доработать напильником" - одна из наиболее распространенных в практическом программировании. Если мы вдруг попробуем решать ее не наследованием - натолкнемся на две проблемы: во-первых, необходимость строить иерархию классов, параллельную уже существующей (совершенно идиотское занятие и особенно при отсутствии множественного наследования; тот же Swing это хорошо показывает); во-вторых, несовместимость наших классов со стандартными (как следствие - невозможность для любого стандартного кода, в том числе третьих авторов, работать с нашими объектами). Доработка напильником не такая тривиальная задача как кажется. Хотя бы из-за того, что "дорабатывать" можно разными способами и нужно уметь сделать "правильный" выбор. Усугубляется всё тем, что "правильный" выбор в кроткосрочной и долгосрочной перспективах получается совершенно различным. Н-р, охинея с комбобоксами возникла в результате последовательных применений "быстрых" доработок. В идеале, такие изменения в последствии приводятся к товарному виду путём рефакторинга. На практике, чем больше кода с охиней написано, тем меньше возможности осуществить такой рефакторинг, т.к. он повлечёт прибольшущие расходы как по времени на правку кода, так и на тестирование этих изменений. К тому риск словить после этого багу в продакшине сильно растёт. Про иерархию выше, могу сказать только одно. Она бы существенно схлопнулась, если наследование было заменено декомпозицей. Н-р, созданием классов валидаторов, рендереров и т.д. Создавать по классу наследнику для каждого типа отображаемых значений в каждом из контекстов где оно может использоваться - бред. Это всё равно, что для Пети дома делать класс ПетяДома extends Человек, а для Пети на работе - класс ПетяНаРаботе extends Человек. Благо, что ругаемый вами swing построен так, что позволяет задавать валидаторы, рендереры и иже с ними для станадртных компонент, что не приводит ни к возникновению параллельных иерархий, ни к не совместимости со стандартными классами. Если правильно готовить :) Я это пишу не к тому, что принцип озвученный вами не имеет право на жизнь, а к тому, что необходимости думать он не отменяет. 0bsid возможно глупый вопрос как ты сделал такое представление иерархии ? ручками или утилитой кокой? мне понравилось это простое и понятное текстовое представление дерева Idea. Ctrl-H - смотрим на панель с деревом наследования. Затем выделяем интересующие классы, Ctrl-C, Ctrl-V в любимый текстовый редактор и руками ставим табуляцию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2007, 21:46 |
|
||
|
О правилах разработки...
|
|||
|---|---|---|---|
|
#18+
NotGonnaGetUsДоработка напильником не такая тривиальная задача как кажется. Не надо уводить разговор в сторону, давайте сосредоточимся на теме. Предлагаю простой и незамысловатый выбор: 1. Вы утверждаете, что правильная доработка никогда не делается наследованием, и мы начинаем это обсуждать. 2. Вы согласны с тем, что часть правильных доработок делается наследованием. В этом случае мы сосредотачиваемся на них и в свете оных обсуждаем мой пример и его связь с первоначальной темой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2007, 23:15 |
|
||
|
О правилах разработки...
|
|||
|---|---|---|---|
|
#18+
softwarer Тем не менее, принципа это ничуть не трогает. Задача "взять и немного доработать напильником" - одна из наиболее распространенных в практическом программировании. Это да. Но вот к чему это приводит? Заплатки- тоже распространенная практика, но не от хорошей жизни. С чего все началось- с обсуждения одной небольшой системой управления предприятием. Где наследование формочек (delphi) и панелек зашло так далеко, что при правке чего-либо одного приводит к фантастическим эффектам в другом месте. Т.е. наследники заложились на цвет кнопочки вооооон там, а тут его поменяли. Цвет- это так, для ясности :) -- Алексей Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2007, 11:18 |
|
||
|
О правилах разработки...
|
|||
|---|---|---|---|
|
#18+
GKS_Samara С чего все началось- с обсуждения одной небольшой системой управления предприятием. Где наследование формочек (delphi) и панелек зашло так далеко, что при правке чего-либо одного приводит к фантастическим эффектам в другом месте. Дело только в том, что из кривизны конкретных воплощений не следует то, что кривой сам принцип. Такую благую вещь, как паттерны тоже можно применить таким образом, что потом люди еще десятилетиями будут тыкать пальцем и плеваться. Да и оно всегда так - никакие принципы не отменяют принцип номер 0: думать надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2007, 11:25 |
|
||
|
О правилах разработки...
|
|||
|---|---|---|---|
|
#18+
GKS_SamaraЭто да. Но вот к чему это приводит? К нормальной работе. GKS_SamaraЗаплатки- тоже распространенная практика, но не от хорошей жизни. Хм. Ваша фраза показывает одну мою ошибку: я не уточнил, что под "практическим программированием" имел в виду то, что делают вменяемые и профессиональные люди. Заплатки я к этой категории не отношу. GKS_SamaraС чего все началось- с обсуждения одной небольшой системой управления предприятием. Где наследование формочек (delphi) и панелек зашло так далеко, что при правке чего-либо одного приводит к фантастическим эффектам в другом месте. Т.е. наследники заложились на цвет кнопочки вооооон там, а тут его поменяли. Цвет- это так, для ясности :) Безусловно, любую иерархию классов можно спроектировать неудачно; вполне возможно, получилось что-то вроде того, что ранее привел NotGonnaGetUs . Однако, не наследование тому виной, и указанный принцип от этого не спасет. Показать это проще всего тривиальным примером: допустим, мы взяли описанную Вами "плохую" структуру, взяли те классы, которые одновременно инстанциируются и имеют наследников и привели их в соответствие этому принципу: отпочковали от них тривиальных наследников и стали инстанциировать именно их. И что, программе от того станет лучше? Визуальное наследование - отдельная интересная тема, но и там действует общий принцип. Формально то, что Вы сказали, можно сформулировать так: - был некий класс - у этого класса то ли был контракт, то ли наследник считал, что этот контракт есть - в результате изменений контракт оказался нарушен. Да, при плохой работе это легко может случиться. И абстрактно-финальные классы этого никак не меняют. В качестве универсального метода - можно предположить, что надо было не менять базовый класс, а выделить из него новый (финальный или промежуточный) и сделать изменения там. Хотя это далеко не всегда будет хорошим решением. Так или иначе, сформулированный принцип здесь - в лучшем случае, борьба с симптомами, а не с причиной. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2007, 12:30 |
|
||
|
О правилах разработки...
|
|||
|---|---|---|---|
|
#18+
softwarer - у этого класса то ли был контракт, то ли наследник считал, что этот контракт есть - в результате изменений контракт оказался нарушен. О! Понятно. Да, по сути наследник должен расчитывать только на то, что явно описано в контракте. Контракты увы, ни в delphi ни в java не внедряются, а комментарии их заменяют очень фигово, но лучше так, чем ничего. eiffel- не в этой жизни :) softwarer Так или иначе, сформулированный принцип здесь - в лучшем случае, борьба с симптомами, а не с причиной. Да, согласен. Мне кажется, что по затронутой теме все прояснилось (хотя кто его знает). -- Алексей Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2007, 08:10 |
|
||
|
О правилах разработки...
|
|||
|---|---|---|---|
|
#18+
GKS_SamaraКонтракты увы, ни в delphi ни в java не внедряются, "Увы" здесь имхо лишнее. GKS_Samaraа комментарии их заменяют очень фигово, Контракт должен быть в голове, вернее читаться головой из структуры программы. Вспомним, что идеальная программа - не нуждается в комментариях. Этого нереально достигнуть на микроуровне, но на структурном, на уровне крупных объектов, к этому можно и нужно приблизиться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2007, 14:11 |
|
||
|
О правилах разработки...
|
|||
|---|---|---|---|
|
#18+
softwarer GKS_SamaraКонтракты увы, ни в delphi ни в java не внедряются, "Увы" здесь имхо лишнее. Почему лишнее? softwarer Контракт должен быть в голове, вернее читаться головой из структуры программы. Но явно написанный в заголовке с проверкой при выполнении (require) или при тестах (ensure) - все же лучше, imho. -- Алексей Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2007, 14:54 |
|
||
|
О правилах разработки...
|
|||
|---|---|---|---|
|
#18+
GKS_SamaraНо явно написанный в заголовке с проверкой при выполнении (require) или при тестах (ensure) - все же лучше, imho. Как Вам сказать.... это детские игры. Тут есть пара моментов. 1. Ничего глобального таким образом не опишешь. Попробуйте сформулировать контракт, который например для дельфы скажет: "перед вызовом деструктора формы обязательно должно быть вызвано событие OnClose". То, что метод X должен быть вызван с параметром Y, значение которого не больше Z - чепуха, легко вылавливаемая и легко контролируемая кучей способов. Основные проблемы - архитектурные, а как раз на них никакого вменяемого формального контракта не навесишь. 2. Наиболее интересные проверки - промежуточные, а не входные-выходные. "Метод вызван с неправильным параметром" - гораздо более приятная ошибка, нежели, например, "sql-запрос в середине логической цепочки вернул ноль строк". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2007, 15:41 |
|
||
|
О правилах разработки...
|
|||
|---|---|---|---|
|
#18+
softwarer 1. Ничего глобального таким образом не опишешь. Попробуйте сформулировать контракт, который например для дельфы скажет: "перед вызовом деструктора формы обязательно должно быть вызвано событие OnClose". Очевидно, что OnClose меняет состояние объекта. Т.е. оно теперь принадлежит некому подмножеству В, а не А. Вот это и задается требованием. softwarer 2. Наиболее интересные проверки - промежуточные, а не входные-выходные. "Метод вызван с неправильным параметром" - гораздо более приятная ошибка, нежели, например, "sql-запрос в середине логической цепочки вернул ноль строк". Вынести запрос в отдельный метод, возвращающий набор строк результата и постулировать, что результат его не пуст. Другое дело, что тут будет двойная выборка... Надо думать на тему оптимизации компилятором... -- Алексей Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2007, 16:18 |
|
||
|
О правилах разработки...
|
|||
|---|---|---|---|
|
#18+
GKS_SamaraОчевидно, что OnClose меняет состояние объекта. Совершенно не очевидно. Если, конечно, не делать этого специально. GKS_SamaraВот это и задается требованием. То есть мы начинаем ломать программу под попытку ее проверить. Это порочная практика. GKS_SamaraВынести запрос в отдельный метод, возвращающий набор строк результата То же самое. Представьте себе, что гаечный ключ, который Вы купили, для применения к автомобилю требует предварительно выломать из него задние сидения или, допустим, перекрасить его в зеленый цвет. Нужен Вам такой инструмент? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2007, 16:28 |
|
||
|
О правилах разработки...
|
|||
|---|---|---|---|
|
#18+
softwarer GKS_SamaraОчевидно, что OnClose меняет состояние объекта. Совершенно не очевидно. Если, конечно, не делать этого специально. А что ж он делает тогда? softwarer То есть мы начинаем ломать программу под попытку ее проверить. Это порочная практика. Это почему? Программа не ломается. Да, пример с sql - это крайний случай, там не обойтись без спецификации. Контракт- не панацея, это удобный инструмент для некоторых случаев. И его отсутствие- привычно, но неудобно. Ведь в любой java-программе встречаются вещи типа "а вот этот параметр должен быть таким-то" "а вот этот exception кидается если мы вот это нарушили". Проблема в том, что при рефакторинге может быть рассинхронизация, либо в наследнике кто-то усилит требования. Контракт снимает эти проблемы. Я не говорю, что он снимает все проблемы. -- Алексей Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2007, 16:36 |
|
||
|
О правилах разработки...
|
|||
|---|---|---|---|
|
#18+
GKS_SamaraА что ж он делает тогда? Код: plaintext 1. 2. 3. Как Вы предлагаете в деструкторе проверить, вызывался этот код или нет? GKS_SamaraКонтракт- не панацея, это удобный инструмент для некоторых случаев. И его отсутствие- привычно, но неудобно. Во-первых, кто Вам сказал, что они отсутствуют? Отсутствует максимум - ненужная и вредная поддержка этого инструмента со стороны языка. Точно так же древние языки поддерживали средства работы с файлами, которые сейчас перенесены в куда более подходящее место. GKS_SamaraВедь в любой java-программе встречаются вещи типа "а вот этот параметр должен быть таким-то" "а вот этот exception кидается если мы вот это нарушили". И? Контракты не дают здесь ничего нового. Есть исключения, есть assert-ы, есть трассировка некритических ошибок и тревожных признаков. GKS_SamaraКонтракт снимает эти проблемы. Ничуть. Это всего лишь менее удобный способ сообщить об этих проблемах. Менее удобный - потому что для проверки "вернул ли запрос строки" мне достаточно написать assert, а "контрактнику" придется переделывать структуру класса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2007, 17:12 |
|
||
|
О правилах разработки...
|
|||
|---|---|---|---|
|
#18+
softwarer wrote: > Во-первых, кто Вам сказал, что они отсутствуют? Отсутствует максимум - > ненужная и вредная поддержка этого инструмента со стороны языка. А как мне просто записать, что "вот это должно выполнятся, иначе по башке получишь"? Чтобы наследники по-умолчанию проверяли, но можно было явно отключить? И чтобы при смене менялось все автоматом, а не править в двух местах? > Менее удобный - потому что для проверки "вернул ли запрос строки" мне > достаточно написать assert, а "контрактнику" придется переделывать > структуру класса. А assert'ы в контрактном программировании тоже есть. -- Алексей Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2007, 17:40 |
|
||
|
О правилах разработки...
|
|||
|---|---|---|---|
|
#18+
GKS_SamaraА как мне просто записать, что "вот это должно выполнятся, иначе по башке получишь"? Assert - для того, для чего подходит. Ну или любые аналогичные средства. Но архитектурных проблем это не исправит. GKS_SamaraЧтобы наследники по-умолчанию проверяли, но можно было явно отключить? Полиморфизм. Тут важно не только это; важно то, что если наследник вызывает inherited - должны провериться контракты предка. Как раз это и будет. GKS_SamaraИ чтобы при смене менялось все автоматом, а не править в двух местах? Не понял вопроса. Вернее, не понял, какую ситуацию Вы подразумеваете. GKS_SamaraА assert'ы в контрактном программировании тоже есть. Есть. Как вынужденная мера. Контрактное программирование - это по сути бесполезная надстройка над придуманным не помню кем простым и маленьким макросом ASSERT. Какой-то смысл у нее появляется с точки зрения автоматической верификации кода, впрочем.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2007, 17:47 |
|
||
|
О правилах разработки...
|
|||
|---|---|---|---|
|
#18+
softwarer Полиморфизм. Тут важно не только это; важно то, что если наследник вызывает inherited - должны провериться контракты предка. Как раз это и будет. Но это не устраняет возможность появления такой ошибки, как ужесточение входного требования. Очень грубой ошибки, кстати. softwarer GKS_Samara И чтобы при смене менялось все автоматом, а не править в двух местах? Не понял вопроса. Вернее, не понял, какую ситуацию Вы подразумеваете. Рассмотри два исскуственный пример: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. А теперь рассмотрим тот же пример, как будто в java есть контракт Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Существенный плюс, на мой взгляд. Учитывая то, что ООП-то было задумано для устранения дублирования кода ensure- это несколько уменьшает потребность в unit-тестах ;) softwarer Контрактное программирование - это по сути бесполезная надстройка над придуманным не помню кем простым и маленьким макросом ASSERT. Контрактное программирование - это способ жестко увязать декларацию, документацию и реализацию. Что в java приходится делать вручную. -- Алексей Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2007, 08:10 |
|
||
|
О правилах разработки...
|
|||
|---|---|---|---|
|
#18+
GKS_SamaraНо это не устраняет возможность появления такой ошибки, как ужесточение входного требования. А что же устраняет возможность появления такой ошибки? Разве что редактор, который в момент написания кода высветит ошибку и не даст сохранить такой текст... GKS_SamaraОчень грубой ошибки, кстати. Очень простой, приятной и дешевой ошибки. В то время как интересна - борьба с серьезными ошибками. GKS_SamaraТут приходится дублировать и сам exception, Это персональная дурость явы, которую можно и нужно записать в минусы языку, но никак не концептуальный недостаток "всех языков". Лично я предпочитаю следующую точку зрения: в Delphi подпрограммы определяются с обязательным использованием ключевого слова procedure, в Яве подпрограммы определяются с обязательным использованием ключевых слов thows Throwable. GKS_Samara и текст. Где? Не вижу в примере дублирования текста. Или другую явовскую дурость под названием javadoc также относим к программе? GKS_SamaraА теперь рассмотрим тот же пример, как будто в java есть контракт .... Дублирования кода _нет_. Не вижу, какое именно дублирование кода устранено. Ткните, пожалуйста, пальцем. А лучше - давайте так: я пишу тот же самый пример - Код: plaintext 1. 2. 3. 4. 5. - а Вы покажите, пожалуйста, чем его улучшит введение контракта. GKS_SamaraСущественный плюс, на мой взгляд. Учитывая то, что ООП-то было задумано для устранения дублирования кода Это, простите, отдельная глупость. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2007, 14:48 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=35015184&tid=1345608]: |
0ms |
get settings: |
9ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
197ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
88ms |
get tp. blocked users: |
1ms |
| others: | 245ms |
| total: | 582ms |

| 0 / 0 |
