Аспектно-ориентирано програмиране: Разлика между версии

Изтрито е съдържание Добавено е съдържание
Аспектно-ориентирано програмиране : История,Мотивация и основни понятия,Съединяване на точкови модели,Изпълнение,
 
Denitsar (беседа | приноси)
Редакция без резюме
Ред 1:
Аспектно-ориентирано програмиране{{редактирам}}
 
== '''Модели на съединени точки''' ==
Компонентът съветник на аспектно – ориентирания език дефинира модели на съединени точки (МСТ).
МСТ определят три неща:
# Кога съветникът може да бъде пуснат. Наречени са съединени точки защото те са точки на работеща програма, където допълнително поведение може да бъде полезно присъединено. За да бъде полезна, съединената точка трябва да може да бъде адресирана и разбрана от всеки обикновен програмист. Трябва също да бъде стабилна при незначителни промени в програмата, за да може всеки отделен аспект да бъде стабилен при такива промени. Много АОП имплементации поддържат метод за изпълнение и полеви препратки във вид на съединени точки.
# Поинткътс се нарича начина за определяне (или количествено определяне) на съединени точки. Поинткътс определят дали дадена съединени точка съвпада. Най-полезните поинткътс програмни езици използват подобен синтаксис на базовия език за програмиране (например използва Джава сигнатури) и позволяват повторна употреба чрез наименуване и комбиниране.
# Средство да се зададе на кода да тръгне по съединени точка. [[:bg:AspectJ|AspectJ]] нарича това съветник и може да го пусне преди, след и около съединени точка. Някои имплементации също поддържат неща като дефиниране на метод по отношение на друг клас.
Моделите на съединени точки могат да бъдат сравнени на базата на изложените съединени точки, по какъв начин те са специфицирани, позволените им операции, и структурните подобрения, които могат да бъдат изразени.
 
==== '''Модел на съединени точки на AspectJ''' ====
''Главна статия: [[:bg:AspectJ|AspectJ]]''
* Съединените точки в [[:bg:AspectJ|AspectJ]] включват извикването на метод или конструкция или изпълнението, инициализирането на клас или обект, достъпа до поле за четене и писане, обработка на изключения и тн. Те не включват цикли, супер извиквания, хвърляне на клаузи, множество изявления, и др.
* Съединените точки са определят чрез комбинирането на обозначители на примитивни съединени точки (ОПСТ).
„Типова“ ОПСТ съвпада със съединена точка от определен тип (например изпълнението на метод) и обикновено взима за вход сигнатура като при Джава. Подобна поинткът би изглеждала така:
execution(*set*(*))
Тази поинткът съвпада с метод execution на съединена точка, ако името на метода започва със “set” и има точно един аргумент от какъвто и да е тип в него.
„Динамични“ ОПСТ проверяват рънтайм видове и обвързват променливи. Например:
this(Point)
Този поинткът съвпада когато обектът, който в момента се изпълнява е инстанция на класа Point. Имайте предвид че некласифицирано име на един клас може да бъде използвано и чрез нормалния вид търсене на Джава.
„Обхват“ ОПСТ ограничава лексикално обхвата на съединените точки. Например:
within(com.company.*)
Тази поинткът съвпада с всяка съединена точка от всеки вид в пакета com.company. * е форма на заместващ символ, който може да бъде използван за съчетаване на много неща с еднаква сигнатура.
Поинткътите могат да бъдат съставяни и именувани за преизползване.
pointcut set() : execution(* set*(*) ) && this(Point) && within(com.company.*);
Този поинткът съвпада със съединена точка на метод execution, ако името на метода започва със „set“ и this е инстанция на тип Point в пакет com.company. Moже да бъде реферирана като се използва името "set()".
* Съветникa определя да пусне (преди, след или около) съединена точка (определена чрез поинткът) определен код (специфициран като код в метод). АОП рънтайм извиква Съветника автоматично, когато поинткъта съвпада със съединената точка. Например:
after() : set() {
Display.update();
}
Това на практика уточнява: "ако set() поинткът съвпадне със съединената точка стартирай кода Display.update() след като съединената точка се изпълни. "
 
==== '''Други потенциални модели на съединени точки''' ====
Има и други типове МСТ. Всички езици със съветник могат да бъдат определени от гледна точка на техните МСТ. Например, предполагаем аспектен език за [[:bg:UML|UML]] може да има следната МСТ:
* Съединените точки за всички елементи от модела.
* Поинткътите са булеви изрази, комбиниращи елементите на модела.
* Средствата за повлияване на тези точки са визуализиране на всички съвпадения на съединените точки.
 
 
//teksta na team-a
 
