Re[21]: Куда девать ф-ции внешние для класса
От: stump http://stump-workshop.blogspot.com/
Дата: 22.07.08 10:56
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, stump, Вы писали:


S>>А тебе не приходило в голову, что для одного и того же кейса может быть несколько архитектурных решений и все правильные?


AVK>Приходило. Только вот наличие двух методов в публичном контракте, делающих одно и то же — это точно неправильное решение.

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

S>> Похоже нет.


AVK>Переходим на личности?

Вовсе нет, еще держусь, хотя некоторые по мне тут уже потоптались.
Просто в твоем ответе сквозит такая уверенность в существовании "правильной архитектуры". Слово "правильная" к архитектуре и дизайну софта вообще не применимо (ИМХО). Для любого более менее сложного случая, можно сделать несколько вариантов дизайна, и они вудут работать так требуется, и никакими метриками в рантайме не отличишь, какой код лучше работает.
Можно говорить об приемлимом дизайне, подходящем для данного случая, лучшем по сравнению с чем то другим, дающем преимущества в чем то и т.д. Но когда я слышу про правильную архитектуру, я стараюсь удержаться от улыбки.
Но это все мое ИМХО.
Понедельник начинается в субботу
Re[22]: Куда девать ф-ции внешние для класса
От: MozgC США http://nightcoder.livejournal.com
Дата: 22.07.08 11:01
Оценка: +2
Здравствуйте, stump, Вы писали:

S>Просто в твоем ответе сквозит такая уверенность в существовании "правильной архитектуры". Слово "правильная" к архитектуре и дизайну софта вообще не применимо (ИМХО). Для любого более менее сложного случая, можно сделать несколько вариантов дизайна, и они вудут работать так требуется, и никакими метриками в рантайме не отличишь, какой код лучше работает. Но когда я слышу про правильную архитектуру, я стараюсь удержаться от улыбки.


Возможно просто под правильной архитектурой можно понимать разные рабочие и качественные варианты решения задачи. Необязательно имеется в виду какой-то один конкретный вариант.
Re[23]: Куда девать ф-ции внешние для класса
От: Ziaw Россия  
Дата: 22.07.08 11:09
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Вот как раз именно по тому что этот код объемен и часто меняется, его и лучше обособить и оградить контрактом, чтобы минимизировать неконтроллируемые корреляции с другими кусками кода.


Спасибо, кое что прояснилось. Согласен, если вынос логики в хелпер обусловлен не соображениями использования методом приватных данных, а более четким ограничением контракта — он имеет смысл если имеет смысл само ограничение.
... << RSDN@Home 1.2.0 alpha 4 rev. 0>>
Re[14]: Куда девать ф-ции внешние для класса
От: IB Австрия http://rsdn.ru
Дата: 22.07.08 11:35
Оценка:
Здравствуйте, stump, Вы писали:

S>Давай каждый свои мысли будет продолжать

Тогда не останавливайся на пол-пути.. =)

S>Так ведь то что ты предлагаешь (b.foo()) это и есть "accessing local data of another module", т.е. самый сильный тип связности.

Ты не отличаешь local от public contract или просто прикидываешься?

S> Что с того что он все эти данные тягает через паблик интерфейс класса A, от этого все эти данные не перестают быть локальными данными класса А.

Перестают. Local — это именно приватные данные класса, его внутреннее состояние не доступное из вне.

S>Relational cohesion: average number of internal relationships per type:

Ты ошибаешься, мы говорим именно о связности, я тебе даже определение привел.

S>Тут все зависит от сценария применения DI.

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

S>Ну, хотелось чтоб и авторитетное и аргументированное, шоб просто пригвоздило меня и все

Не пригвоздило еще?

S>Смотри, это проектирование. Ты сначала определяешь область ответственности и потом под нее делаешь класс. Все что не входит в эту область отвественности — гэть долой из класса.

О, прикольно. То есть, запихнули все в класс, что влезно и назвали это одной ответственностью...

S>Вот ты даже не заметил, что я определил область ответственности для калсса как "представление данных", а ты как "хранение данных".

Я как раз заметил, и совершенно сознательно поправил на хранение. То есть, твоя ошибка в том, что ты не правильно определил область ответственности класса?

