Vader — простой логгер для Dart

в 9:54, , рубрики: dart, Google, logger, Программирование, метки: , ,

Vader — простой логгер для DartНесколько дней назад я решил пощупать в каком состоянии на данный момент находится представленный некоторое время назад язык Dart. Самый простой, на мой взгляд, способ попробовать возможности языка — это написать на нем нечто простое и законченное. Недолго думая, я решил написать простенький логгер для Dart в объектно-ориентированном стиле. Под катом изложено мое впечатление от Dart и краткое описание того, что получилось.

Dart, как вы знаете, находится в стадии активной разработки и на данный момент имеет:

  1. Виртуальную машину для исполнения кода локально
  2. Транслятор Dart-кода в Javascript
  3. Простую среду разработки Dart Editor, построенную на базе Eclipse и находящуюся в стадии альфа-версии.
  4. Специализированную сборку Chromium под названием Dartium, позволяющую запускать приложения Dart, без трансляции в Javascript.

Впечатления от самого языка

Легче всего на мой взгляд написать на Dart тому, кто хоть раз писал на Java, потому что синтаксис Dart очень много позаимствовал именно из этого языка. Однако при этом возникает ощущение, что над Java кто-то очень сильно надругался:

  • Странные соглашения об именовании файлов. В описании рекомендуемых правил оформления кода написано, что файлы *.dart следует именовать с маленькой буквы и со знаками подчеркивания. Как я понял основной причиной такого решения является то, что не все операционные системы различают регистр букв. Тем не менее очень странно открывать файл с именем в нижнем регистре и там находить класс.
  • Расположение кода в файлах. В Dart наблюдается полный хаос в расположении кода в файлах. Код может содержаться как в классах, так и вне классов. При этом точкой входа в программе является метод void main(). Даже код стандартной библиотеки Dart представляет собой странную смесь процедурного и объектно-ориентированного кода. В одном файле может содержаться определение файла
  • Отсутствие некоторых модификаторов ООП. В Dart отсутствует ключевое слово private, обозначающее в большинстве C-подобных языков закрытый метод класса. Вместо этого имена закрытых методов и полей должны начинаться со знака подчеркивания, что является лишь соглашением в некоторых других языках программирования.
  • Синтаксический сахар. В заслугу языка ставится наличие некоторых конструкций, которые можно считать не более чем синтаксическим сахаром. Например, если метод имеет короткую реализацию, то ее можно записать в той же строке, что и сигнатуру, разделив их стрелочкой =>. Имеются также ключевые слова get set, обозначающие методы — геттеры и методы — сеттеры.
  • Странные рекомендации по оформлению кода. Dart является в основном строго типизированным языком, что открывает огромные возможности для быстрого рефакторинга и отлова ошибок при написании программы. Однако, при этом в руководстве по стилю кода рекомендуется не указывать типы для локальных переменных. Что ж, очень и очень странно…

Впечатления от среды разработки

Тут все очень просто — среда сырая и с большим количеством багов. В первую очередь раздражает плохая работа автодополнения и подсветка кода. Например, автодополнение отказывается показывать закрытые метода класса внутри самого класса. Хотя до поддержки Java, обеспечиваемой Eclipse DartEditor еще далеко, тем не менее среда отлавливает наиболее очевидные ошибки, связанные с неправильным импортом библиотек или синтаксическими ошибками в коде. Показывает даже некоторые особенности стандартной библиотеки Dart — например, что нельзя одновременно импортировать клиентские (dart:html) и серверные библиотеки (dart:io).

Обещанный пример кода

Несморя на то, что сходная функциональность имеется в стандартной библиотеке, я написал очень простой логгер, позволяющий выводить сообщения с различным уровнем логгирования (Debug, Info, Alert и т.п.) в различные выходные потоки. Основными абстракциями, используемыми в логгере являются:

  • core/Severity.dart — задает уровень важности сообщения от DEBUG до EMERG.
  • core/LogEntry.dart — представляет собой единичную запись лога, которая хранит в себе текстовое сообщение и важность сообщения.
  • streams/Stream.dart — поток вывода сообщений, задает способ вывода сообщений пользователю. Каждый из указанных выше выходных потоков наследуется от этого класса. Вы также можете создать собственный выходной поток.

На данный момент реализовано 3 выходных потока:

  • streams/StdoutStream.dart — стандартный поток вывода с помощью print()
  • streams/WebConsoleStream.dart — вывод в консоль веб-разработчика в браузере
  • streams/FileStream.dart — вывод в файл

Пользоваться логгером очень просто:

#import("vader_server.dart");

void main(){
    Vader vader = Vader.vader(new StdoutStream());
    vader.logWarn("You don't know the power of the dark side!");
    vader.logInfo("Luke, I am your father!");
}

Для начала работы достаточно импортировать один из библиотечных файлов: vader_server.dart (для логгирования в файл) или vader_client.dart (для логгирования в браузере). Подобное разделение связано с тем, что в Dart нельзя одновременно импортировать клиентские и серверные библиотеки. Код логгера, снабженный комментариями, можно посмотреть по этой ссылке.

Автор: vaniaPooh

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js