Просмотров-1186
0

Объектно — ориентированное программирование на языке Crystal

Объектно ориентированное программирование

Принципы объектно-ориентированного программирования

В данной статье рассматривается новый объектно-ориентированный язык программирования Crystal, анализируются его возможности и показывается, что он позволяет создавать современное эффективное программное обеспечение. Но сначала немного истории — вспомним основные принципы объектно-ориентированного программирования вообще.

Объектно-ориентированное программирование ( ООП ) — это парадигма программирования, основанная на концепции «объектов», которые могут содержать данные и код: данные в форме полей, часто называемые  атрибутами  или  свойствами,  и код в форме процедур, как правило, называемые методами. Любой современный объектно-ориентированный язык программирования позволяет создавать современное высокопроизводительное эффективное программное обеспечение.

Объектно-ориентированный язык программирования базируется на понятии «класс», который представляет собой пользовательский тип данных или шаблон для создания объектов – экземпляров класса. Тогда программа представляет собой совокупность взаимодействующих объектов.

Язык программирования называется объектно-ориентированным, если в нем реализованы следующие принципы:

  • инкапсуляции;
  • наследования;
  • полиморфизма.

Напомним определения этих понятий.

Инкапсуляция – это  концепция объектно-ориентированного программирования, которая связывает воедино данные и функции(методы), которые манипулируют данными, и защищает их как от внешнего вмешательства, так и от неправильного использования(сокрытие данных и методов).

Наследование— это  возможность создания новых классов (подклассов, производных классов) из существующих базовых классов, с последующим формированием их в иерархию классов. Производный класс наследует все переменные экземпляра и все методы экземпляра и класса(суперкласса), включая его конструкторы (new и initialize). Применение иерархии классов делает управляемыми большие потоки информации.

Полиморфизм  — это свойство(принцип), которое позволяет одно и то же имя использовать для решения двух или более схожих, но технически разных задач. Целью полиморфизма, применительно к объектно-ориентированному программированию, является использование одного имени для задания общих для класса действий. Выполнение каждого конкретного действия будет определяться типом данных.

Примечание. Объекты, созданные из классов, занимают память в «общей куче» и сборщику мусора приходится освобождать эту область памяти. Создание множества объектов может быстро истощить ресурсы ЭВМ. Программисту за этим следует следить постоянно.

Далее рассмотрим реализацию подробнее программную реализацию принципов ООП на примере нового языка программирования Crystal. Crystal  — это высокоуровневый объектно-ориентированный язык программирования, в котором реализованы все принципы ООП.

Основы языка и его синтаксиса будут объясняться и сопровождаться примерами фрагментов программ, созданными в среде программирования языка Crystal.

Использование инкапсуляции в программах

Любой объектно-ориентированный язык программирования, в том числе и языка программирования Crystal, использует инкапсуляцию для сокрытия значений структурированных данных или состояния объекта внутри класса, предотвращая прямой доступ к ним со стороны клиентов таким образом, чтобы это могло раскрыть скрытые детали реализации или нарушить инвариантность состояния, поддерживаемую методами. Единицей инкапсуляции и наследования в ООП является класс.

Для реализации инкапсуляции в программах объектно-ориентированный язык программирования использует ограничение видимости (так называемая инкапсуляция кода). Управление доступом к переменным и методам класса осуществляется с помощью специальных ключевых слов public, protected или private, записываемых перед определением метода и означающих общедоступный, защищенный и закрытый, соответственно.

По умолчанию методы являются общедоступными, если нет  ключевого слова public.

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

Например, объявим класс, имеющий два атрибута и два метода.

  1. class Sensor                            #  имя класса
  2.   @izmPar: Float32                #  имя  переменной класса вещественного типа
  3.   def initialize(izmPar : Float32)   #  имя  метода класса(инициализация объекта)
  4.     @izmPar = izmPar                    # инициализация через параметр
  5.     @speed = 0                                    инициализация присваиванием
  6.   End
  7. def izmPar
  8.     @izmPar
  9.   end
  10.   def speed
  11.     @speed
  12.   end
  13. end