//kray na teksta na team-a
==Приложения==
Следните [https://bg.wikipedia.org/wiki/%D0%95%D0%B7%D0%B8%D0%BA_%D0%B7%D0%B0_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%B8%D1%80%D0%B0%D0%BD%D0%B5 езици за програмиране] имат приложено АОП в самия език или като външна библиотекаː
*[[:bg:Microsoft_.NET_Framework|.NET Framework]] езици ([[:bg:C_Sharp|C#]] / [[Visual Basic .NET|VB.NET]])<ref> Многобройни:
[https://github.com/vc3/Afterthought Afterthought], [http://www.rapier-loom.net/ LOOM.NET], [http://www.codeplex.com/entlib Enterprise Library 3.0 Policy Injection Application Block], [http://sourceforge.net/projects/aspectdng/ AspectDNG], [http://www.castleproject.org/projects/dynamicproxy/ DynamicProxy], [http://composestar.sourceforge.net/ Compose*], [http://www.seasar.org/en/dotnet/ Seasar.NET], [http://dotspect.tigris.org/ DotSpect (.SPECT)], [http://www.springframework.net/ Spring.NET] (като част от функционалността му), [http://www.cs.columbia.edu/~eaddy/wicca Wicca and Phx.Morph]</ref>
**[[Unity Application Block|Unity]], Предоставя API за улесняване на доказаните практитки в основни области на програмирането, включително достъп до данни, сигурност, логване, обрабтка на изключения и други.
*[[:bg:ActionScript|ActionScript]]<ref>[https://bg.wikipedia.org/wiki/ActionScript]</ref>
*[[:bg:Ada|Ada]]<ref>[http://www.adacore.com/uploads/technical-papers/Ada2012_Rational_Introducion.pdf Ada2012 Rationale]</ref>
*[[AutoHotkey]]<ref>[http://www.autohotkey.com/forum/viewtopic.php?p=243426 Function Hooks]</ref>
*[[:bg:C_(език_за_програмиране)|C]] / [[:bg:C++|C++]]<ref>Several: [[AspectC++]], [http://wwwiti.cs.uni-magdeburg.de/iti_db/forschung/fop/featurec/ FeatureC++], [http://www.cs.ubc.ca/labs/spl/projects/aspectc.html AspectC], [http://www.aspectc.net/ AspeCt-oriented C], [http://www.bramadams.org/aspicere/index.html Aspicere]</ref>
*[[:bg:COBOL|COBOL]]<ref>[http://homepages.vub.ac.be/~kdeschut/cobble/ Cobble]</ref>
*[[Cocoa (API)|Cocoa]] [[:bg:Objective-C|Objective-C]] уеб рамка (frameworkss)<ref>[http://www.ood.neu.edu/aspectcocoa/ AspectCocoa]</ref>
*[[ColdFusion]]<ref>[http://www.coldspringframework.org/ ColdSpring]</ref>
*[[Common Lisp]]<ref>{{cite web|url=http://common-lisp.net/project/closer/aspectl.html|title=Closer Project: AspectL.|publisher=|accessdate=11 August 2015}}</ref>
*[[:bg:Delphi_(език_за_програмиране)|Delphi]]<ref>{{cite web|url=http://code.google.com/p/infra/|title=infra - Frameworks Integrados para Delphi - Google Project Hosting|publisher=|accessdate=11 August 2015}}</ref><ref>{{cite web|url=http://code.google.com/p/meaop/|title=meaop - MeSDK: MeObjects, MeRTTI, MeAOP - Delphi AOP(Aspect Oriented Programming), MeRemote, MeService... - Google Project Hosting|publisher=|accessdate=11 August 2015}}</ref><ref>{{cite web|url=http://code.google.com/p/delphisorcery/|title=Google Project Hosting|publisher=|accessdate=11 August 2015}}</ref>
*[[Delphi Prism]]<ref>[http://prismwiki.codegear.com/en/Cirrus RemObjects Cirrus]</ref>
*[[E (verification language)|e]] (IEEE 1647)
*[[Emacs Lisp]]<ref>[http://www.gnu.org/software/emacs/elisp/html_node/Advising-Functions.html Emacs Advice Functions]</ref>
*[[:bg:Groovy_(език_за_програмиране)|Groovy]]
*[[:bg:Haskell|Haskell]]<ref>[[monad (functional programming)]] ({{cite journal | id = {{citeseerx|10.1.1.25.8262}} | title = Monads As a theoretical basis for AOP }}) and [http://portal.acm.org/citation.cfm?id=1233842 Aspect-oriented programming with type classes.] [http://dl.acm.org/citation.cfm?id=2451457 A Typed Monadic Embedding of Aspects]</ref>
*[[:bg:Java|Java]]<ref>Numerous others: [http://www.caesarj.org/ CaesarJ], [http://composestar.sourceforge.net/ Compose*], [http://dynaop.dev.java.net/ Dynaop], [http://jac.objectweb.org/ JAC], [[Google Guice]] (as part of its functionality), [http://www.csg.is.titech.ac.jp/~chiba/javassist/ Javassist], [http://ssel.vub.ac.be/jasco/ JAsCo (and AWED)], [http://www.ics.uci.edu/~trungcn/jaml/ JAML], [http://labs.jboss.com/portal/jbossaop JBoss AOP], [http://roots.iai.uni-bonn.de/research/logicaj LogicAJ], [http://www.objectteams.org/ Object Teams], [http://prose.ethz.ch/ PROSE], [http://www.aspectbench.org/ The AspectBench Compiler for AspectJ (abc)], [[Spring framework]] (as part of its functionality), [[Seasar]], [http://roots.iai.uni-bonn.de/research/jmangler/ The JMangler Project], [http://injectj.sourceforge.net/ InjectJ], [http://www.csg.is.titech.ac.jp/projects/gluonj/ GluonJ], [http://www.st.informatik.tu-darmstadt.de/static/pages/projects/AORTA/Steamloom.jsp Steamloom]</ref>
**[[:bg:AspectJ|AspectJ]]
*[[:bg:JavaScript|JavaScript]]<ref>Many: [http://i.gotfresh.info/2007/12/7/advised-methods-for-javascript-with-prototype/ Advisable], [http://code.google.com/p/ajaxpect/ Ajaxpect], [http://plugins.jquery.com/project/AOP jQuery AOP Plugin], [http://aspectes.tigris.org/ Aspectes], [http://www.aspectjs.com/ AspectJS], [http://www.cerny-online.com/cerny.js/ Cerny.js], [http://dojotoolkit.org/ Dojo Toolkit], [http://humax.sourceforge.net/ Humax Web Framework], [http://code.google.com/p/joose-js/ Joose], [[Prototype.js|Prototype]] - [http://www.prototypejs.org/api/function/wrap Prototype Function#wrap], [http://developer.yahoo.com/yui/3/api/Do.html YUI 3 (Y.Do)]</ref>
*[[Logtalk (programming language)|Logtalk]]<ref>Using built-in support for categories (which allows the encapsulation of aspect code) and event-driven programming (which allows the definition of ''before'' and after ''event'' handlers).</ref>
*[[Lua (programming language)|Lua]]<ref>{{cite web|url=http://luaforge.net/projects/aspectlua/|title=AspectLua|publisher=|accessdate=11 August 2015}}</ref>
*[[make (software)|make]]<ref>{{cite web|url=http://www.bramadams.org/makao/|title=MAKAO, re(verse)-engineering build systems|publisher=|accessdate=11 August 2015}}</ref>
*[[:bg:MATLAB|Matlab]]<ref>{{cite web|url=http://www.sable.mcgill.ca/mclab/aspectmatlab/index.html|title=McLab|publisher=|accessdate=11 August 2015}}</ref>
*[[ML (programming language)|ML]]<ref>{{cite web|url=http://www.cs.princeton.edu/sip/projects/aspectml/|title=AspectML - Aspect-oriented Functional Programming Language Research|publisher=|accessdate=11 August 2015}}</ref>
*[[:bg:Пърл_(език_за_програмиране)|Perl]]<ref>{{cite web|url=https://metacpan.org/module/Aspect|title=Aspect - Aspect-Oriented Programming (AOP) for Perl - metacpan.org|author=Adam Kennedy|publisher=|accessdate=11 August 2015}}</ref>
*[[:bg:PHP|PHP]]<ref>Several: [http://aop.io PHP-AOP (AOP.io)], [http://go.aopphp.com Go! AOP framework], [http://code.google.com/p/phpaspect/ PHPaspect], [http://www.seasar.org/en/php5/index.html Seasar.PHP], [http://php-aop.googlecode.com/ PHP-AOP], [http://flow.typo3.org/ TYPO3 Flow], [https://github.com/AOP-PHP/AOP AOP PECL Extension]</ref>
*[[:bg:Пролог_(език_за_програмиране)|Prolog]]<ref>[http://www.bigzaphod.org/whirl/dma/docs/aspects/aspects-man.html "Whirl"]</ref>
*[[:bg:Python|Python]]<ref>Several: [http://peak.telecommunity.com/ PEAK], [http://old.aspyct.org Aspyct AOP], [http://www.cs.tut.fi/~ask/aspects/aspects.html Lightweight Python AOP], [http://www.logilab.org/projects/aspects Logilab's aspect module], [http://pythius.sourceforge.net/ Pythius], [http://springpython.webfactional.com/1.1.x/reference/html/aop.html Spring Python's AOP module], [http://pytilities.sourceforge.net/doc/1.1.0/guide/aop/ Pytilities' AOP module], [http://python-aspectlib.readthedocs.org/en/latest/ aspectlib]</ref>
*[[Racket (programming language)|Racket]]<ref>{{cite web|url=http://planet.racket-lang.org/display.ss?package=aspectscheme.plt&owner=dutchyn|title=PLaneT Package Repository : PLaneT > dutchyn > aspectscheme.plt|publisher=|accessdate=11 August 2015}}</ref>
*[[:bg:Ruby|Ruby]]<ref>{{cite web|url=http://aspectr.sourceforge.net/|title=AspectR README|publisher=|accessdate=11 August 2015}}</ref><ref>{{cite web|url=http://aspectr-fork.sourceforge.net/|title=AspectR - Simple aspect-oriented programming in Ruby|publisher=|accessdate=11 August 2015}}</ref><ref>{{cite web|url=http://aquarium.rubyforge.org/|title=Home|author=Dean Wampler|publisher=|accessdate=11 August 2015}}</ref><ref>{{cite web|url=https://github.com/gcao/aspector|title=gcao/aspector|work=GitHub|accessdate=11 August 2015}}</ref>
*[[:bg:Squeak|Squeak]] [[:bg:Smalltalk|Smalltalk]]<ref>[http://www.prakinf.tu-ilmenau.de/~hirsch/Projects/Squeak/AspectS/ AspectS]</ref><ref>{{cite web|url=http://csl.ensm-douai.fr/MetaclassTalk|title=MetaclassTalk: Reflection and Meta-Programming in Smalltalk|publisher=|accessdate=11 August 2015}}</ref>
*[[:bg:UML|UML 2.0]]<ref>[http://www.iit.edu/~concur/weavr WEAVR]</ref>
*[[:bg:XML|XML]]<ref>{{cite web|url=http://code.google.com/p/aspectxml/|title=aspectxml - An Aspect-Oriented XML Weaving Engine (AXLE) - Google Project Hosting|publisher=|accessdate=11 August 2015}}</ref>
 
==Вижте също==
* [[Aspect-oriented software development|Аспектно-ориентирано разработване на софтуер]]
* [[Distributed AOP|Дистрибутирано АОП]]
* [[Attribute grammar|Граматика на атрибути]], (Attribute grammar) формализъм, който може да бъде използван за аспектно-ориентирано програмиране върху езици за [[:bg:Функционално_програмиране|функционално програмиране]].
* [[:bg:Парадигма_на_програмиране|Парадигма на програмиране]]
* [[Subject-oriented programming|Субектно-ориентирано програмиране]], алтернатива на Аспектно-ориентираното програмиране
* [[Role-oriented programming|Ролево-ориентирано програмиране]], алтернатива на Аспектно-ориентираното програмиране
* [[Predicate dispatch|Предикатно изпращане]] (Predicate dispatch) по-стара алтернатива на Аспектно-ориентираното програмиране
* [[Executable UML|Екзекутивен UML]]
* [[:bg:Декоратор_(шаблон)|Декоратор (шаблон)]]
* [[Domain-driven design]]
 
==Бележки и препратки==
{{reflist}}
 
{{Превод от|en|Aspect-oriented programming|711318480}}
 
[[Категория:Парадигми на програмиране]]
[[Категория: Програмиране]]