stringtranslate.com

Черта (компьютерное программирование)

В компьютерном программировании черта — это языковая концепция , представляющая собой набор методов , которые можно использовать для расширения функциональности класса . [ 1] [2]

Обоснование

В объектно-ориентированном программировании поведение иногда разделяется между классами, которые не связаны друг с другом. Например, многие несвязанные классы могут иметь методы для сериализации объектов в JSON . Исторически существовало несколько подходов для решения этой проблемы без дублирования кода в каждом классе, которому нужно поведение. Другие подходы включают множественное наследование и миксины , но у них есть недостатки: поведение кода может неожиданно измениться, если порядок применения миксинов изменен или если в родительские классы или миксины добавлены новые методы.

Черты решают эти проблемы, позволяя классам использовать черту и получать желаемое поведение. Если класс использует более одной черты, порядок, в котором черты используются, не имеет значения. Методы, предоставляемые чертами, имеют прямой доступ к данным класса.

Характеристики

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

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

Операции, которые можно выполнять с чертами, включают: [3] [4]

Если метод исключен из трейта, этот метод должен быть предоставлен классом, который потребляет трейт, или родительским классом этого класса. Это связано с тем, что методы, предоставляемые трейтом, могут вызывать исключенный метод.

Композиция признаков является коммутативной (т.е. при данных признаках A и B , A + B эквивалентно B + A ) и ассоциативной (т.е. при данных признаках A , B и C , ( A + B ) + C эквивалентно A + ( B + C )). [1]

Ограничения

Хотя характеристики дают существенные преимущества по сравнению со многими альтернативами, у них есть свои ограничения.

Требуемые методы

Если черта требует, чтобы потребляющий класс предоставлял определенные методы, черта не может знать, являются ли эти методы семантически эквивалентными потребностям черты. Для некоторых динамических языков, таких как Perl, требуемый метод может быть идентифицирован только по имени метода, а не по полной сигнатуре метода , что затрудняет гарантию того, что требуемый метод является подходящим.

Исключая методы

Если метод исключен из признака, этот метод становится «обязательным» для признака, поскольку другие методы признака могут его вызвать.

Поддерживаемые языки

Черты изначально пришли из языка программирования Self [5] и поддерживаются следующими языками программирования:

Примеры

С#

В C# 8.0 можно определить реализацию как член интерфейса.

