Как стать автором
Обновить

«Чашка чая» на разных языках

Время на прочтение5 мин
Количество просмотров2.8K
Какой язык программирования Вы предпочитаете? C++? Или чистый C? Или Вы поклонник скриптовых языков — Python или PHP?
Конечно, Вы ответите, что это зависит от задач, которые перед Вами стоят.
Хорошо. Давайте попробуем реализовать простой алгоритм — приготовить чашку чая — на разных языках программирования.
Можете посмотреть, что получилось у меня. Реализации не претендуют на право быть идеальными, да и результаты отличаются. Но ведь дело не в чае — дело в языке! Итак...

Сразу оговорюсь — программы не полные. Да и зачем они нужны, ведь уже давно существуют и 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. Что-то заставило меня допустить именно в этих языках глупые ошибки при публикации. Еще раз спасибо комментаторам!
Теги:
Хабы:
Всего голосов 48: ↑26 и ↓22+4
Комментарии34

Публикации

Истории

Ближайшие события