Если в этом классе вторую строчку записать так private  @izmPar: Float32, то получим ошибку:

Error: can’t apply visibility modifier

Ошибка: не удается применить модификатор видимости

Потому что модификатор видимости(доступа) применяется только к методам.

Если будет объявлен закрытый(частный) метод, например

private def izmPar

    @izmPar

  End

То использовать его в программе нельзя. Private метод может быть вызван только в том классе, где он объявлен.  Если так,

 sensor = Sensor.new(50,100)

sensor.izmPar,

то  применение sensor.izmPar в программе приведет к ошибке: Error: private method ‘izmPar’ called for Sensor — Ошибка: для Sensor вызван частный метод «» izmPar

Аналогично и для защищенного(protected) метода.

Кроме того, объявление метода с явным указанием модификатора видимости приводит к ошибке.

public def izmPar

    @izmPar

  end

Error: can’t declare def dynamically.

Ошибка: не удается динамически объявить def.

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

Дополняем класс методом

def izmMer

   puts sensor.izmPar

  end

Теперь

sensor = Sensor.new(50,100)

sensor.izmMer,

метод sensor.izmPar выполнится без ошибки.

Инкапсуляция в объектно-ориентированном языке программирования

Грамотное применение уровней доступа к элементам класса хорошо обеспечивает безопасность кода программы на языке программирования Crystal и создавать эффективное программное обеспечение.

Перегрузка методов

Для расширения возможностей объектно-ориентированный язык программирования использует такое свойство методов как перегрузка. Это означает, что в классе могут быть разные методы с одинаковым именем и разным количеством и типом аргументов, с различной сигнатурой, и они будут рассматриваться как отдельные методы. 

Перегрузка методов осуществляется по нескольким критериям:

Количество аргументов

Ограничения типа, применяемые к аргументам

Принимает ли метод блок или нет

Например, ниже определяется четыре разных метода с одним именем:

  1. class Proba
  2.   @x: Int32
  3.   def initialize(x : Int32)
  4.     @x=x
  5.     puts «Начальное значение», «#{@x}»
  6.   end
  7.   # Увеличение значения на единицу
  8.   def increm
  9.     @x += 1
  10.   end
  11. # Увеличение значения на y
  12.   def increm(y : Int32)
  13.     @x += y
  14.   end
  15. # Увеличение значения начисло, заданное строкой str
  16.   def increm(str : String)
  17.     @x += str.to_i
  18.   end
  19. #Вырабатывает текущее значение и увеличивает его
  20. # на значение, возвращаемое блоком
  21.  def increm
  22.     @x += yield @x
  23.   end
  24. end
  25. Создаем объект класса 
  26. probn = Proba.new(3)
  27. Выполнякм методы с одним именем и различными параметрами.
  28. #probn.increm
  29. puts «Увеличенное значение на 1», probn.increm   #=> 4
  30. #probn.increm(6)
  31. puts «Увеличенное значение на 6», probn.increm(6)      #=> 10
  32. #probn.increm(«25»)
  33. puts «Увеличенное значение на 25», probn.increm(«25»)     #=> 36
  34. probn.increm  do |current_x|
  35.   current_x < 30 ? 15 : 40
  36. end
  37. puts «Увеличенное значение на число из блока», probn.increm    #=> 76
Объектно-ориентированный язык программирования - перегрузка методов

Использование наследования  в программах

Объектно-ориентированный язык программирования, и язык программирования Crystal в том числе, с целью уменьшения затрат на разработку программы применяет свойство наследования классов. Наследование позволяет программистам создавать классы, основанные на существующих классах,  чтобы указать новую реализацию с сохранением того же поведения (реализация интерфейса), повторно использовать код и независимо расширять исходное программное обеспечение через общедоступные классы и интерфейсы.

В новом языке программирования Crystal предусмотрено одиночное наследование, обозначаемое: подкласс < суперкласс. Перемещение свойств и методов, объединенных в несколько классов, в один суперкласс позволяет всем им совместно использовать функциональные возможности. Таким образом, в подклассе можно использовать все переменные экземпляра и все методы суперкласса, включая конструкторы.

