28 Мая 2001г.
КРАТКОЕ РУКОВОДСТВО ПРОГРАММИСТА ПО ЯЗЫКАМ
ПРОГРАММИРОВАИЯБурное размножение
современных языков программирования (которые,
похоже, просто заимствуют друг у друга
бессчетные нововведения) приводит к тому, что
иногда бывает трудно вспомнить, какой язык вы в
настоящее время используете. Это удобное
руководство предлагается для общего
использования в целях помощи программистам,
оказавшимся перед такой дилеммой.
ЗАДАЧА: Прострелить себе ногу.
C: Вы простреливаете себе ногу.
C++: Вы случайно создаете дюжину экземпляров
объекта "вы" и всем им простреливаете ногу.
Срочная медицинская помощь оказывается
невозможной, так как вы не можете разобраться,
где настоящие объекты, а где - те, которые только
указывают на них и говорят: "А вот - я!".
ФОРТРАН: Итерактивно вы простреливаете каждый
палец ноги, а когда пальцы заканчиваются,
загружаете следующую ногу и продолжаете. Когда
пули заканчиваются, вы все равно продолжаете
попытки прострелить себе ноги, потому что не
имеете возможности обработать такую особую
ситуацию.
ПАСКАЛЬ: Транслятор не позволит вам
прострелить себе ногу.
ADA: После тщательного описания пакета
"нога", вы пытаетесь одновременно зарядить
пистолет, нажать курок, завопить и выстрелить
себе в ногу. В ходе попыток обнаруживается,
однако, что вас постигла неудача, так как ваша
нога оказалась неверного типа.
КОБОЛ: Hаводите ПИСТОЛЕТ COLT 45 на HОГА.СТОПА,
Затем помещаете РУКА.КИСТЬ.ПАЛЕЦ на
ПИСТОЛЕТ.КУРОК и HАЖИМАЕТЕ. Затем возвращаете
ПИСТОЛЕТ в КОБУРУ. ПРОВЕРЬТЕ, нуждаются ли шнурки
в повторном связывании.
LISP: Вы простреливаете себе отросток, который
держит пистолет, с помощью которого вы
простреливаете себе отросток, который держит
пистолет, с помощью которого вы простреливаете
себе отросток, который держит пистолет, с помощью
которого вы простреливаете себе отросток,
который держит пистолет, с помощью которого вы
простреливаете себе отросток, который...
ФОРТ: Hога простреливать себе вы.
ПРОЛОГ: Вы сообщаете вашей программе, что вы
хотите иметь простреленную ногу. Программа
разрабатывает способ этого достичь, но синтаксис
языка не позволяет объяснить этот способ вам.
БЕЙСИК: Вы простреливаете себе ногу из водяного
пистолета. а расширенных реализациях языка
продолжайте, пока вся нижняя часть тела не
промокнет.
VISUAL BASIC: Hа самом деле вы будете только
выглядеть, как будто ваша нога прострелена.
Однако в процессе реализации вы получите столько
удовольствия, что подобные мелочи вас не
озаботят.
HYPERTALK: Поместите первую пулю пистолета в ступню
левой ноги вас. Сообщите результат.
MOTIF: Вы затрачиваете несколько дней на
построение UIL - описания вашей ноги, пули, ее
траектории и замысловатой резьбы по слоновой
кости на рукоятке пистолета. Когда вы наконец-то
управились и готовы нажать на курок, пистолет
закупоривается.
APL: Вы простреливаете себе ногу, затем тратите
весь день на то, чтобы представить себе, как это
сделать с меньшим количеством символов.
СНОБОЛ: Если вам удастся, прострелите себе
левую ногу. Если не удастся, то прострелите себе
правую ногу.
UNIX:
% ls
Foot.c foot.h foot.o toe.c toe.o
% rm * .o
rm: .o no such file or directory
% ls
%
ПАРАЛЕЛЛЬНЫЙ EUCLID: Вы простреливаете себе чью-то
чужую ногу.
ЯЗЫК УПРАВЛЕНИЯ ЗАДАНИЯМИ IBM/370: Вы посылаете
свою ногу в управляющую информационную систему с
приложением документа на 400 страниц, точно
описывающего, как именно вы хотите быть
простреленным. Через три года ваша нога
возвращается с глубоким ожогом.
PARADOX: Не только вы можете прострелить себе ногу,
но и ваши пользователи.
ACCESS: Вы пытаетесь прицелиться в вашу ногу, но в
результате простреливаете все Борландовские
дистрибутивные дискеты.
REVELATION: Вы уверены, что сможете прострелить себе
ногу, как только разберетесь, для чего служат эти
маленькие хорошенькие пульки.
АССЕМБЛЕР: Вы пытаетесь прострелить себе ногу,
но обнаруживаете, что прежде вам придется
изобрести пистолет, пулю, курок и вашу ногу.
МОДУЛА-2: После того, как вы понимаете, что
фактически ничего не можете сделать на этом
языке, вы простреливаете себе голову.
Некоторые важные правила для настоящих
программистов.
Настоящие программисты не пишут спецификаций -
пользователи должны считать себя счастливыми,
получая любую программу и принимать ее такой,
какая она есть.
Настоящие программисты не комментируют свои
программы. Это затрудняет написание, и это
затруднит чтение.
Настоящие программисты не пишут прикладные
программы, они программируют не ради презренного
металла. Прикладное программирование есть кусок
хлеба для тех, кто не может заниматься системным
программированием.
Настоящие программисты не готовят сами. Они
питаются в закусочных и забегаловках.
Настоящие программисты не пишут на КОБОЛЕ.
КОБОЛ - это для простоватых прикладных
программистов.
Настоящие программисты никогда не сдают свою
работу с первого раза. Но если отдать им машину,
они могут залатать все прорехи в своей программе
за один или несколько 30-часовых отладочных
сеанса.
Настоящие программисты не пишут на ФОРТРАНЕ.
ФОРТРАН - это для расчетов труб под давлением и
кристаллографических игрушек.
Настоящие программисты никогда не работают с 9
до 5. Если какой-нибудь настоящий программист в
девять часов утра на работе, это значит, что он
провел на работе всю ночь.
Настоящие программисты не пишут на Бэйсике.
Обычно программист не пишет на Бэйсике, если он
старше 12 лет.
Настоящие программисты не пишут на PL/I. PL/I - это
для программистов, которые не могут решится
писать на КОБОЛЕ или ФОРТРАНЕ.
Настоящие программисты не пишут на АПЛ. Любой
дурак может быть непонятным, если пишет на АПЛ.
Настоящие программисты не играют в теннис или
любую другую спортивную игру, поскольку для
этого надо сменить одежду. Однако альпинизм
вполне подходит, и настоящие программисты могут
надеть свои бахилы в случае, если в результате
подъёма они вдруг окажутся посередине машинного
зала.
Настоящие программисты не готовят
документацию. Документация - это для тех
простаков, кто не может читать листинги или
объектный код.
Настоящие программисты не пишут на Паскале или
на АДЕ, или на любом другом изобретенном учеными
языке. Строгие правила написания программ - это
для людей со слабой памятью.
Настоящие программисты знают лучше
пользователя, что ему нужно.
Настоящие программисты считают структурное
программирование частью коммунисти- ческого
заговора.
Настоящие программисты не работают по
расписанию. Расписание - это для лизоблюдов.
Настоящим программистам нравится держать своих
начальников в полной неизвестности.
Настоящие программисты думают лучше, когда
играют в "Приключения".
Настоящие программисты наслаждаются,
установив CP/M для работы на машинaх IBM/370 и MVS на
Спектруме.
Настоящим программистам никогда не досаждают
системы безопасности, они сбрасывают биты где
нужно и вставляют непонятные сообщения в данные
системы безопас- ности.
Настоящие программисты никогда на исправляют
исходный код после работы с программой ZAP, кроме
всего прочего, завтра может потребоваться
исправления вно- сить снова.
Настоящие программисты не тестируют программы.
Тестирование - это для людей со слабыми нервами и
к тому же не уверенных в себе.
Настоящие программисты всегда программируют
рекурсивно и запускают программы только в режиме
супервизора, иначе программирование нельзя
считать настоящим развлечением.
Настоящие программисты никогда не занимаются
архивированием.
Теория ошибок.
Ошибки так же неисчерпаемы, как и атом.
Аксиома: В любой программе есть ошибки.
Закон пропорциональности: Чем более программа
необходима, тем больше в ней ошибок.
Следствие: Ошибок не содержит лишь совершенно
ненужная программа.
Фундаментальный закон теории ошибок: На ошибках
учатся.
Следствие 1: Программист, написавший программу,
становится ученым.
Следствие 2: Чем больше программист делает
ошибок, тем быстрее он становится ученым.
Следствие 3: Крупный ученый-программист никогда
не пишет правильные программы.
Замечание: На то он и ученый.
Указание начинающему программисту: Если вы с
первого раза сумели написать программу, в
которой транслятор не обнаружил ни одной ошибки,
сообщите об этом системному программисту. Он
исправит ошибки в трансляторе.
Закон находимости ошибок: Программист может
обнаружить ошибку только в чужой программе.
Следствие: Ошибке не все равно, кто ее обнаружит.
Совет начинающему программисту: Никогда не
исправляйте найденные ошибки, ибо это повлечет
за собой появление неизвестного числа
ненайденных. Лучше опишите их в сопроводительной
документации как особенность программы.
Определение: Будем называть языком ошибок
правила, в обход которых пишутся программы.
Язык ошибок.
Ошибки могут следовать друг за другом.
От перестановки двух эквивалентных ошибок
результат не меняется (коммута- тивность
эквивалентных ошибок).
Две последовательные ошибки можно объединить в
одну, более сильную.
Одинаковые ошибки необязательно делать каждый
раз, достаточно сделать од- ну, а затем обращатся
к ней по мере необходимости из любого места
программы.
Ошибки могут образовывать циклы. Наиболее
устойчивый из них - бесконечный.
Ошибки могут вызывать друг друга и сами себя
(рекурсивность ошибок).
Ошибки допускают многократное вложение друг в
друга. Две одинаковые вло- женные ошибки
называются четной ошибкой и ошибкой не являются.
Свойство четности ошибок: Если написанная
программа сработала правильно, то это значит, что
во время ее работы выполнилось четное число
ошибок или программист не понял задание.
Формулировка вышеприведенного свойства,
предназначенная для политиков: Ошибка,
повторенная дважы, перестает быть ошибкой.
Взаимодействие ошибок с базовой
операционной системой.
Во время исполнения ошибки имеют наивысший
приоритет. Прервать исполнение ошибки может
только другая, более активная ошибка.
Запросы операционной системы к ошибкам ошибками
могут игнорироваться.
Запросы ошибок к операционной системе
игнорироваться не могут.
При работе с файлами ошибки могут пользоваться
файловой системой базовой ОС и ее ошибками.
На ЭВМ с параллельной архитектурой может
выполнятся несколько ошибок одно- временно.
Hi, All, брат/сестра/другое по
разуму/мышлению/другое!
Объектно-ориентированные программисты всех
стран - инкапсулируйтесь!
virtual void run();
Фэнам объектно-ориентированного
программирования, посвящается.
Словарь объектно-ориентированного
программирования. {// Базовый объект. //}
// v 1.0
// Словарь содержит абстрактный набор терминов,
необходимых
// для порождения новых версий словаря.
// Поля:
// 1. Программистам об ООП.
// 2. Фэнам о программировании. ( разъяснение
устаревших понятий. )
// 3. Руководство по использованию ООП.
// 4. Выводы и дестракторы.
ООП - глубоко ошибается тот, кто считает, что это
- объектно-ориентированное программирование. а
самом деле, это ОБЪЕКТО-ОЗАБОЧЕЫЙ ПРОГРАММИСТ. В
жизни определяется по проскакивающим в речи
виртуальным дестракторам, уму, отсутствию
сообразительности, а также попыткам породить все
и вся от одного абстрактного объекта.
ОШИБКА - в ООП - вещь настолько тривиальная, что
она не заслуживает дальнейших разъяснений. (
ормальное состояние объектного проекта. )
ОС - программа, до которой ООП еще толком не
добрались.
ОБЪЕКТ - 1. Беспредел развития любого
программного продукта. 2. Образ мышления ООП.
АБСТРАКЦИЯ - в общем-то, неплохая штука, но никто
не знает, что это такое. Как правило, это
становится ясно на заключительных испытаниях
программы.
КОСТРАКТОР - некий метод, разрешающий вызывать
виртуальные дестракторы. Не бывает виртуальным.
ДЕСТРАКТОР - метод, после которого ничего уже
вызывать нельзя.
ВИРТУАЛЬЫЙ МЕТОД - свободно замещаемый метод (
никогда неизвестно, чем он окажется, что он
делает и делает ли вообще ).
РЕКУРСИЯ - то же, что и перегрузка стека.
СБОЙ, КРАХ, РАЗРУШЕИЕ - несвоевременный вызов
дестрактора. ( см. ОШИБКА. )
АССЕМБЛЕР - таблицы, таблицы, таблицы... От него
можно унаследовать компилятор, если получится.
ИЕРАРХИЯ - 1. Дерево, в корне которого сущая
абстракция. 2. Квадратура круга.
ОБЪЕКТ-ПРЕДОК - объект, стоящий выше кого-либо
по иерархии.
НАСЛЕДОВАИЕ - искажение свойств объекта-предка.
ПОРОЖДЕИЕ - см. НАСЛЕДОВАИЕ ( Абстрактный метод.
)
ТРИ - волшебное число. Число операторов во
всякой объектно-ориентированной программе
стремится именно к нему.
СИ++, ПАСКАЛЬ 6.0 и выше - примерно тоже самое, что
молоток и плоскогубцы.
"ГОЛОВАЯ БОЛЬ" - процесс разработки
иерархии.
КОЦЕПЦПИЯ - см. АБСТРАКЦИЯ.
МЕТОД - дитя-переросток процедур и функций
неандертальской фазы развития программирования.
ПОЛЕ - неотъемлемая ненужная составная часть
объекта.
СТРУКТУРОЕ ПРОГРАММИРОВАИЕ - недоразвитый
предок объектно-ориентированного
программирования.
БЕЙСИК - тоже становится
объектно-ориентированным языком.
ФОРТРАН - никогда им не станет. ( Хотя, кто
знает... )
ПРОГРАММА - см. ОБЪЕКТ.
СООБЩЕНИЕ - 1.Объект, который объекты посылают
друг другу. 2. Объект, посредством которого
объекты обмениваются между собой другими
объектами.
ИКАПСУЛЯЦИЯ - объединение программ, данных и
детской неожиданности.
СОБЫТИЕ - см. СООБЩЕНИЕ.
ПОЛИМОРФИЗМ - концепция, руководствуясь
которой вы никогда не сможете точно сказать, что
делает отдельно взятый объект.
ДРАЙВЕР - невидимая часть программы,
генерирующая события.
ПАМЯТЬ - абстрактный машинный ресурс,
стремящийся к нулю.
АБСТРАКТНЫЙ МЕТОД - заголовок, начало и конец.
астоящие абстрактные методы не опускаются до
текста внутри себя.
НАСТОЯЩИЙ ПРОГРАММИСТ - ООП (см.), создающий
только абстрактные объекты.
АБСТРАКТНЫЙ ОБЪЕКТ - 1. Объект, не имеющий полей
и методов. 2. Основа всякого
объектно-ориентированного проекта. 3. Вершина
любой иерархии. 4. В крайнем случае, содержащий
только абстрактные методы. 5. Продукт
деятельности настоящего
объектно-ориентированного программиста.
БЫСТРОДЕЙСТВИЕ - критерий предела абстракции в
ООП.
КОЛЛЕКЦИЯ - абстрактный набор абстракций.
СОБЫТИЕ - объект, возникающий в результате
чего-либо.
ЗАПИСЬ - объект без методов.
ПРОЦЕДУРА, ФУНКЦИЯ - метод без объекта.
ПЕРЕМЕННАЯ - см. ОБЪЕКТ.
БЛОК-СХЕМА (ГРАФА УПРАВЛЕНИЯ) - абсолютно
никчемная вещь.
5000 СТРОК - нижний предел объема кода в
объектно-ориентированной программе.
ХАКЕР - см. ООХ.
ООХ - объектно-ориентированный хакер. В отличие
от ООП (см.) в его речи не проскакивают
виртуальные дестракторы поскольку он уже
распределен в статической памяти.
ПИВО - абстракция.
VMT - таблица виртуальных методов.
МНОЖЕСТВЕННОЕ НАСЛЕДОВАНИЕ - групповое
искажение свойств нескольких объектов.
СТИЛЬ - недостатки, присущие только одному
программисту.
ЧЕЛОВЕК НИОТКУДА - автор документации на
объектно-ориентированную систему.
// Кто же еще может вразумительным языком описать
все это...
destructor Done;virtual;
Выводы и рекомендации.
1. Идеальная объектно-ориентированная
программа абстрактна.
2. Всякий абстрактный метод ничего не делает.
3. Всякая идеальная объектно-ориентированная
программа ничего не делает.
4а.Лучшая объекто-ориентированная программа на
ПАСКАЛЕ :
begin
end.
4б.Лучшая объектно-ориентированная программа на
СИ++ :
main(){}
5. We all live in a yellow submarine.
Руководство по использованию
объектно-ориентированного подхода.
Откажитесь от безнадежно устаревших взглядов
на управляющие структуры и операторы. Объекты
обмениваются только сообщениями, состоящими из
объектов, обменивающихся сообщениями. ( Если,
прочитав это, вы исторгли крик - можете
радоваться, поскольку инстинкт самосохранения у
вас еще на месте. Не закричали? Еще лучше! Значит,
вы уже получили первое крещение и становитесь
ООП.( или ООХ ) )
Абстрагируйте, абстрагируйте, абстрагируйте.
Когда вы почувствуете, что на следующем шаге у
получится пустота, знайте, что вы приблизились к
вершине иерархии вашего проекта.
Для получения хорошей абстракции ни в коем
случае не влезайте в труды по программированию,
лучше пропустите рюмашку, походите на голове,
пообщайтесь с соратниками, в крайнем случае -
погрузитесь в медитацию. Способствует получению
хорошей абстракции также присутствие
программисток и отдых в горах. Постарайтесь не
думать, мысли - источник труднообнаруживаемых и
трудноудалимых ошибок.
Полученную абстракцию можно кодировать.
Не думайте об объеме памяти. Память - приходяща,
а неглубокая иерархия доставит немало хлопот и
ощущение неудовлетворенности. Помните, что до
получения первого десятка уровней абстракции вы
не сможете написать ничего конкретного.
Никогда не оглядывайтесь на быстродействие
машины. Вы просто не представляете, насколько это
здорово, когда для передачи сообщения о нажатии
на клавишу драйвер опрашивает все объекты,
собирает мусор, выносит его на улицу,
верифицирует дисковод, а затем посылает
сообщение о начинающейся генерации события
клавиатуры. В общем-то, он должен проверить еще и
получение события.
Не используйте готовые библиотеки объектов,
ибо нет ничего прекраснее воплощения в код
собственного видения мира ( или его отсутствия ).
Не обращайте внимания на объем кода и число
промежуточных файлов. Программа, обладающая
достаточным чувством собственного достоинства
никогда не состоит из одного файла и не начинает
работать через пять секунд после запуска.
Помните, что настоящая объектно-ориентированная
программа содержит, как правило, хотя бы два
рабочих модуля ( из них один - оверлейный ), и не
менее полусотни вспомогательных файлов, из
которых пятнадцать никогда не используются,
двадцать нужны только при аварийном завершении
работы, в десяти содержится свопинг другой
программы, а одного всегда не хватает. Вся эта
радость занимает хотя бы 40 мегабайт, а при
инсталляции дает угрожающее здоровью
нормального программиста сообщение
:"Освободите 60 мегабайт на устройстве A:" и
презрительно отказывается разворачиваться, если
условие не выполнено.
Сделайте в документации пометку красным цветом
:"ООП!". Это отпугнет неискушенных
пользователей и настроит всех остальных на
верный лад.
Запуск должен быть торжественным. Промаринуйте
пользователя минут пять ( за это время поищите
недостающие файлы на диске, не беда, если на одном
и том же месте - лишь бы завораживающе свистел
винчестер и таинственно чернел экран ), а если он
случайно нажмет на кнопку или откроет дисковод,
можете спокойно аварийно завершать программу - в
следующий раз будет осторожнее, поскольку каждый
пользователь должен знать, что нельзя беспокоить
объектно-ориентированную систему во время
инициализации бестолковыми сообщениями с
клавиатуры.
{*** Комментарий для особливо дюбознательных ****
Во время начальной загрузки происходит ни с чем
не сравнимое таинство "инициализации" и
"разворачивания объектов", на практике
означающее изменение значения нескольких
десятков указателей; перегонки из памяти в
память объема, превышающего доступную память раз
в сто ( для этого и нужны шины с повышенной
пропускной способностью ); троекратного
свопинга; перезагрузки ( нередко ). ***}
И ничего не бойтесь.
Заметив, что...
...счетчик строк компиляции соскальзывает на
шестизначные числа, - расслабтесь и получите
удовольствие от красоты дисплея.
...нажатие на клавишу обрабатывается две минуты,
- не огорчайтесь, все-таки оно обрабатывается. Мир
полон несовершенств, ваша машина - не исключение.
...программа работает, как вам кажется,
неправильно, - почитайте книгу по юриспруденции.
В конце концов - это только вам так кажется.
...работа подошла к концу :
а) прогоните ее;
б) задайте себе вопрос, а зачем это все нужно ?;
в) не получив ответа, можете сдавать продукт.
Прислал Синицын
Игорь
А теперь немного графики
А вот так некоторым представляется технология
drag&drop:
и напоследок:
Прислала Olka
Назад | Архив
| Вперёд
|