?

Log in

No account? Create an account
nyaload

Журнал Пушыстого

Журнал Пушыстого

Previous Entry Share Next Entry
Armed Pig Pattern
nyaload
_winnie
При программировании, при тупом кодировании, при выборе имён переменных, при выборе места вставки очереднй заплатки вроде if (объект != NULL) - важно разобраться в себе, чего же ты на самом деле хочешь, понять законы вселенной в которой живёт предметная область, и сделать исправления именно в пространстве этой вселенной.

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

Важно понимать, где нам писать if (посетитель == Дженифер) и if (IsWoman(посетитель)) (а может на самом деле, мы хотели написать, if ( ПосетительОдетВЖенскуюОдежду(посетитель)) ?, не смотря на то что пока этот персонаж только один - это эквиваленты.

Программисты же новички часто пишут не то что хотят, а то что в данный момент является эквивалентом того что они хотят. А потом эта эквивалентность ломается. И они потом по всему коду всё равно заменяют на if (посетитель == Дженифер || посетитель == Барбара). Или наоборот, if (IsWoman(посетитель) && посетитель != Барбара). Хотя надо было в начале написать IsWoman(посетитель) и посетитель == Дженифер, и тогда при добавлении Барбары не пришлось бы менять код.

Кстати, часто это касается не программистов, а заказчиков/дизайнеров. Тогда надо разбираться не в себе, а в них и в их вселенных :)

updated:
Со свиньями был связан, кстати, ещё один баг, из-за которого игра падала
кенгуру, перегруппировавшись, появились из-за холма и выпустили тучу стингеров по злополучным вертолетам

  • 1
+1
Пойду покажу лид.программеру.

Угадать, где тождественность, а где эквивалентность, пока она не нарушилась, практически невозможно. Поэтому бороться с таким кодом на раннем этапе бесполезно. Другое дело, что после того, как она нарушилась, править код надо правильно, а не перебором вариантов. Но не раньше.

... Лучшее украшение девушки - скромность и прозрачное платьице ...


Например:
Диалоговое окно ставится в точке (473, 400). Хотя на самом деле человек хотел сказать "выровняй по центру внутри экрана".

Но ведь можно впасть и в другую крайность, проводя много времени в раздумьях и обобщениях (overengineering?).
Да, "разбираться" напоминает очередную мантру.

ЗЫ Можно глупый приземеленный вопрос? Чем плох "if (объект != NULL)" ?

Он не плох, надо просто найти правильное место где его вставить.

words of wisdom indeed, respect man

Здравая идея, но мне кажется ее следует развить: "Выражениям, отличным от lvalue, константы, вызова функции или, на худой конец, одного сравнения - не место в качестве аргументов операторов if, for и while!" и как следствие "Человека, написавшего что-нибудь вроде
if( a && b || (c == !((d << flag)|e)) blah(a,b,c); else foobar(e);

(в одну строчку)
нужно избегать как чумного прокаженного".

За такие if'ы cpp-программера надо переводить в ассемблерщики. Вне зависимости от того, конкретную Джениффер он в коде прописал или абстрактную вумен - cpp для него катастрофически избыточный инструмент.

Просто интересно, а как реализовать пожелание дизайнера так, чтобы cpp был не избыточен?
Пожелание дизайнера: "Когда посетитель пьянеет, он падает под стол. А Дженнифер не падает, она машет рукой бармену и выходит из бара через дверь".

На всякий случай - я так понимаю orvind это рядом с Wii/NDS

Armed Pig AntiPattern, imho.

не тучу стингеров, а тучу ярко раскрашенных пляжных шаров

Ничего страшного в это паттерне нет. Особенно если это сильно кастомный скрипт игровой логики. Если это с++, то достаточно написать рядом HACK и медитировать на тему - data driven у меня код или нет?

Всё фиг предусмотреть. Зато при инкапсуляции свойств и выгодной модульности-локализации логики вносить изменения удобно.

Моя точка зрения: надо не боятся рефакторить код с устаревшими представлениями.

«посетитель == дженифер», может быть нормально в начале, но когда появляется барбара, надо написать IsWoman().

Хотя, это всё к моему старому тексту про ctrl+Arrow, ctrl+X.

  • 1