Pull to refresh

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

Perfect code *
Читая Хабрахабр или просматривая чужие исходные коды, мне довольно часто приходится замечать примерно следующий кусок кода, который совершенно одинаково «звучит» на любом языке, на каком бы не был написан:
function(single_document)
{  
  if (single_document.getElementById("comments") != null)
    return;
    …
    …
    …
    …
}
* This source code was highlighted with Source Code Highlighter.

Здесь приведён кусочек кода на Javascript, но то же самое можно написать на нескольких десятках других языков. Что здесь не так? Только то, что у функции (метода, свойства, процедуры) несколько точек выхода. Если вам интересно почему это плохо, прочитай то что написано под катом.
Читать дальше →
Total votes 102: ↑56 and ↓46 +10
Views 14K
Comments 167

О структурном программировании

Website development *
Sandbox
Многие в комментариях к посту об операторе goto высказывали одно и то же мнение, которое звучит примерно так: «За n лет написания программ мне ни разу не понадобился goto, и использовать его в будущем я тоже не собираюсь». И они абсолютно правы, уже давно доказана теорема о структурировании, в которой говорится, что любая простая программа функционально эквивалентна структурированной программе составленной с использованием функций и предикатов исходной программы, а также с использованием дополнительного счетчика. Доказательством является алгоритм составления той самой структурированной программы:
  1. пронумеровать все узлы схемы, при этом порядок обхода произвольный;
  2. пронумеровать все дуги схемы следующим образом: выходной дуге схемы припишем номер 0, всем остальным дугам присвоим номер вершины, в которую данная дуга входит;
  3. для каждого функционального узла исходной программы, имеющего номер i и выходную дугу j, составить новую простую последовательную программу Gi с номером входной дуги i
  4. для каждого предикатного узла с номером i составить новую простую программу
  5. построить программу типа while do с do-частью в виде структры, проверяющей значения L.

Читать дальше →
Total votes 73: ↑70 and ↓3 +67
Views 13K
Comments 35

Существуют только структурная и объектная парадигмы программирования

Programming *Designing and refactoring *
Эту статью я подготовил во время дискуссий по поводу паттерна Мост, но тогда не опубликовал. Думал разобрались, так как было упомянута Domain Driven Design, и казалось, что необходимость проектирования и программирования именно в стиле ООП никем не оспариваются. Но все же со временем я столкнулся с непониманием. Это будет чисто историческая теоретическая статья. Конечно, даже без попытки обхвата всей широты темы. Но это так сказать посыл молодому разработчику, который читает по верхам и не может выбрать каких принципов и правил ему придерживаться, что первично, а что вторично.

Заглавие этой темы для многих сейчас может показать очень спорным (и скорее намерено провокационным, но для дела :) ). Но все же мы постараемся это здесь обосновать и понять какими свойствами должна обладать парадигма программирования, чтобы иметь право называться парадигмой.

Единственно прошу, если прочитали по диагонали — комментируйте сдержано.

Читать дальше →
Total votes 44: ↑17 and ↓27 -10
Views 15K
Comments 118

Я не знаю ООП

Programming *ООP *
Я не умею программировать на объектно-ориентированных языках. Не научился. После 5 лет промышленного программирования на Java я всё ещё не знаю, как создать хорошую систему в объектно-ориентированном стиле. Просто не понимаю.

Я пытался научиться, честно. Я изучал паттерны, читал код open source проектов, пытался строить в голове стройные концепции, но так и не понял принципы создания качественных объектно-ориентированных программ. Возможно кто-то другой их понял, но не я.

И вот несколько вещей, которые вызывают у меня непонимание.
Читать дальше →
Total votes 412: ↑309 and ↓103 +206
Views 539K
Comments 870

«Забытые» парадигмы программирования

Website development *Programming *Perfect code *


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

Ладно. Введение это очень весело, но вы его все равно не читаете, так что кому интересно — добро пожаловать под кат!
Читать дальше →
Total votes 88: ↑44 and ↓44 0
Views 74K
Comments 18

Эдсгер Дейкстра: в поисках «кратчайшего пути» к осознанному программированию

Programming *Perfect code *Algorithms *
image
Изображение с сайта abv24.com

Один из тех людей, с именем которых связано превращение программирования из шаманства в науку, — Эдсгер Дейкстра. Он небезуспешно доказывал, что программирование — высокое искусство и интеллектуальное творчество.

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