S>Четкий это критерий или не четкий, решай сам.

Совершенно не четкий.

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

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

S>Как она изменится? Вероятно тем, что я смогу в функции получить доступ к приватным членам,

Именно.

S> Функция стала частью интерфейса класса. Те классы что зависят от этой функции так же под контролем как и были.

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

S> зависимости класса В от класса А теперь нет.

Ее и раньше не было, точнее была контролируемая между A и B, а стала не контролируемая между A и foo().

S>Может повлиять а может не повлиять, что с того.

О, как ты заговорил.. Хорошо уже что признаешь проблему.

S>В любом случае, если изменения семантики существенные будет ошибка компилятора.

В том-то и дело, что совсем не факт, что будет.

S> Если изменения не в семантике, на то модульные тесты есть.

Модульные тесты не являюются панацеей и нельзя наличием модульных тестов оправдывать кривую архитектуру.

S>Твой вариант от этого тоже не застрахован.

Он застрахован от этого в большей степени.

S>Даже так. Ладно, будем считать, что я этого не читал.

Это любимый способ решать проблему?
... << RSDN@Home 1.2.0 alpha rev. 673>>
Мы уже победили, просто это еще не так заметно...
Re[18]: Куда девать ф-ции внешние для класса
От: IB Австрия http://rsdn.ru
Дата: 22.07.08 11:35
Оценка:
Здравствуйте, MozgC, Вы писали:

MC>Я попросил показать реальный пример про String раз вы утверждаете что он реализован неправильно и эти функции надо было вынести в отдельные классы.

Мне сложно судить занятие чем, мешает тебе экстраполировать мой пример на класс String. =)

MC>Так и думал что вы так напишите. Как достойно с вашей стороны было прокомментировать это мое замечание.

Было бы недостойно оставить такое замечание без внимания..
... << RSDN@Home 1.2.0 alpha rev. 673>>
Мы уже победили, просто это еще не так заметно...
Re[18]: Куда девать ф-ции внешние для класса
От: IB Австрия http://rsdn.ru
Дата: 22.07.08 11:46
Оценка: -1
Здравствуйте, Ziaw, Вы писали:

Z>Между тем мне лично ими удобнее пользоваться.

Лично мне все равно. У тебя же пользование DI дискомфорта не вызывает?
Но дело не в этом.

Z> Может быть это и есть причина по которой МС пошли на удорожание поддержки?

Вряд ли. Удобство весьма сомнительное, а проблем можно огрести достаточно.
... << RSDN@Home 1.2.0 alpha rev. 673>>
Мы уже победили, просто это еще не так заметно...
Re[19]: Куда девать ф-ции внешние для класса
От: MozgC США http://nightcoder.livejournal.com
Дата: 22.07.08 11:59
Оценка:
Здравствуйте, IB, Вы писали:

MC>>Я попросил показать реальный пример про String раз вы утверждаете что он реализован неправильно и эти функции надо было вынести в отдельные классы.

IB>Мне сложно судить занятие чем, мешает тебе экстраполировать мой пример на класс String. =)
Понял, реальных примеров привести не можете. Только голая теория.
— Ну вот надо все эти методы надо было вынести в отдельные классы, потому что в противном случае это косяк.
— Почему косяк?
— Ну вот связность, и все такое, и Мейерс заявил что "они ошибаются"
— На практике в чем косяк?
— Ну я же писал.. что косяк..
— Так в чем косяк на практие?
— Ну связность.. и Мейерс говорил..
Re[15]: Куда девать ф-ции внешние для класса
От: stump http://stump-workshop.blogspot.com/
Дата: 22.07.08 12:02
Оценка:
Здравствуйте, IB, Вы писали:

IB>Здравствуйте, stump, Вы писали:


S>>Давай каждый свои мысли будет продолжать

IB>Тогда не останавливайся на пол-пути.. =)
Ага...

S>>Так ведь то что ты предлагаешь (b.foo()) это и есть "accessing local data of another module", т.е. самый сильный тип связности.

IB>Ты не отличаешь local от public contract или просто прикидываешься?
foo() использует локальные данные класса А, то что ты заставил ее работать через паблик интерфейс не меняет сути.

