ÐÑпÑÑк 1 - РоÑÑийÑкий гоÑÑдаÑÑÑвеннÑй пÑоÑеÑÑионалÑно ...
ÐÑпÑÑк 1 - РоÑÑийÑкий гоÑÑдаÑÑÑвеннÑй пÑоÑеÑÑионалÑно ...
ÐÑпÑÑк 1 - РоÑÑийÑкий гоÑÑдаÑÑÑвеннÑй пÑоÑеÑÑионалÑно ...
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;}