с использованием Системы ; пространство имен CSharp8NewFeatures ; interface ILogger { // Традиционные методы интерфейса void Log ( string message ); void LogError ( Exception exception );         // Метод интерфейса по умолчанию void LogWarning ( string message ) { Console.WriteLine ( message ) ; } }       класс Logger : ILogger { public void Log ( string message ) { Console.WriteLine ( message ) ; }           public void LogError ( Exception exception ) { Console . WriteLine ( exception . ToString ()); } }      класс Программа { static void Main ( string [] args ) { ILogger logger = new Logger ();            logger.LogWarning ( "Некое предупреждающее сообщение " ) ; } } 

PHP

В этом примере черта используется для улучшения других классов:

// Шаблонный признак  TSingleton {  private  static  $_instance  =  null ; private  function  __construct ()  {}  // Должен иметь private конструктор по умолчанию и быть осторожным, чтобы не открыть его в классе публичная  статическая  функция  getInstance ()  {  если  ( null  ===  self :: $_instance )  {  self :: $_instance  =  new  self ();  } вернуть  себя :: $_instance ;  } }класс  FrontController {  использовать  TSingleton ; }// Также может использоваться в уже расширенных классах class  WebSite  extends  SomeClass {  use  TSingleton ; }

Это позволяет моделировать аспекты множественного наследования:

черта  TBounding {  public  $x ,  $y ,  $width ,  $height ; }черта  TMoveable {  public  function  moveTo ( $x ,  $y )  {  // …  } }черта  TResizeable {  public  function  resize ( $newWidth ,  $newHeight )  {  // …  } }класс  Rectangle {  use  TBounding ,  TMoveable ,  TResizeable ; публичная  функция  fillColor ( $color )  {  // …  } }

Ржавчина

Трейт в Rust объявляет набор методов, которые тип должен реализовать. [44] Компиляторы Rust требуют, чтобы трейты были эксплицированы, что обеспечивает безопасность дженериков в Rust.

// тип T должен иметь черту "Ord" // чтобы можно было выполнять операции ">" и "<" fn  max < T : Ord > ( a : & [ T ])  -> Option <& T > { let mut result = a . first () ? ; for n in a { ​​if * n > * result { result = & n ; } } Some ( result ) }                      

Для упрощения утомительной и повторяющейся реализации таких признаков, как Debugи Ord, deriveможно использовать макрос для запроса компиляторов на автоматическую генерацию определенных реализаций. [45] Производные признаки включают: Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ordи Hash.

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

Ссылки

  1. ^ abc Schärli, Nathanael; Ducasse, Stéphane; Nierstrasz, Oscar ; Black, Andrew P. (2003). "Черты: составные единицы поведения" (PDF) . Труды Европейской конференции по объектно-ориентированному программированию (ECOOP) . Конспект лекций по информатике. 2743. Springer: 248–274. CiteSeerX  10.1.1.1011.8 . doi :10.1007/978-3-540-45070-2_12. ISBN 978-3-540-45070-2.
  2. ^ Дюкасс, Стефан; Ниерштрас, Оскар; Шерли, Натанаэль; Вюйтс, Роэль; Блэк, Эндрю П. (март 2006 г.). «Черты: механизм мелкозернистого повторного использования». Труды ACM по языкам программирования и системам . 28 (2): 331–388. CiteSeerX 10.1.1.64.2480 . doi :10.1145/1119479.1119483. S2CID  16434119. 
  3. ^ Фишер, Кэтлин ; Реппи, Джон (2003). "Статически типизированные признаки" (PDF) . Чикагский университет . Архивировано (PDF) из оригинала 17 мая 2004 г. {{cite journal}}: Цитировать журнал требует |journal=( помощь )
  4. ^ Фишер, Кэтлин; Реппи, Джон (2004). Типизированное исчисление признаков (PDF) . 11-й семинар по основам объектно-ориентированного программирования. Чикагский университет .
  5. ^ Карри, Гэл; Бэр, Ларри; Липки, Дэниел; Ли, Брюс (1982). Черты: подход к множественному наследованию подклассов . Конференция SIGOA по офисным информационным системам. Филадельфия, Пенсильвания, США: ACM Press. стр. 1–9. doi :10.1145/966873.806468.
  6. ^ Ван Катсем, Том; Бергель, Александр; Дюкасс, Стефан; Де Мейтер, Вольфганг (2009). Добавление управления состоянием и видимостью к признакам с использованием лексического вложения (PDF) . Европейская конференция по объектно-ориентированному программированию (ECOOP 2009). Конспект лекций по информатике. Том 5653. Springer-Verlag. С. 220–243. CiteSeerX 10.1.1.372.1265 . doi :10.1007/978-3-642-03013-0_11. ISBN  978-3-642-03012-3.
  7. ^ "Методы интерфейса по умолчанию". Что нового в C# 8.0 . Microsoft . Получено 29 ноября 2019 г. .
  8. ^ "Interfaces in C# 8.0 gets a makeover". Реализация по умолчанию в интерфейсах в C# 8.0 . Talking Dotnet. 9 сентября 2019 г. Получено 29 ноября 2019 г.
  9. ^ "iterator_traits<Итератор>". Стандартная библиотека шаблонов . SGI.
  10. ^ Майерс, Натан С. (июнь 1995 г.). «Признаки: новый и полезный метод шаблонов». Отчет по C++ . Получено 23 января 2016 г.
  11. ^ Абрахамс, Дэвид. "Универсальные методы программирования: черты". Boost C++ Libraries . Получено 23 января 2016 г.
  12. ^ Стил, Гай; Мессен, Ян-Виллем (11 июня 2006 г.). "Fortress Programming Language Tutorial" (PDF) . Sun Microsystems . Получено 23 января 2016 г. .
  13. ^ "Ориентация объектов: черты". Язык программирования Groovy . Получено 23 января 2016 г.
  14. ^ "Haxe 2.4.0 - Haxe - кроссплатформенный инструментарий". Haxe - кроссплатформенный инструментарий . Получено 2017-09-12 .
  15. ^ "Руководство - Haxe - Кроссплатформенный инструментарий". Haxe - Кроссплатформенный инструментарий . Получено 2017-09-12 .
  16. ^ "Методы по умолчанию". Учебники Java . Oracle . Получено 23 января 2016 г.
  17. ^ Ликуори, Луиджи; Спивак, Арно (2008). «FeatherTrait: скромное расширение Featherweight Java». Труды ACM по языкам и системам программирования . 30 (2): 11:1. doi : 10.1145/1330017.1330022 . S2CID  17231803.
  18. ^ Ликуори, Луиджи; Спивак, Арно (2008). «Расширение FeatherTrait Java с помощью интерфейсов». Теоретическая информатика . 398 (1–3): 243–260. doi : 10.1016/j.tcs.2008.01.051 . S2CID  12923128.
  19. ^ Боно, Вивиана; Менса, Энрико; Наддео, Марко (сентябрь 2014 г.). Программирование, ориентированное на черты в Java 8. Международная конференция по принципам и практикам программирования на платформе Java: виртуальные машины, языки и инструменты (PPPJ '14). стр. 181–6. CiteSeerX 10.1.1.902.161 . doi :10.1145/2647508.2647520. 
  20. ^ Форслунд, Эмиль (3 февраля 2016 г.). «Определение паттерна черт в Java». Возраст Java . Архивировано из оригинала 4 августа 2016 г. Получено 3 февраля 2016 г.
  21. ^ Селигер, Питер (11 апреля 2014 г.). «Множество талантов JavaScript» . Получено 23 января 2015 г.
  22. ^ "Traits.js: Traits для JavaScript" . Получено 23 января 2016 г.
  23. ^ Ван Катсем, Том; Миллер, Марк С. (2012). "Надежная композиция признаков для Javascript" (PDF) . Наука компьютерного программирования . Получено 23 января 2016 г. .
  24. ^ "CocktailJS" . Получено 23 января 2016 г.
  25. ^ mauro3. "SimpleTraits.jl". GitHub . Получено 23 марта 2017 г.{{cite web}}: CS1 maint: numeric names: authors list (link)
  26. ^ "Интерфейсы". Справочник по Kotlin . JetBrains . Получено 23 января 2016 г.
  27. ^ Бреслав, Андрей (29 мая 2015 г.). "Kotlin M12 вышел!". Kotlin Blog . JetBrains . Получено 23 января 2016 г. .
  28. ^ «Черты». Руководство по языку Лассо . ЛассоСофт. 6 января 2014 года . Проверено 23 января 2016 г.
  29. ^ "Modular Docs - Mojo🔥 changelog". docs.modular.com . Получено 2023-12-13 .
  30. ^ chromatic (30 апреля 2009 г.). "Почему роли Perl" . Получено 23 января 2016 г. .
  31. ^ Кертис «Овидий» По. «Предложение Коринны OOP». Corinna RFC . Получено 30 сентября 2022 г.
  32. ^ "Traits". PHP Documentation . PHP Group . Получено 23 января 2016 г.
  33. Марр, Стефан (9 января 2011 г.). «Запрос комментариев: горизонтальное повторное использование для PHP». PHP.net wiki . PHP Group . Получено 31 января 2011 г.
  34. ^ Перя, Теппо. «Документация py3traits» . Проверено 23 января 2016 г.
  35. ^ Перя, Теппо (25 марта 2015 г.). "py2traits". Гитхаб . Проверено 23 января 2016 г.
  36. ^ "Высшие классы смешанных классов". Архивировано из оригинала 2016-10-09.
  37. ^ "Черты". The Racket Reference . Получено 23 января 2016 г.
  38. Дэвид Насеби (14 февраля 2004 г.). «Черты в Руби». Руби Насеби . Получено 23 января 2016 г. .
  39. ^ "Traits". Язык программирования Rust . Получено 30 сентября 2019 г.
  40. ^ «Черты». Экскурсия по Скале . Федеральная политехническая школа Лозанны . Проверено 23 января 2016 г.
  41. Ньюард, Тед (29 апреля 2008 г.). «Руководство для занятых разработчиков Java по Scala: черты и поведение». IBM developerWorks . IBM . Получено 23 января 2016 г. .
  42. ^ "Черты за 10 минут". Pharo: The CollaborActive Book . Получено 23 января 2016 г.
  43. Холлеманс, Маттейс (22 июля 2015 г.). «Миксины и трейты в Swift 2.0» . Проверено 23 января 2016 г.
  44. ^ «Трейты — Введение в программирование с использованием Rust».
  45. ^ «Трейты — язык программирования Rust».

Внешние ссылки