S>> Что с того что он все эти данные тягает через паблик интерфейс класса A, от этого все эти данные не перестают быть локальными данными класса А.

IB>Перестают. Local — это именно приватные данные класса, его внутреннее состояние не доступное из вне.
Т.е. данные класса, опубликованные через паблик интерфейс перестают быть данными класса. Оч интересно.

S>>Relational cohesion: average number of internal relationships per type:

IB>Ты ошибаешься, мы говорим именно о связности, я тебе даже определение привел.
Это не я ошибаюсь. Это была цитата.

S>>Тут все зависит от сценария применения DI.

IB>Это ни коим образом не зависит от "сценария применения DI", уменьшение связности — это свойство DI вынесенное в его определение.
IB>Он применяется, когда уже есть связь (внутренняя), чтобы вынести ее во внешний контракт и тем самым ослабить связность. То есть, сделать ровно то, о чем мы тут говорим.
Разница в трактовке роли внутренних связей. Но против этого мне нечего возразить, убедил.

S>>Ну, хотелось чтоб и авторитетное и аргументированное, шоб просто пригвоздило меня и все

IB>Не пригвоздило еще?
Неа..

S>>Смотри, это проектирование. Ты сначала определяешь область ответственности и потом под нее делаешь класс. Все что не входит в эту область отвественности — гэть долой из класса.

IB>О, прикольно. То есть, запихнули все в класс, что влезно и назвали это одной ответственностью...
Опять начинаешь... Черным по зеленому написано сначала определяешь ответственность, потом на этом критерии принимаешь решение что включать, а что нет.

S>>Вот ты даже не заметил, что я определил область ответственности для калсса как "представление данных", а ты как "хранение данных".

IB>Я как раз заметил, и совершенно сознательно поправил на хранение. То есть, твоя ошибка в том, что ты не правильно определил область ответственности класса?
Не ошибка, а точка знения, не "неправильно" а по-другому. Тут в другой ветке обсуждали дизайн System.String (http://www.rsdn.ru/Forum/message/3031451.aspx
Автор: Ziaw
Дата: 22.07.08
) и обнаружили что предлагаемый правильный дизайн намного неудобнее использовать чем существующий "неправильный".


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

IB>Не начинает. Любая реализация должна пытаться обойтись публичным контрактом, если удалось — значит снаружи, если же по каким-то причинам (не важно по каким, производительность ли это или в публичном контракте чего-то не хватает), контрактом обойтись не удалось — значит внутри. Все очень просто и никаких неоднозначностей.


S>>Как она изменится? Вероятно тем, что я смогу в функции получить доступ к приватным членам,

IB>Именно.

S>> Функция стала частью интерфейса класса. Те классы что зависят от этой функции так же под контролем как и были.

IB>Нет. Ты больше не контролируешь связь между функцией и классом внутрь которого ее поместил.
Почему это. Ты эту фразу уже раз шесть повторил как заклинание и не разу не объяснил, где же там конкретно контроль теряется? Компилятор соответствие типов или наличие членов престает там контролировать?
S>> зависимости класса В от класса А теперь нет.
IB>Ее и раньше не было, точнее была контролируемая между A и B, а стала не контролируемая между A и foo().
Ну вот опять. Контролируемая — неконтролируемая. Чем неконтролируемая связь отличается от контролируемой. В каких конкретно аспектах теряется контроль

S>>Может повлиять а может не повлиять, что с того.

IB>О, как ты заговорил.. Хорошо уже что признаешь проблему.
Хорошо что ты заметил. Я не ортодокс.

S>>В любом случае, если изменения семантики существенные будет ошибка компилятора.

IB>В том-то и дело, что совсем не факт, что будет.
Че за компилятор такой?

S>> Если изменения не в семантике, на то модульные тесты есть.

IB>Модульные тесты не являюются панацеей и нельзя наличием модульных тестов оправдывать кривую архитектуру.
Конечно. Вот отсутствие модульных тесов можно оправдывать кривой архитектурой В-общем это офтоп.

S>>Твой вариант от этого тоже не застрахован.

IB>Он застрахован от этого в большей степени.

