11.07.2015 Views

Выпуск 1 - Российский государственный профессионально ...

Выпуск 1 - Российский государственный профессионально ...

Выпуск 1 - Российский государственный профессионально ...

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Семинар44январь 2012 / ИНФорматикаint a = 4;double b = 5.1;String s = "Test string " + a + b;// значения a и b будут преобразованы// в строки и все три имеющиеся строки// будут склеены в однуКак видно, в Dart существуют три различных способавключения переменных и выражений в строки:от самого мощного с фигурными скобками допростейшей конкатенации строк с необходимымитиповыми преобразованиями переменных.В мире объектовЭтот подраздел будет посвящен объектно ориентированномупрограммированию на Dart. Если выимеете опыт программирования на Javascript, ноне имеете опыта работы с классово ориентированнымиязыками, некоторые понятия будут для васв новинку. Также вам придется не совсем просто,если вы вообще не имеете понятия об объектноориентированном программировании.Объектно ориентированное программированиетесно связано с имитационным моделированием иставит задачу не формального описания мира, а описанияего структурных и функциональных параметров.В связи с этим возникла модель мира как набораэлементарных “объектов”, обладающих сложнойиерархией взаимоотношений. Однако в свете двойственностихарактеристик этой модели — “структуры”и “функций”, она распалась на две подмодели:“структурный функционализм” классово ориентированногопрограммирования и “функциональныйструктурализм” прототипно ориентированного программирования.C прототипно ориентированнымпрограммированием знакомы все программисты наJavascript, однако не все из них знают, что появилосьоно значительно позднее классового варианта из-за серьезныхпроблем эффективной реализации. Я не будууглубляться в особенности этого подхода, посколькупредметом обсуждения являются не языки семействаECMAScript. Google созданием Dart, как я уже говорилранее, решил убрать прототипно ориентированноепрограммирование из веба, заменив его комплекснойклассовой системой с поддержкой интерфейсов,обеспечив нужную гибкость без обременительных затратна дополнительные вычисления.Классы в Dart создаются и описываются довольнопросто (определять классы нужно вне функцийи функции main в том числе):// вне функции mainclass TestMe {String name = "Test";test() {print("Here I am: ${name}");}}// в функции mainTestMe a = new TestMe();a.test();Из этого примера можно видеть, что синтаксическикласс в Dart — это просто блок кода, в которомопределяются поля-переменные и методыфункции.Определения полей и методов могут идтив любом порядке. Для читателей, знакомых толькос языками с ручным управлением памяти, такими,как С++ и Pascal, стоит сказать, что в Dart используетсяавтоматическая сборка мусора, и созданныеобъекты не нужно удалять вручную.Если вы любитель языков Object Pascal и C++, выможете спросить: где же определения областей видимостивроде public или private? Как и во многих другихдинамических по своей природе языках, в Dart подобногопонятия не существует, это наследие Smalltalk,и такой тон особенно ярко выражен в таких языках,как Python или Ruby. Все поля в классе по умолчаниюявляются public, кроме тех, что начинаются с символаподчеркивания, которые не определены как private,но считаются таковыми по соглашению. К примеру:// считаем, что класс TestMe уже определен// и объект а инициализирован// ошибки нет, name теперь равно// "Look at me!"a.name = "Look at me!";class TestMe {String _name = "Test";test() {print("Here I am: ${_name}");}}// в mainTestMe a = new TestMe();// также нет ошибки, однако это плохой тонa._name = "Look at me!";Как я уже сказал в комментарии к вышеприведенномукоду, изменение поля, чье имя начинаетсяс подчеркивания, — дурной тон. Более того,в настоящих ОО-языках дурным тоном считаетсяпрямое изменение любого поля объекта. Для этоговводятся так называемые “методы-аксессоры”,которые служат для управляемого доступа к полю.Они могут быть геттерами — методами, читающимизначение поля, и сеттерами — методами, записывающимив поле соответствующее значение.Подобная практика очень удобна, например, в техслучаях, когда необходимо производить проверкувводимых данных из текстового поля, и являетсядальнейшим развитием простой инкапсуляции.class TestMe {// private по соглашениюString _name = "Test";// геттерString get name() => _name;// здесь также используется// лямбда-выражение, обозначаемое как =>void set name(String value) {// void здесь можно опуститьif (value == null) value = "";_name = value;}

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!