9 марта 2013 г.

Объектно-ориентированное программирование в WinJS приложениях

Всем привет! Сегодня мы поговорим о такой важной вещи, как объектно-ориентированное программирование и как его можно использовать в контексте разработки Windows Store JavaScript приложений.

Как правило, любая программа, выходящая по уровню сложности за рамки калькулятора, должна иметь определенную архитектуру, то есть определенный набор классов, компонентов и правил их взаимодействия.

Однако, исторически, в языке JavaScript, поддержка объектно-ориентированного программирования была очень слабой, поэтому сегодня существует множество библиотек, которые расширяют ядро языка, добавляя синтаксис для создания классов (Microsoft AJAX, CoffeScript, TypeScript и прочие).

Разработчики ядра WinJS прекрасно понимали, что для Windows 8 будут писаться отнюдь не простые приложения, поэтому предусмотрели возможности удобной работы с классами.

В этой статье мы познакомимся с основными приемами ООП на WinJS.

Создание класса

Для создания класса необходимо следовать следующему синтаксису.

   1:  var object = WinJS.Class.define(constructor, instanceMembers, staticMembers); 

Здесь вы можете задать конструктор, свойства и методы объекта, а также статические свойства и методы типа. Рассмотрим пример создания класса и его использования:

   1:  var Car = WinJS.Class.define(
   2:      function(name) {
   3:          this.modelName = name;
   4:      },
   5:      {
   6:          modelName: "",
   7:          getPrice: function() {
   8:              return 10;
   9:          }
  10:      },
  11:      {
  12:          canFly: false,
  13:          getAllModels: function() { }
  14:      }
  15:  );

Для доступа к свойствам и методам объекта необходимо сначала создать объект класса. Доступ к статическим членам осуществляется через имя класса. Пример использования класса Car приведен ниже:

   1:  var o = new Car("BMW");
   2:  o.modelName;
   3:  o.getPrice();
   4:   
   5:  Car.canFly;
   6:  Car.getAllModels();

Наследование

Одно из основных понятий ООП - наследование. Объект потомок получает свойства и методы родителя. В WinJS это реализовано следующим образом:

   1:  var SportCar = WinJS.Class.derive(
   2:          
   3:      Car, // класс-родитель
   4:          
   5:      function () { }, // конструктор
   6:          
   7:      {
   8:          sportVendor: "" // поле типа
   9:      },
  10:      {
  11:          getAllSportModels: function () { }  // статический метод
  12:      }
  13:  );
  14:   
  15:  var o = new SportCar("Mitsubishi Sport"); // конструктор родителя
  16:  o.modelName // поле родителя
  17:  o.sportVendor // поле потомка

Тут вроде все понятно, объект класса потомка имеет доступ как к собственным полям и методам, так и к членам родительского класса. А вот дальше мы посмотри на кое-что оригинальное, чего вы не найдете в таких языках как C# или Java.

Смешивание

Как и во многих языках, в JavaScript не поддерживается множественное наследование. В WinJS предусмотрели функция для эмулирования такого поведения. При помощи следующего синтаксиса все поля и методы одного класса копируются в целевой класс.

   1:  WinJS.Class.mix(MyClass, ClassForImport);

Данную функцию можно вызывать множество раз, интегрируя в свой класс любое количество других классов. Один из типичных сценариев использования – присоединение к своему классу объект WinJS.UI.DOMEventMixin. При этом ваш класс получает методы работы с событиями.

Пространства имен.

Также стоит обратить внимание на работу с пространствами имен. Совершенно недопустимо создавать все классы приложения в глобальном пространстве имен, тем самым превращая его в свалку.

Ядро WinJS предлагает нам две основные функции управления пространствами имен:

1) Объявление пространства имен.

   1:  WinJS.Namespace.define("AutoNamespace", {
   2:      Car: WinJS.Class.define(...)
   3:  });

Все классы объявленные внутри объекта будут созданы в указанном пространстве имен. Чтобы создать объект такого класса необходимо использовать полный путь к нему, как показано ниже:

   1:  var o = new MyNamespace.Car("BMW");

2) Расширение существующих пространств имен. Такой сценарий бывает полезен при написании различных классов расширений/дополнений/утилит. Например, реализовав свой кастомный контрол, вполне логично поместить его в пространство имен WinJS.UI, как показано в примере ниже:

   1:  WinJS.Namespace.defineWithParent(WinJS.UI, "MyNamespace", {
   2:      Car: WinJS.Class.define(...)
   3:  });

Теперь класс Car будет доступен по адресу: WinJS.UI.Car.

Итак, мы рассмотрели с вами все базовые вещи, которые относятся к ООП в WinJS. Спасибо, что дочитали до этого места :) Приятной разработки на платформе Windows 8!

1 комментарий:

  1. А на сайте: www.superplayers1.ru можно посмотреть курс по созданию ка

    ОтветитьУдалить