Программерское: Мой топ признаков плохого кода

Собрал тут свой собственный список признаков факапнутости кода.

На первом месте – классы со словом “Manager” в названии. Безоговорочный лидер в номинации “превратим любой код в страшные спагетти”. Самое ужасное в таких классах это то, что делаются они из самых лучших побуждений. Впрочем, так всегда – самые кошмарные деяния совершаются под прикрытием лозунга “мы же хотим тебе лучшего”. Я специально не пишу о внутренностях этих классов, само название “Manager” для меня уже достаточное основание к тому, чтобы код полетел в помойку.

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

class A;
class B: public A;

void DoSomething(A* ptr)
{
(B*)ptr->MethodOfB();
}

100% признак проявления идиотии в проектировании иерархии классов. Особый шик, когда подобный downcast встречается в одном из базовых классов – это уже индикатор того, что пора сушить весла. Исключений не бывает. Если же такой код появляется в процессе рефакторинга там, где ничего подобного до того не было, то сушить весла нужно отправлять аффтара этого рефакторинга.

Третье место – классы “универсальный всемогутор”.  Близкий родственник класса “Manager”, протащеный оным на ключевую позицию в проекте, способен отравлять жизнь двум-трем поколениям программистов, которым выпадет этот код поддерживать. Обычно характеризуются тучей публичных методов, никак не связанных по смыслу ни друг с другом, ни с названием и предназначением класса и не изменяющих и не использующих ни одного из свойств класса, но при этом зачастую имеющих тучу неявных связей друг с другом.

Четвертое место – преднамеренное нарушение энкапсуляции. Это когда в класс “бутылка пива” пытаются заодно вкрячить нечто, что вроде как должно научить экземпляры его автоматически упорядочиваться внутри класса “ящик пива”. Когда через неделю закономерно выяснится, что бутылки нужно упорядочивать в сикспаки, начинается любимый в народе аттракцион “аврал”. Есть вообще только один случай, когда объектам допустимо иметь какие-то знания о контейнере, в которые их будут складывать – это преднамеренно делается интрузивный контейнер. Во всех остальных случаях такой код – индикатор того, что code review можно прекращать прямо сейчас, иначе проблемы этот код начнет доставлять уже на следующей неделе. В общем случае – запихивание в классы внешних нерелевантных зависимостей есть большое зло.

Пятый признак – преднамеренное игнорирование или извращенное употребление паттернов программирования. Когда из-за страха перед великим и ужасным шаблоном “фабрика” образюутся иерархии, где один-единственный параметр конфигурации спускается каждым промежуточным классом вниз на десять уровней, чтобы там ему где-то делали if или switch..case, когда при программировании на C++ боятся использовать RAII или бьют по рукам за bind; или же, наоборот, пихают повсюду smart pointers (доморощенные, конечно же, бо boost – это слишком сложно), жди беды. Очень быстро кто-то посередине той иерархии забудет, зачем нужен этот мистический параметр, нигде в обозримых окрестностях не применяющийсяи “пофиксит” код, обеспечив остальных неделями отладки (ведь юнит-тесты для такого кода писать не принято – он же очень сложный!); неиспользование RAII рождает трудноуловимые дедлоки, а умные поинтеры дают вкусить циклических зависимостей по полной.

Шестой признак – использование наследования там, где нужна агрегация. Например, есть интерфейс классов, есть базовый класс, которые реализует 85% всей требуемой функциональности. Позднее выясняется, что функциональность реализована вообще на 100%, а единственное требуемое различие – это разное поведение в случае создания класса с определенными внешними параметрами. Например, в реальной жизни есть у нас автомобиль. Точнее, его кузов. Во всем мире все производители просто ставят разные двигатели на один и тот же кузов и обзывют это обидным словом “комплектация”. В мире программирования часто происходит закат разума за ум – вместо того, чтобы создать класс “автомобиль” со свойством “двигатель”, начинают городить иерархию “автомобиль А с двигателем Б”, автомобиль Б с двигателем А” и так далее, что вообще противоречит здравому смыслу. Еще бы, класс автомобиль оказывается наследником класса “двигатель”. Проблема тут в том, что разобраться во всем этом хитросплетении и потом поддерживать ее становится решительно невозможно. В то же время правильный вариант – создать нужный объект тпиа “двигатель” и передать его новому объекту типа “автомобиль” при инициализации- не только сэкономил бы пару тысяч строк кода, но и позволил бы унифицировать и протестировать все имеющиеся автомобили и двигатели отдельно друг от друга и даже попробовать впоследствии легко примерить движок от Мерседеса на Запорожец.

Псто за чистоту крови

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