Каждый класс, кроме Object - корня иерархии, наследуется от другого класса (его суперкласса). 

 Синтаксис объявления производного класса Temp от базового Sensor  имеет вид.

class Temp < Sensor               #объявлен пустой класс

end

Далее в программе запишем

sensor = Sensor.new(50,100)

temp=Temp.new(30,69)         #создание объекта произвольного класса

sensor.izmPar  #так нельзя:

Error: protected method ‘izmPar’ called for Sensor

Ошибка: для Sensor вызван защищенный метод izmPar

temp.izmPar    #так можно, класс Temp наследует метод izmPar класса Sensor.

Класс Temp  наследует все переменные и все методы суперкласса Sensor, включая его конструкторы ( new и initialize).

Методы в производном классе можно дополнять и переопределять. Но вызывать не переопределенные методы суперкласса нельзя. Например.

class Temp < Sensor

  self.izmPar

end

Возникает ошибка на этапе компиляции.

Error: undefined method ‘izmPar’ for Temp.class

Ошибка: неопределенный метод  “izmPar” для Temp.class

Объектно-ориентированный язык программирования -наследование

Можно также переопределить любой унаследованный метод в подклассе. Если подкласс определяет собственные методы initialize для инициализации, то они не наследуются. Если вы хотите использовать функциональность суперкласса после его переопределения, можно вызвать любой метод суперкласса с помощью «super»

Использование полиморфизма  в программах

В более общем смысле, концепцией полиморфизма является идея «один интерфейс, множество методов». Это означает, что можно создать общий интерфейс(сигнатуру) для группы близких по смыслу действий. Преимуществом полиморфизма является то, что он помогает снижать сложность программ, разрешая использование того же интерфейса для задания единого класса действий. Выбор же конкретного действия, в зависимости от ситуации, возлагается на компилятор. Программисту, не нужно делать этот выбор самому. Нужно только помнить и использовать общий интерфейс.

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

  1. Class sumInt
  2. n=10
  3. def summa(self,n)
  4.   self.summa= self.n + n
  5. end
  6. end
  7. Class sumString
  8. n=10
  9. def summa(self,s)
  10.   self.summa= len(snr(s)
  11. end
  12. end
  13. si =  sumInt()
  14. ss =  sumString()
  15. si.summa(45)     
  16. нss.summa(45)
  17. print(si.summa)      # результат 55
  18. print(ss.summa)      # результат 2

В данном примере метод с одним и тем же именем summa() используется как для суммирования целых чисел, так и для определения количества цифр в числе(длины строки).

Таким образом, объектно-ориентированный язык программирования Crystal имеет все возможности создавать современное эффективное программное обеспечение и позволяет решать широкий круг вычислительных задач.

Заключение

Crystal  — это высокоуровневый объектно-ориентированный язык программирования. Объектно-ориентированный язык программирования Crystal позволяет создавать современное эффективное программное обеспечение.

Инкапсуляция используется в программах для сокрытия значений или состояния объекта структурированных данных внутри класса.

 В языке Crystal предусмотрено одиночное наследование классов.

Статьи по теме

Простые типы данных
языка программирования Crystal
Язык программирования CrystalИзучение управляющих
конструкций языка
программирования Crystal
Изучение языка программирования Crysal Управляющие конструкции
Процедурное
программирование
на языке Crystal
Процедурное программирование на языке CrystalСтруктурированные
типы данных языка
программирования Crystal
Структурированные типы данных

Смотрите также…

  1. Что такое программирование?
  2. Что такое объектно-ориетированное программирование?
  3. Пример ООП на языке программирования Crystal
  4. Пример процедурного программирования на языке Crystal
  5. Как выбирать язык программирования высокого уровня для изучения
Внимание! Кто хочет своевременно узнавать о выходе новой статьи на сайте должен подписаться.

ПОДПИСКА НА РАССЫЛКУ

Статьи об онлайн курсах обучения

Дистанционное обучение
Обучение программированию
Проектирование информационных систем
 
Реклама. Информация о рекламодателе по ссылкам в статье.

brasm

Пенсионер с 33 - летним педагогическим стажем

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *