О дизайне карандашей
От: McSeem2 США http://www.antigrain.com
Дата: 15.12.05 16:08
Оценка: 36 (7) +5 :)
Развернутый трактат на это:
http://www.rsdn.ru/Forum/Message.aspx?mid=1540241&only=1
Автор: Sinclair
Дата: 15.12.05


S>Опять ты смешиваешь архитектуру и реализацию. Вот не надо переносить косяки реализации на архитектуру. Да, парни, которые реализовывали это дело — халтурщики. И что теперь, выкидывать базовый класс из-за того, что есть убогие наследники?


А вот это уже вполне филосовский вопрос. А что если этот класс имеет одного единственного нетривиального наследника, да и тот убогий? Ну это утрированно, на самом деле никакого там базового карандаша нет — просто карандаш может создаваться как сплошной, пунктирный или текстурный, то есть внутри — банальный switch(). Но вопрос несколько в другом — надо ли изобретать некие интерфейсные сущности для некой гипотетической будущей реализации? Я считаю, что это не только не нужно, но и крайне вредно. Отталкиваться нужно от нашего физического мира прежде всего, от того, что уже работает. Такие нереализованные (или полу-реализованные) возможности, заложенные в интерфейсе, приводят к возникновению неуклюжих уродцев, которые становится нереально имплементировать или на имплементацию их требуются неимоверные усилия c мизерным результатом.

Вернемся к тому же карандашу. Это полный бардак — в нем намешаны в одну кучу принципиально разные вещи, как то геометрия и цвет. Width и LineJoin — это геометрические свойства, Color и Brush не имеют никакого отношения к геометрии. Можно сказать, что ну и фиг с ним, удобно же — в одном объекте устанавливаем все свойства, какие нужны. Для тривиальных задач, типа рисования линии на экране, это так. Но шаг-вправо-шаг-влево карается мгновенным ступором. Например, я хочу посчитать в векторном виде толстую штрих-пунктирную линию с RoundJoin и RoundCap и вычесть ее из некого полигона, тоже в векторном виде. Координаты записать в файл. Пусть библиотека это умеет. Но при этом я должен использовать Pen, чтобы метод знал Width, RoundJoin и RoundCap. А зачем мне тогда в этом Pen иметь Color? И что будет если я установлю TextureBrush? — он что, ринется верторизовать растровый паттерн? А если эту операцию вычитания можно сделать без привлечения Pen, то Width, RoundJoin и RoundCap должны устанавливаться где-то еще. Таким образом, постепенно весь так называемый "дизайн" превращается в нагромождение нелепостей.

Или другой пример с тем же карандашом. В нем можно устанавливать ширину линии и пунктир. А если я хочу нарисовать цепь из маленьких кружочков вдоль ломаной (причем, не растровых, а векторных, то есть маштабируемых)? Какой для этого нужен карандаш? — правильно, нет такого. И самое главное — его невозможно добавить в библиотеку без модификации этой самой библиотеки, то есть это может сделать только Microsoft только по своей прихоти. Спрашивается, о каком таком дизайне идет речь? Нет его этого дизайна — один сплошной бардак.

Правильный дизайн заключался бы в том, чтобы можно было самому составлять векторные конвейеры, например, полигон->пунктир->строкер->трансформер. И чтобы выход трансформера можно было использовать идентичным образом как для рисования, так и для записи в файл. При этом у нас Width, LineJoin, LineCap — свойства строкера, длина пунктира — ствойство класса-"пунктирщика", масштаб — свойство трансформера и т.д. Но главное — что все элементы этого конвейера являются интерфейсно совместимыми, то есть, их можно выстраивать в любые цепочки (и даже ветвить). И если у нас чего-то не хватает в библтотеке — всегда можно дописать не затригивая исходников, например, элемент конвейера, который "ляпает" кружочки вдоль линии. Вставляем его в нужное место конвейера и вот у нас линии стали точечными.

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

А называть этот бардак с карандашами GDI+ дизайном (или даже архитектурой!) — это все равно, что восхищаться остроумием Петросяна. Кому-то нравится, но лично меня — тошнит.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.