S>>Даже так. Ладно, будем считать, что я этого не читал.

IB>Это любимый способ решать проблему?
Это была твоя проблема, что ты не можешь себя сдерживать в рамках приличий.
Понедельник начинается в субботу
Re[22]: Куда девать ф-ции внешние для класса
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 22.07.08 12:14
Оценка:
Здравствуйте, stump, Вы писали:

AVK>>Приходило. Только вот наличие двух методов в публичном контракте, делающих одно и то же — это точно неправильное решение.

S>Это методы разных классов, и не факт что они делают одно и то-же

А если они делают не годно и то же, тогда для продолжения обсуждения нужна информация о том, чем они отличаются и для чего это нужно. Нодиайн в любом случае негодный — понять тому, кто это будет применять, почему там два метода невозможно, можно только запомнить.

S>, да и моя реплика этого не касалась.


Ты отвечал на мое сообщение, в котором была ровно одна фраза.

AVK>>Переходим на личности?

S>Вовсе нет

Вовсе да. Я тебя уже просил не делать выводов о квалификации собеседников.

S>, еще держусь, хотя некоторые по мне тут уже потоптались.


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

S>Просто в твоем ответе сквозит такая уверенность в существовании "правильной архитектуры"


Тебе показалось. Если что то предполагаешь — не надо гадать и заниматься демагогией, можно просто прямо задать вопрос.

S>Слово "правильная" к архитектуре и дизайну софта вообще не применимо (ИМХО). Для любого более менее сложного случая, можно сделать несколько вариантов дизайна, и они вудут работать так требуется, и никакими метриками в рантайме не отличишь, какой код лучше работает.


Это вопрос, совсем далекий от темы топика. Если интересно его обсудить — заводи отдельный топик.
... << RSDN@Home 1.2.0 alpha 4 rev. 1095 on Windows Vista 6.0.6001.65536>>
AVK Blog
Re[16]: Куда девать ф-ции внешние для класса
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 22.07.08 12:14
Оценка: +1
Здравствуйте, Aikin, Вы писали:

A>Ага, в Строке нужно использовть внутренние более эффективные механизмы нахождения сисла символов (детей), а в точно такой-же задаче (топикстартера) нужен дополнительный класс; IndexOf() для Строки -- внутренний метод (из соображений производительности), а GetUniqChildName() (c тем же принципом) внешний.


A>Ну-ну.


Что ну-ну. Принцип сформирован предельно ясно — если можно сделать внешним, значит нужно сделать внешним. Не надо к нему додумывать несуществующих дополнений, а потом радостно их опровергать. Не ищи подвоха там, ге его нет. Если перформанс критичен (а в случае string он критичнее некуда) — значит нужно это учитывать. То, что перформанс очень часто конфликтует с хорошим дизайном — ну что поделаешь. Надо искать золотую середину, когда и дизайн не слишком плох, и перформанс приемлем.

AVK>>Никаких оговорок. Приемлемая производительность не может быть реализована толькопубличным контрактом — метод нельзя помещать во внешний класс.

A>Что-то я этого предложения в правиле не заметил.

А оно там не нужно. В правиле не конкретизируется вообще, по какой причине не получается пользоваться только внешним контрактом. А если не конкретизируется — значит причина может быть любой.

AVK>>По тому, который в этом треде обсуждается.

