Какой язык программирования Вы предпочитаете? C++? Или чистый C? Или Вы поклонник скриптовых языков — Python или PHP?
Конечно, Вы ответите, что это зависит от задач, которые перед Вами стоят.
Хорошо. Давайте попробуем реализовать простой алгоритм — приготовить чашку чая — на разных языках программирования.
Можете посмотреть, что получилось у меня. Реализации не претендуют на право быть идеальными, да и результаты отличаются. Но ведь дело не в чае — дело в языке! Итак...
Сразу оговорюсь — программы не полные. Да и зачем они нужны, ведь уже давно существуют и The Hello World Collection на более, чем 400 языках, и 99 Bottles of Beer, реализаций которых почти на 1000 больше. Но минусы этих коллекций в том, что они очень слабо отражают стилистику программирования как такового, и сводятся, максимум, к одному циклу с print'ами. Мы же попробуем заглянуть чуточку глубже.
Начнем, по традиции (а может, без традиции) с языка C. Лаконично, последовательно и без особых изысков получился такой кусок кода:
Уж простите, не стал вдаваться в подробности, выделять заголовки.h и описывать использование всех «чайных» параметров… Но сравнивать есть с чем.
Дальше — C++. Огромное творческое пространство для любителей «украшать» сухой код C всякими примочками и абстракциями. Но главное, о чем не надо забывать —покодил попил чайку — убери за собой! (это был легкий намек на деструкторы и обсуждения вокруг них)
Казалось бы, идеальная объектная реализация? Все на своих местах? Ни тут-то было! Посмотрим в сторону Java, где инженерная мысль по проектированию внутреннего пространства приложения и организации кода не дремлет и не должна дремать! Цель понятна — использовать наш код в других интерфейсах.
И это мы еще не придумали TeaCupFactory и не посадили за чашку чая человека, который бы ее implement'нул по назначению! Но не будем вдаваться… Следующий на очереди Python. Смысл прост: переопределяя магические методы объектов мы добиваемся лучшего интерфейса и удобства использования. Простота и лаконичность, буйство подчерков.
Не самый удобный интерфейс получился? Ничего страшного. В другой раз получится более аккуратно. Или, может, на Perl'е попробуем? Компактный код, синтаксическое богатство языка, ах...
Я надеюсь, Вы поняли, о чем я? Куда же без unless! Да и по производительности не проиграет наверное. Вот только временами сложно разобраться… Мой пример — это что, я ведь не true-Perl-программер. А представляете что можно со знанием дела-то наваять? Не то, что убогие PHP-программисты, мешающие в одну кучу процедурное программирование и ООП!
Еще конечно треугольные скобочки забыл со знаками вопроса… Ну да ладно. Но вот в JavaScript все совсем не так. Ничего лишнего. Не забываем только глобальные переменные делать локальными (ну, вроде того, оптимизировать обращение к ним) и расставлять точки с запятой, чтобы наш код можно было интегрировать в большие файлы.
Вот мы постепенно и подбираемся к концу… По крайней мере, код на этом закончился. Поэтому поспешу ответить на Ваши вопросы, которые, наверное, уже терзают.
— Зачем все это? — Посмотрим на стилистику программирования на разных языках! На подходы к организации кода программы, на часто используемые «фишки» языков, причем независимо от задач. Конечно немножко (или даже сильно) утрированно, но все же. Разве не в таком стиле пишут большинство PHP-кодеров? И не похожим ли образом организованы исходники Apache или Nginx?
— Какой язык лучше? — А вот этого я не знаю… Какие-то люблю больше, какие-то меньше. Но это субъективно. Главное ведь — не на чем ты пишешь, а как ты это делаешь. Тогда ведь и работа может быть в радость, и все получаться будет!
UPD: Прошу прощения за несколько «странные» C++, Java и Python. Что-то заставило меня допустить именно в этих языках глупые ошибки при публикации. Еще раз спасибо комментаторам!
Конечно, Вы ответите, что это зависит от задач, которые перед Вами стоят.
Хорошо. Давайте попробуем реализовать простой алгоритм — приготовить чашку чая — на разных языках программирования.
Можете посмотреть, что получилось у меня. Реализации не претендуют на право быть идеальными, да и результаты отличаются. Но ведь дело не в чае — дело в языке! Итак...
Сразу оговорюсь — программы не полные. Да и зачем они нужны, ведь уже давно существуют и The Hello World Collection на более, чем 400 языках, и 99 Bottles of Beer, реализаций которых почти на 1000 больше. Но минусы этих коллекций в том, что они очень слабо отражают стилистику программирования как такового, и сводятся, максимум, к одному циклу с print'ами. Мы же попробуем заглянуть чуточку глубже.
Начнем, по традиции (а может, без традиции) с языка C. Лаконично, последовательно и без особых изысков получился такой кусок кода:
<br>#include <stdbool.h><br><br>#define TEA_OK 0<br><br>typedef enum _tea_type {<br> TEA_BLACK,<br> TEA_GREEN<br>} tea_type;<br><br>typedef struct _tea_cup {<br> tea_type type,<br> bool sugar<br>} tea_cup;<br><br>int drink_tea(tea_cup *cup) {<br> return TEA_OK;<br>}<br>
Уж простите, не стал вдаваться в подробности, выделять заголовки.h и описывать использование всех «чайных» параметров… Но сравнивать есть с чем.
Дальше — C++. Огромное творческое пространство для любителей «украшать» сухой код C всякими примочками и абстракциями. Но главное, о чем не надо забывать —
<br>#include <string><br><br>class TeaCup {<br> public:<br> enum Type {<br> BLACK,<br> GREEN<br> };<br> TeaCup(Type type);<br> TeaCup(std::string sType);<br> ~TeaCup();<br> protected:<br> Type type;<br>};<br><br>TeaCup::~TeaCup() {<br> DishWasher::wash(this);<br>}<br>
Казалось бы, идеальная объектная реализация? Все на своих местах? Ни тут-то было! Посмотрим в сторону Java, где инженерная мысль по проектированию внутреннего пространства приложения и организации кода не дремлет и не должна дремать! Цель понятна — использовать наш код в других интерфейсах.
<br>public interface Drinkable {<br> int drink();<br>}<br><br>public class Boiled {<br> protected bool boiled;<br> void setBoiled(bool boiled);<br> bool getBoiled();<br>}<br><br>public class TeaCup extends Boiled implements Drinkable {<br> int drink() {<br> return 0;<br> }<br>}<br>
И это мы еще не придумали TeaCupFactory и не посадили за чашку чая человека, который бы ее implement'нул по назначению! Но не будем вдаваться… Следующий на очереди Python. Смысл прост: переопределяя магические методы объектов мы добиваемся лучшего интерфейса и удобства использования. Простота и лаконичность, буйство подчерков.
<br>class TeaCup:<br><br> def __init__(self):<br> self.want = []<br><br> def __setattr__(self, name, value):<br> if value:<br> self.want.append(name)<br><br> def __str__(self):<br> return "Tea: %s" % (", ".join(self.want))<br><br> def drink(self):<br> return str(self)<br><br>if __name__ == "__main__":<br> cup = TeaCup()<br> cup.sugar = True<br> cup.lemon = True<br> cup.drink()<br>
Не самый удобный интерфейс получился? Ничего страшного. В другой раз получится более аккуратно. Или, может, на Perl'е попробуем? Компактный код, синтаксическое богатство языка, ах...
<br>use Carp qw( croak );<br><br>sub drink_tea {<br> croak "Shit!" if wantarray;<br> my $type = shift || "black";<br> my ($sugar, $lemon) = @_;<br> croak "What?" unless $type =~ /^black|green$/i;<br> 1;<br>}<br>
Я надеюсь, Вы поняли, о чем я? Куда же без unless! Да и по производительности не проиграет наверное. Вот только временами сложно разобраться… Мой пример — это что, я ведь не true-Perl-программер. А представляете что можно со знанием дела-то наваять? Не то, что убогие PHP-программисты, мешающие в одну кучу процедурное программирование и ООП!
<br>set_include_path(dirname(__FILE__) . PATH_SEPARATOR . "lib");<br>require_once("tea.cup.php");<br>$cup = new Tea_Cup();<br>$cup->with_lemon = true;<br>$cup->fill();<br>header("Content-Type: tea/black");<br>set_time_limit(0);<br>$cup->drink();<br>
Еще конечно треугольные скобочки забыл со знаками вопроса… Ну да ладно. Но вот в JavaScript все совсем не так. Ничего лишнего. Не забываем только глобальные переменные делать локальными (ну, вроде того, оптимизировать обращение к ним) и расставлять точки с запятой, чтобы наш код можно было интегрировать в большие файлы.
<br>;(function(w) {<br> var d = w.document, g = d.getElementById;<br> var cup = g("tea-cup");<br> if (!cup) return;<br> if (cup.className.indexOf("black") >= 0)<br> cup.appendChild(d.createElement("sugar"));<br> cup.style.visibility = "hidden";<br>})(window);<br>
Вот мы постепенно и подбираемся к концу… По крайней мере, код на этом закончился. Поэтому поспешу ответить на Ваши вопросы, которые, наверное, уже терзают.
— Зачем все это? — Посмотрим на стилистику программирования на разных языках! На подходы к организации кода программы, на часто используемые «фишки» языков, причем независимо от задач. Конечно немножко (или даже сильно) утрированно, но все же. Разве не в таком стиле пишут большинство PHP-кодеров? И не похожим ли образом организованы исходники Apache или Nginx?
— Какой язык лучше? — А вот этого я не знаю… Какие-то люблю больше, какие-то меньше. Но это субъективно. Главное ведь — не на чем ты пишешь, а как ты это делаешь. Тогда ведь и работа может быть в радость, и все получаться будет!
UPD: Прошу прощения за несколько «странные» C++, Java и Python. Что-то заставило меня допустить именно в этих языках глупые ошибки при публикации. Еще раз спасибо комментаторам!