Есть в Менли одна достопримечательность. Если гулять по улочкам от одной набережной до другой, то у одного ничем внешне не примечательного викторианского домика можно наткнуться на нечто. Вместо миниатюрного садика перед домом выкопан огромный пруд, в котором плавают огромные японские рыбы koi и comet. Идешь по улице и тут – бах, и за маленьким заборчиком такой офигенный аквариум. Можно даже дотянуться рукой до воды, где под самой поверхностью плавают огромные золотые рыбки. Очень неожиданно и красиво, на самом деле. В туристическо-бекпекерском дорогом пляжном районе, который никогда не спит, ожидаешь увидеть все, что угодно, кроме частного пруда с японскими рыбами счастья.

Пруд этот там уже 14 лет. Точнее, был там целых 14 лет.

На прошлой неделе какой-то мудак ночью вылил в пруд банку краски. Вся рыба стоимостью больше 100 килобаксов сдохла.

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

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

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

Мне кажется, что чем бессмысленнее деяние, тем суровее оно должно наказываться. Урод кинул камень в машину, сел на 15 лет. Слишком сурово? А зачем он это сделал? Убить кого хотел? Тогда это даже слишком мягко, наверное. Ах, прикола ради? А подумать, что кого-то можешь покалечить, ты не догадался? Что, не подумал? Вот посиди 15 лет, подумай.

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

До слез обидно, когда подобная хуйня происходит. Всякий раз, когда мы приезжали в Менли, мы специально проходили по этой улочке, чтобы взглянуть на огромных золотых рыбок в пруду. Какой-то пидор взял и разрушил это. Зачем – я понять не смогу.

Ультрамодерновое

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

Целесообразности не обнаружил.

Что ж, подождем.

Пятисекундка ненависти

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

Новинки литературы

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

Pot

 Бестселлер, не иначе!

Увлекательный квест

приключился со мной сейчас. Это оказалось даже интереснее, чем проходить Виндовс.

Понадобилось нам, чтобы для нас сделали один ништяк. Проблема в том, что мы здесь, а ништяк нужен в Санкт-Ленинбурге. Фигня вопрос, во времена интернетов проблем быть не должно. Кагбе.

Провайдера ништяков в интернете нашли мы быстро. Выбрали на сайте понравившийся ништяк, связались по электрической почте с “консультантом”, с которым оговорили перламутровость пуговиц и даже получили скидку. Извлекли из широких штанин золотую Визу и понеслось.

Как понеслось, так и принеслось. Способы оплаты нам предлагались следующие: банковский перевод, почтовый перевод, оплата серебрянниками. Также предлагалось что-то еще из старообрядных методов взаиморасчета, вроде обемна коров (корованов?) на серебрянные рубли, но пластиковые деньги они принимать отказывались.

Вы думаете

Кто такой senior developer?

Сегодня пришли к выводу, что

Senior developer – это обычный программер, научившийся успешно спихивать на других часть своей работы.

Тогда Team Leader – это  Senior Developer, достигший в этом деле совершенства.

Все очень просто, оказывается.

Сегодня на районе. Продолжение

Товарищ из предыдущего поста сначала хулиганил у нас во дворе

Cookatoo eating a mandarin

Потом он увидел вооооот такой объектив и ему стало ссыкотно. Он, собака, отломал ветку с мандаринами, браконьер эдакий, подмигнул на прощанье и был таков.

Cookatoo picking mandarines

Мандарины доедал на близрастущем эвкалипте. Чтоб никто не догадался.

Сегодня на районе

Супруга подкараулила отличный кадр.

Кто первый угадает, что на этой картинке не так?

 Cookatoo eating a mandarin on a gum tree

Ubuntu Linux. No DMA on CD/DVD drive

Some time ago I built myself home media center on MythBuntu 8.04. It works exceptionally well… well, with one exception, if I may be excused. I could not watch my absolutely legally purchased DVDs at all – playback was choppy and jumpy, making watching movies anything but enjoyable.

If you found this post on google, you, probably, are about to give up. I was too. But I found a solution that worked for me. So, if you, like me, have seen zillions of webpages discussing the problem but none of solutions worked for you, keep reading (and please comment if this post helps you to solve your problem).

So the problem was that CD or DVD driver has no DMA enabled and hdparm would report an error:

 HDIO_SET_DMA failed: Operation not permitted

when trying to enable DMA.

I have Intel-based HP desktop with SATA HDD and IDE DVD combo drive. No problem with HDD, but DVD got stuck in PIO mode and hdparm is no help anymore. I have modules ata_piix and libata loaded.

After scanning though many discussions and FAQs, I finally found the most accurate description of the problem that offered a way to fix it. So I did exactly what they told:

# echo options libata atapi_enabled=1>/etc/modprobe.d/atapienable
# update-initramfs -u

and added

combined_mode=libata

option to kernel line in grub’s menu.lst

After reboot DVD drive was finally in UDMA mode!

8 visitors online now
8 guests, 0 members
Max visitors today: 8 at 09:08 pm MST
This month: 30 at 09-01-2010 12:31 am MST
This year: 41 at 01-23-2010 03:43 am MST
All time: 41 at 01-23-2010 03:43 am MST