Программирование – не набор пассов и заклинаний, не шаманство, не танцы с бубном, а математическая дисциплина. А всякая дисциплина, если она претендует на нечто большее, чем на внешний эффект, должна строиться на прочном фундаменте. Таким фундаментом для Дейкстры является математическая логика, а точнее – исчисление предикатов.

Сейчас это не кажется чем-то необычным, но в 50-е годы это прозвучало как откровение. Дейкстра понял и убедительно показал, как теория может и должна помочь практике.
Читать дальше →
Total votes 57: ↑56 and ↓1 +55
Views 50K
Comments 50

История языков программирования: Algol — жертва конфликта интересов

Programming *Compilers *Mathematics *
image

Влияние Algol на ИТ-индустрию

Название языка Algol (ALGOrithmic Language), первая версия которого появилась в 1958 году, подчеркивает то обстоятельство, что он предназначен для записи алгоритмов. Благодаря четкой логической структуре Algol стал стандартным средством записи алгоритмов в научной и технической литературе. Однако он так и не смог полноценно конкурировать с языком Fortran, а с COBOL его и вовсе было трудно сравнивать в силу отсутствия некоторых важных возможностей у Algol – той же обработки текстов например или форматирования ввода/вывода.

«Роды» Algol проходили очень тяжело. Для некоторых его создателей, прямо скажем, – в муках. Ученые и эксперты отрасли никак не могли прийти к единому мнению по многим вопросам.

В результате новый язык скорее вызвал интерес, чем привлек потребителей. Грейс Хоппер охарактеризовала его так: «Похож на большую поэму: простой и ясный с точки зрения математики, но отнюдь не практичный».
Читать дальше →
Total votes 27: ↑26 and ↓1 +25
Views 21K
Comments 8

Почему Go To Considered Harmful?

Programming *Perfect code *Algorithms *History of IT

Некоторое время назад мне понадобилось процитировать известное письмо Дейкстры 1968 года, и я воспользовался случаем, чтобы таки внимательно прочитать его. В наши дни "споры о `goto`" уже неактуальны, поскольку в большинстве современных языков команды `goto` либо нет вообще, либо используется она редко, и стало быть, обсуждать особо нечего. Однако мне была интересна аргументация. В нашей области масса "фольклорного знания", которое на поверку не всегда оказывается точным (что хорошо показано в книге Боссавита), так что оценить логику Дейкстры с позиции сегодняшнего дня не помешает. Надо сказать, что его формулировки не всегда легко понять, поэтому я решил изложить их несколько более простым языком, потратив немного больше места.

Читать далее
Total votes 21: ↑19 and ↓2 +17
Views 2.8K
Comments 33

Дзен Nim

Programming *C++ *Compilers *C *
Sandbox
Translation

1. Копирование плохого дизайна — плохой дизайн.

2. Если компилятор не может рассуждать о коде, то и программист не может.

3. Не стой на пути у программиста.

4. Перенеси работу на этап компиляции: программы запускаются гораздо чаще, чем компилируются.

5. Настраиваемое управление памятью.

6. Лаконичный код не мешает читабельности, он ей способствует.

7. (Задействовать метапрограммирование, чтобы оставить язык компактным).

8. Оптимизация это специализация: если вам нужно больше скорости, пишите кастомный код.

9. Должен быть только один язык программирования для всего. Этот язык — Nim.

Читать далее
Total votes 18: ↑15 and ↓3 +12
Views 6.8K
Comments 29

Спрос рождает предложение: как потребности программистов выливались в языки программирования

JUG Ru Group corporate blog Programming *History of IT


Про развитие программирования уже писано-переписано, и вряд ли можно сказать что-то принципиально новое. Однако полезно время от времени отрываться от текущих задач, окидывать взглядом прошлое и осознавать, как именно всё пришло в текущую точку. Легко воспринимать всё вокруг как данность, но когда разбираешься, понимаешь, по каким причинам что-то возникло. В истории было много витков, на каждом из которых языки программирования давали ответ каким-то запросам своего времени.


Этот пост — «краткое содержание предыдущих серий», где эти витки собраны вместе (конечно, в очень упрощённом виде: в одном тексте все важные нюансы не расписать). А после него, окинув взглядом весь контекст, можно и на текущие задачи посмотреть по-новому. Какие новые запросы человечества видны сейчас, и какими станут новые языки программирования, отвечающие на них? Расскажите в комментариях, через десять лет проверим.

Читать дальше →
Total votes 19: ↑17 and ↓2 +15
Views 7.2K
Comments 13