A>Извините, но я как-то выпал из дискуссии (многабукаф -- ниасилил

Придется осилить. Работать аннотатором у меня никакого желания нет. И за падоначью лексику здесь банят.

AVK>>Для удобства умные люди придумали extension methods.

A>Ну как-бы так сказать -- пока у меня к ним негативное отношение.

Это, уж извини, твои личные проблемы.

A>Чего стоит только мозгоразрывательный этюд:


Эти этюды малоинтересны с точки зрения практического использования.

A>И после этого вы хотите сказать, что экстеншен методы это хорошо?


Да.
... << RSDN@Home 1.2.0 alpha 4 rev. 1095 on Windows Vista 6.0.6001.65536>>
AVK Blog
Re[19]: Куда девать ф-ции внешние для класса
От: Ziaw Россия  
Дата: 22.07.08 12:31
Оценка: 1 (1) +1
Здравствуйте, IB, Вы писали:

IB>Здравствуйте, Ziaw, Вы писали:


Z>>Между тем мне лично ими удобнее пользоваться.

IB>Лично мне все равно. У тебя же пользование DI дискомфорта не вызывает?
Вызывает, но по совокупности воздействий добавляет больше комфорта.
Да и прямой аналогии DI с сабжем я не вижу.

Z>> Может быть это и есть причина по которой МС пошли на удорожание поддержки?

IB>Вряд ли. Удобство весьма сомнительное, а проблем можно огрести достаточно.

Т.е. все архиекторы библиотек работы со строками .net, java, python, ruby допустили одну и ту же ошибку дизайна?

Меня больше устраивает другая версия: они все проектировали так, чтобы людям было удобнее ее использовать.
Видимо посчитали, что вам будет все равно, а мне приятно
... << RSDN@Home 1.2.0 alpha 4 rev. 0>>
Re[17]: Куда девать ф-ции внешние для класса
От: Aikin Беларусь kavaleu.ru
Дата: 22.07.08 12:44
Оценка:
AVK>А оно там не нужно. В правиле не конкретизируется вообще, по какой причине не получается пользоваться только внешним контрактом. А если не конкретизируется — значит причина может быть любой.
А вы спросили топикстартера о том, что для него критично, а что нет? Нет, не спросили. Вы сразу стали гнуть свою линию.
О том что в этой линии есть исключения (ну как бы даже не исключения, а уточнения к самому определению, и даже не к определению, а к некоторым словам, ...) стало известно много ниже.

AVK>>>По тому, который в этом треде обсуждается.

A>>Извините, но я как-то выпал из дискуссии (многабукаф -- ниасилил

AVK>Придется осилить. Работать аннотатором у меня никакого желания нет.

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

AVK> И за падоначью лексику здесь банят.

Хочется нехорошее сказать, но промолчу.
Re[18]: Куда девать ф-ции внешние для класса
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 22.07.08 13:19
Оценка:
Здравствуйте, Aikin, Вы писали:

AVK>>А оно там не нужно. В правиле не конкретизируется вообще, по какой причине не получается пользоваться только внешним контрактом. А если не конкретизируется — значит причина может быть любой.

A>А вы спросили топикстартера о том, что для него критично, а что нет? Нет, не спросили. Вы сразу стали гнуть свою линию.

Во-первых не сразу, во-вторых топик стартер спрашивал кто как поступает, а не как ему самому сделать.

A>О том что в этой линии есть исключения (ну как бы даже не исключения, а уточнения к самому определению, и даже не к определению, а к некоторым словам, ...) стало известно много ниже.


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

AVK>> И за падоначью лексику здесь банят.

A>Хочется нехорошее сказать, но промолчу.

Промолчи.
... << RSDN@Home 1.2.0 alpha 4 rev. 1095 on Windows Vista 6.0.6001.65536>>
AVK Blog
Re[19]: Куда девать ф-ции внешние для класса
От: Aikin Беларусь kavaleu.ru
Дата: 22.07.08 13:24
Оценка: :))) :)
Re[16]: Куда девать ф-ции внешние для класса
От: IB Австрия http://rsdn.ru
Дата: 22.07.08 16:01
Оценка:
Здравствуйте, stump, Вы писали:

S>foo() использует локальные данные класса А, то что ты заставил ее работать через паблик интерфейс не меняет сути.

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

S>Т.е. данные класса, опубликованные через паблик интерфейс перестают быть данными класса.

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

S>Это не я ошибаюсь. Это была цитата.

Просто она была не к месту. =)

S>Разница в трактовке роли внутренних связей. Но против этого мне нечего возразить, убедил.

То есть, за DI ты признаешь право уменьшить звязность путем вынесения внутренней связи во внешний контракт, а за просто выносом метода — нет?

S>Черным по зеленому написано сначала определяешь ответственность, потом на этом критерии принимаешь решение что включать, а что нет.

Что мешает определить ответственность как "все что делает эта программа"?

