Знакомство с аспектно-ориентированным<br />программированием<br />Михаил Крестьянинов,Новотелеком<br />
Эволюцияпарадигм<br />2<br />
Сферический быдлокод в вакууме<br />public class WebService {<br />    publicBookDTOgetBook(IntegerbookId) {<br />BookDTOb...
Сферический быдлокод:<br />Логирование<br />publicBookDTOgetBook(IntegerbookId) {<br />LOG.debug("Call method getBook with...
Сферический быдлокод:<br />Обработкаисключений<br />publicBookDTOgetBook(IntegerbookId)<br />    throws ServiceException {...
Сферический быдлокод:Авторизация<br />publicBookDTOgetBook(IntegerbookId)<br />    throws ServiceException, AuthException ...
Сферический быдлокод:Кеширование<br />publicBookDTOgetBook(IntegerbookId)<br />    throws ServiceException, AuthException ...
Сферический быдлокод:Идеальныйвариант<br />8<br />
Сквознаяфункциональность<br /><ul><li>логирование;
профилирование;
обработкатранзакций;
обработкаошибок;
авторизация и проверкаправ;
кеширование;
контрактноепрограммирование.</li></ul>9<br />
Чтотакое АОП<br />Основнойзадачейаспектно-ориентированногопрограммирования (АОП) является модуляризация сквознойфункционал...
AspectJ: Примераспекта<br />@Aspect<br />public classWebServiceLogger {<br />    privatefinal static Logger LOG =<br />Log...
Термины АОП<br /><ul><li>аспект (aspect);
совет (advice);
точкасоединения (join point);
срез (pointcut);
внедрение (introduction).</li></ul>12<br />
AspectJ: точкисоединения<br />Созданиеобъекта<br /><ul><li>initialization(MyClass || MyOtherClass);
staticinitialization(MyClass+ && !MyClass);</li></ul>Вызовметода, обращение к свойству<br /><ul><li>execution(static * com...
call(void MyInterface.*(..));
handler(ArrayOutOfBoundsException);
get/set(static intMyClass.x);</li></ul>13<br />
AspectJ: точкисоединения<br />Вспомагательные<br /><ul><li>this/target(MyClass)
args(Integer)
within/withincode(MyClass)
cflow/cflowbelow(call(void MyClass.test()))
@annotation(MyAnnotation)</li></ul>14<br />
AspectJ: советы<br /><ul><li>before – запусксоветадовыполненияточкисоединения;
after returning — запусксоветапосленормальноговыполненияточкисоединения;
Upcoming SlideShare
Loading in …5
×

CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программирования

1,088 views
874 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,088
On SlideShare
0
From Embeds
0
Number of Embeds
294
Actions
Shares
0
Downloads
6
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программирования

  1. 1. Знакомство с аспектно-ориентированным<br />программированием<br />Михаил Крестьянинов,Новотелеком<br />
  2. 2. Эволюцияпарадигм<br />2<br />
  3. 3. Сферический быдлокод в вакууме<br />public class WebService {<br /> publicBookDTOgetBook(IntegerbookId) {<br />BookDTObook = bookDAO.readBook(bookId);<br /> returnbook;<br /> }<br />}<br />3<br />
  4. 4. Сферический быдлокод:<br />Логирование<br />publicBookDTOgetBook(IntegerbookId) {<br />LOG.debug("Call method getBook with id "<br /> + bookId);<br />BookDTObook = bookDAO.readBook(bookId);<br />LOG.debug("Book info is: "<br /> + book.toString());<br /> returnbook;<br />}<br />4<br />
  5. 5. Сферический быдлокод:<br />Обработкаисключений<br />publicBookDTOgetBook(IntegerbookId)<br /> throws ServiceException {<br />LOG.debug("Call method getBook with id " + bookId);<br />BookDTObook = null;<br /> try {<br />BookDTObook = bookDAO.readBook(bookId);<br /> } catch(SQLException e) {<br /> throw new ServiceException(e);<br /> }<br />LOG.debug("Book info is: " + book.toString());<br /> returnbook;<br />}<br />5<br />
  6. 6. Сферический быдлокод:Авторизация<br />publicBookDTOgetBook(IntegerbookId)<br /> throws ServiceException, AuthException {<br /> if (!SecurityContext.getUser().hasRight("GetBook"))<br /> throw new AuthException("Permission Denied");<br />LOG.debug("Call method getBook with id " + bookId);<br />BookDTObook = null;<br /> try{<br />BookDTObook = bookDAO.readBook(bookId);<br /> } catch(SQLException e) {<br /> throw newServiceException(e);<br /> }<br />LOG.debug("Book info is: " + book.toString());<br /> returnbook;<br />}<br />6<br />
  7. 7. Сферический быдлокод:Кеширование<br />publicBookDTOgetBook(IntegerbookId)<br /> throws ServiceException, AuthException {<br /> if(!SecurityContext.getUser().hasRight("GetBook"))<br /> throw newAuthException("Permission Denied");<br />LOG.debug("Call method getBook with id " + bookId);<br />BookDTObook = null;<br /> String cacheKey = "getBook:" + bookId;<br /> try{<br /> if (cache.contains(cacheKey)) {<br /> book = (BookDTO) cache.get(cacheKey);<br /> } else {<br />BookDTObook = bookDAO.readBook(bookId);<br />cache.put(cacheKey, book);<br /> }<br /> } catch(SQLException e) {<br /> throw newServiceException(e);<br /> }<br />LOG.debug("Book info is: " + book.toString());<br /> returnbook;<br />}<br />7<br />
  8. 8. Сферический быдлокод:Идеальныйвариант<br />8<br />
  9. 9. Сквознаяфункциональность<br /><ul><li>логирование;
  10. 10. профилирование;
  11. 11. обработкатранзакций;
  12. 12. обработкаошибок;
  13. 13. авторизация и проверкаправ;
  14. 14. кеширование;
  15. 15. контрактноепрограммирование.</li></ul>9<br />
  16. 16. Чтотакое АОП<br />Основнойзадачейаспектно-ориентированногопрограммирования (АОП) является модуляризация сквознойфункциональности, выделениееё в аспекты.<br />10<br />
  17. 17. AspectJ: Примераспекта<br />@Aspect<br />public classWebServiceLogger {<br /> privatefinal static Logger LOG =<br />Logger.getLogger(WebServiceLogger.class);<br /> @Pointcut("execution(* example.WebService.*(..)) <br /> && @annotation(example.Loggable)")<br /> public voidloggableMethod() { }<br /> @Around(“loggableMethod()")<br /> public ObjectlogWebServiceCall(ProceedingJoinPointthisJoinPoint) {<br /> String methodName = thisJoinPoint.getSignature().getName();<br /> Object[] methodArgs = thisJoinPoint.getArgs();<br />LOG.debug("Call method " + methodName + " with args " + methodArgs);<br /> Object result = thisJoinPoint.proceed();<br />LOG.debug("Method " + methodName + " returns " + result);<br /> returnresult;<br /> }<br />}<br />11<br />
  18. 18. Термины АОП<br /><ul><li>аспект (aspect);
  19. 19. совет (advice);
  20. 20. точкасоединения (join point);
  21. 21. срез (pointcut);
  22. 22. внедрение (introduction).</li></ul>12<br />
  23. 23. AspectJ: точкисоединения<br />Созданиеобъекта<br /><ul><li>initialization(MyClass || MyOtherClass);
  24. 24. staticinitialization(MyClass+ && !MyClass);</li></ul>Вызовметода, обращение к свойству<br /><ul><li>execution(static * com.xyz..*.*(..));
  25. 25. call(void MyInterface.*(..));
  26. 26. handler(ArrayOutOfBoundsException);
  27. 27. get/set(static intMyClass.x);</li></ul>13<br />
  28. 28. AspectJ: точкисоединения<br />Вспомагательные<br /><ul><li>this/target(MyClass)
  29. 29. args(Integer)
  30. 30. within/withincode(MyClass)
  31. 31. cflow/cflowbelow(call(void MyClass.test()))
  32. 32. @annotation(MyAnnotation)</li></ul>14<br />
  33. 33. AspectJ: советы<br /><ul><li>before – запусксоветадовыполненияточкисоединения;
  34. 34. after returning — запусксоветапосленормальноговыполненияточкисоединения;
  35. 35. after throwing — запусксоветапослевыбросаисключения в процессевыполненияточкисоединения;
  36. 36. after — запусксоветапослелюбоговариантавыполненияточкисоединения;
  37. 37. around – запусксоветавместовыполненияточкисоединения (выполнениеточкисоединенияможетбытьвызвановнутрисовета).</li></ul>15<br />
  38. 38. AspectJ: вторая попытка<br />@Aspect<br />public classWebServiceLogger {<br /> private final static Logger LOG =<br />Logger.getLogger(WebServiceLogger.class);<br /> @Pointcut("execution(* example.WebService.*(..)) <br /> && @annotation(example.Loggable)")<br /> public voidloggableMethod() { }<br /> @Around(“loggableMethod()")<br /> public ObjectlogWebServiceCall(ProceedingJoinPointthisJoinPoint) {<br /> String methodName = thisJoinPoint.getSignature().getName();<br /> Object[] methodArgs = thisJoinPoint.getArgs();<br />LOG.debug("Call method " + methodName + " with args " + methodArgs);<br /> Object result = thisJoinPoint.proceed();<br />LOG.debug("Method " + methodName + " returns " + result);<br /> return result;<br /> }<br />}<br />16<br />
  39. 39. PostSharp<br />Аспектобработкиисключений:<br />public classExceptionDialogAttribute : OnExceptionAspect<br />{<br /> public override voidOnException(MethodExecutionEventArgs e)<br /> {<br /> stringmessage = e.Exception.Message;<br /> Window window = Window.GetWindow((DependencyObject)<br />eventArgs.Instance);<br />MessageBox.Show(window, message, "Exception");<br />eventArgs.FlowBehavior= FlowBehavior.Continue;<br /> }<br />}<br />17<br />
  40. 40. PostSharp<br />Применениеаспектачерезнастройкисборки:<br />[assembly: ExceptionDialog<br /> ( AttributeTargetTypes="Example.WorkflowService.*",<br />AttributeTargetMemberAttributes= <br />AttributeTargetElements.Public)<br />]<br />Применениеаспекта с помощьюатрибута:<br />[ExceptionDialog]<br />publicBookDTOGetBook(Integer bookId)<br />18<br />
  41. 41. PostSharp<br />Aспекты:<br /><ul><li>OnMethodBoundary/OnMethodInvocation– обращение к методу (начало, конец, выход, выход с исключением);
  42. 42. OnFieldAccess – обращение к свойству;
  43. 43. OnException – обработкаисключения;
  44. 44. Composition – внедрениекода.</li></ul>19<br />
  45. 45. Какэтоработает?<br />20<br />
  46. 46. Какэтоработает?<br /><ul><li>Изменение байт-кода:</li></ul>21<br />
  47. 47. Какэтоработает?<br /><ul><li>Автоматическоесоздание proxy-объектов:</li></ul>22<br />
  48. 48. Оттеории к практике<br />23<br />
  49. 49. Оттеории к практике<br />24<br />
  50. 50. Оттеории к практике<br /><ul><li>Отталкиваетнеобходимостьиспользованиядополнительныхкомпиляторов;
  51. 51. Смущаетотсутствиеширокойизвестности и большогосообщества.</li></ul>26<br />
  52. 52. Spring AOP<br /><ul><li>написанначистом Java/C#;
  53. 53. неиспользуетстороннихкомпиляторов;
  54. 54. урезаннаяподдержка АОП;
  55. 55. интеграция с AspectJ;
  56. 56. поддержкааннотаций @AspectJ;
  57. 57. часть Spring Framework.</li></ul>26<br />
  58. 58. Spring AOP: Примеры<br />Ограничениеправдоступа:<br /><sec:protect-pointcut<br /> expression="execution(* ru.novotelecom.xxx.Subscription.*(..))"<br /> access="ROLE_SUBSCRIPTION_MANAGER"/><br />Или<br />@Aspect<br />public class SecurityManager{<br /> @Before("execution(* ru.novotelecom.xxx.Subscription.*(..))")<br /> public void doAccessCheck() {… }<br />}<br />27<br />
  59. 59. Spring AOP: Примеры<br />Обработкаисключений:<br />@Aspect<br />public classWebServiceException {<br /> @Pointcut("execution(* example.WebService.*(..)) && @annotation(example.Loggable)")<br /> public voidloggableMethod() { }<br /> @Around(“loggableMethod()")<br /> public ObjectlogWebServiceCall(ProceedingJoinPointthisJoinPoint)<br /> throws ServiceException {<br /> Object result = null;<br /> try {<br /> result = thisJoinPoint.proceed();<br /> } catch (Exception e) {<br /> throw new ServiceException(e);<br /> }<br /> returnresult;<br /> }<br />}<br />28<br />
  60. 60. Альтернативы<br />Шаблоныпроектирования:<br /><ul><li>Proxy
  61. 61. Decorator
  62. 62. Chain of responsibility</li></ul>Конструкцииязыка:<br /><ul><li>Аннотации / Атрибуты</li></ul>29<br />
  63. 63. АОП в другихязыках<br /><ul><li>python (Aspyct)
  64. 64. perl (Aspect CPAN)
  65. 65. ruby (AspectR)
  66. 66. c++ (AspectC++)
  67. 67. php (Seasar, GAP)
  68. 68. javascript (Ajaxpect)</li></ul>30<br />
  69. 69. Резюме<br /><ul><li>Основнаяцель АОП — выноса «общей» (сквозной) функциональности «заскобки» (модуляризация сквознойфункциональности);
  70. 70. Для Java AOP доступенчерезпроект AspectJ, для .NET – через PostSharp;
  71. 71. Наиболеепростая и провереннаяреализация AOP – Spring AOP.</li></ul>31<br />
  72. 72. Оттеории к практике<br />32<br />
  73. 73. Ссылки<br /><ul><li>http://habrahabr.ru/blogs/programming/114649/
  74. 74. http://www.eclipse.org/aspectj/
  75. 75. http://www.sharpcrafters.com/postsharp
  76. 76. https://www.ibm.com/developerworks/ru/library/j-aopwork15/
  77. 77. http://en.wikipedia.org/wiki/Aspect-oriented_programming</li></ul>33<br />
  78. 78. Вопросы?<br />Михаил Крестьянинов,Новотелеком<br />mikhail.krestjaninoff@gmail.com<br />

×