S> Тут в другой ветке обсуждали дизайн System.String (http://www.rsdn.ru/Forum/message/3031451.aspx
Автор: Ziaw
Дата: 22.07.08
) и обнаружили что предлагаемый правильный дизайн намного неудобнее использовать чем существующий "неправильный".

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

S>Почему это. Ты эту фразу уже раз шесть повторил как заклинание и не разу не объяснил, где же там конкретно контроль теряется? Компилятор соответствие типов или наличие членов престает там контролировать?

Компилятор перестает следить за доступом к приватным переменным.

S>Вот отсутствие модульных тесов можно оправдывать кривой архитектурой В-общем это офтоп.

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

S>Это была твоя проблема, что ты не можешь себя сдерживать в рамках приличий.

Что я такого неприличного написал?!
... << RSDN@Home 1.2.0 alpha rev. 673>>
Мы уже победили, просто это еще не так заметно...
Re[18]: Куда девать ф-ции внешние для класса
От: IB Австрия http://rsdn.ru
Дата: 22.07.08 16:01
Оценка:
Здравствуйте, Aikin, Вы писали:

A>А вы спросили топикстартера о том, что для него критично, а что нет? Нет, не спросили.

У "топикпастера" все очевидно.

A>О том что в этой линии есть исключения

Нету там исключений.

A> (ну как бы даже не исключения, а уточнения к самому определению, и даже не к определению, а к некоторым словам, ...) стало известно много ниже.

Что именно стало известно?

A>Извините, но вышеозначенную "грызню" читать и выкапывать оттуда здравые мысли не имею никакого желания.

Тогда зачем вообще вмешиваешься?
... << RSDN@Home 1.2.0 alpha rev. 673>>
Мы уже победили, просто это еще не так заметно...
Re[20]: Куда девать ф-ции внешние для класса
От: IB Австрия http://rsdn.ru
Дата: 22.07.08 16:01
Оценка:
Здравствуйте, MozgC, Вы писали:

MC>Понял, реальных примеров привести не можете.

Я привел вполне реальный пример, много примеров. Я не виноват, что они тебе не нравятся. =)


MC>- Ну вот надо все эти методы надо было вынести в отдельные классы, потому что в противном случае это косяк.

MC>- Почему косяк?
MC>- Ну вот связность, и все такое, и Мейерс заявил что "они ошибаются"
MC>- На практике в чем косяк?
MC>- Ну я же писал.. что косяк..
MC>- Так в чем косяк на практие?
MC>- Ну связность.. и Мейерс говорил..
Это ты сейчас с кем говорил?
... << RSDN@Home 1.2.0 alpha rev. 673>>
Мы уже победили, просто это еще не так заметно...
Re[20]: Куда девать ф-ции внешние для класса
От: IB Австрия http://rsdn.ru
Дата: 22.07.08 16:01
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Да и прямой аналогии DI с сабжем я не вижу.

Да прямее уже и не найдешь. Обсуждаемые хелперы — DI сервисы в чистом виде.

Z>Т.е. все архиекторы библиотек работы со строками .net, java, python, ruby допустили одну и ту же ошибку дизайна?

Не знаю, всех не смотрел, но в .Net ошибки дизайна присутствуют в количестве.

Z>Меня больше устраивает другая версия:

Да байта ради..

Z>они все проектировали так, чтобы людям было удобнее ее использовать.

То есть, единственное возражение "не удобно использовать"?
Ок.
... << RSDN@Home 1.2.0 alpha rev. 673>>
Мы уже победили, просто это еще не так заметно...
Re[17]: Куда девать ф-ции внешние для класса
От: stump http://stump-workshop.blogspot.com/
Дата: 22.07.08 16:35
Оценка:
Здравствуйте, IB, Вы писали:

IB>Здравствуйте, stump, Вы писали:


S>>foo() использует локальные данные класса А, то что ты заставил ее работать через паблик интерфейс не меняет сути.

IB>Меняет. В одном случае все взаимодействие проходит через публичный контракт, а в другом нет, как следствие, в одном случае метод защищен от внутренних изменений класса (и наоборот), а в другом не защищен.
Его не надо защищать от этого. Он имеет полное право обращаться к этим данным.

S>>Это не я ошибаюсь. Это была цитата.

IB>Просто она была не к месту. =)
Значит ты ее не прочел.

S>>Разница в трактовке роли внутренних связей. Но против этого мне нечего возразить, убедил.

IB>То есть, за DI ты признаешь право уменьшить звязность путем вынесения внутренней связи во внешний контракт, а за просто выносом метода — нет?
Я признал то что твоя трактовка непротиворичива. Однако она не соответствует тому, как трактуют связность инструменты разработчика Visual Studio, Corillian. Внутренние связи, которых ты так сильно боишся там не учитываются. И это выглядит логично, связность не влияет на рантайм, эта характеристика важна при внесении изменений в код и для использования этого кодв. Вносить изменения в класс, большая часть логики которого раскидана по хелперам в соответствии с твоим принципом неудобно. Пользоваться — тоже.

S>>Черным по зеленому написано сначала определяешь ответственность, потом на этом критерии принимаешь решение что включать, а что нет.

IB>Что мешает определить ответственность как "все что делает эта программа"?
Мне? Здравый смысл.

S>> Тут в другой ветке обсуждали дизайн System.String (http://www.rsdn.ru/Forum/message/3031451.aspx
Автор: Ziaw
Дата: 22.07.08
) и обнаружили что предлагаемый правильный дизайн намного неудобнее использовать чем существующий "неправильный".

IB>Кто это обнаружил? На мой взгляд использовать оба подхода по удобству совершенно одинаково, а уж при наличии методов расширения разница вообще стирается.
А на мой взгляд — нет. Речь не идет о методах расширения.

S>>Почему это. Ты эту фразу уже раз шесть повторил как заклинание и не разу не объяснил, где же там конкретно контроль теряется? Компилятор соответствие типов или наличие членов престает там контролировать?

IB>Компилятор перестает следить за доступом к приватным переменным.
Неубедительно. У тебя есть заклинание "только через публичный контракт" — поэтому для тебя доступ к приватным переменным, это трагедия. У меня такого заклинания нет, я все проверяю на критерии "нельзя ли все это сделать еще проще", и "удобно ли этим пользоваться".

S>>Это была твоя проблема, что ты не можешь себя сдерживать в рамках приличий.

IB>Что я такого неприличного написал?!
Даже не заметил...

В общем и целом картина ясна. Мне твои аргументы понятны. Признаю за ними право на жизнь. Более того, неоднократно встречал подобный подход на практике, приходилось и ревьюить и майнтейнить подобный код. Не могу сказать что это пуля.
Я предпочитаю не увлекаться хелперами. Впрочем, свою позицию я тут уже подробно изложил.
Считаю дискуссию исчерпаной. Спасибо.
Понедельник начинается в субботу
Re[18]: Куда девать ф-ции внешние для класса
От: IB Австрия http://rsdn.ru
Дата: 22.07.08 16:50
Оценка:
Здравствуйте, stump, Вы писали:

S>Его не надо защищать от этого.

Надо.

S>Он имеет полное право обращаться к этим данным.

Имеет, но через публичный контракт.

S>Я признал то что твоя трактовка непротиворичива.

Это не моя трактовка, это общепринятая, из википедии.

S>Однако она не соответствует тому, как трактуют связность инструменты разработчика Visual Studio, Corillian.

Очень даже соответствует. На твоем же примере VS показала, что Maintainability Index у класса с вкряченным методом хуже. Какие тебе еще доказательства нужны?

S> Вносить изменения в класс, большая часть логики которого раскидана по хелперам в соответствии с твоим принципом неудобно.

Удобно, очень удобно, уж поверь, я даже пример приводил.

S>Пользоваться — тоже.

На вкус и цвет. Для ярых приверженцев определенного стиля есть методы расширения.

S>Мне? Здравый смысл.

Ну, собственно, с чего начали — наш формальный критерий называется "здравый смысл". Я не отрицаю, штука полезная, но на формальный критерий не тянет никак.

S>А на мой взгляд — нет.

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

S>У тебя есть заклинание "только через публичный контракт"

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

S>Считаю дискуссию исчерпаной. Спасибо.

Заходите еще..
... << RSDN@Home 1.2.0 alpha rev. 673>>
Мы уже победили, просто это еще не так заметно...
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.