<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-25915256</id><updated>2011-04-22T04:21:02.005+07:00</updated><category term='aspect'/><category term='Grails'/><category term='definition'/><category term='Groovy'/><title type='text'>การโปรแกรมเชิงลักษณะ</title><subtitle type='html'>บล๊อกเพื่อโปรโมตการพัฒนาซอฟต์แวร์ด้วย AOSD ในทุกขั้นตอนของการพัฒนา</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://aspect-chanwit.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25915256/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://aspect-chanwit.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>chanwit</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_7gu9HQYUUjE/SZylbu8k6jI/AAAAAAAAASU/8LrnKrv5Gcs/s1600-R/8521163ddd403e477d514798488c4b6a%3Fs%3D80'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>12</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-25915256.post-7032624745863799802</id><published>2009-01-29T20:34:00.004+07:00</published><updated>2009-01-29T21:35:16.580+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='aspect'/><category scheme='http://www.blogger.com/atom/ns#' term='definition'/><title type='text'>สรุปนิยามการโปรแกรมเชิงลักษณะ 2552</title><content type='html'>&lt;div dir="ltr"&gt;Aspect-oriented programming หรือ AOP หรือที่ผมเรียกเป็นภาษาไทยว่า &lt;b&gt;การโปรแกรมเชิงลักษณะ&lt;/b&gt; นั้นเป็นแนวคิดที่สร้างขึ้นบนการโปรแกรมเชิงวัตถุหรือ OOP (หรืออาจจะบนการโปรแกรมเชิงโครงสร้างก็ได้) โดยมีจุดประสงค์หลักเพื่อแก้ปัญหาที่ยากหรือแก้ไม่ได้ด้วย OOP ในแง่ของการแยกความเกี่ยวพัน(Separation of Concerns) ซึ่งความเกี่ยวพันที่ว่าก็คือ &lt;span style="font-weight: bold;"&gt;ความเกี่ยวพันเชิง&lt;/span&gt;&lt;b&gt;ขวาง&lt;/b&gt; (Croscutting Concerns) ที่ ตัดในแนวขวางของการไหลของโปรแกรม (Flow of Program) แนวคิดของ AOP คือการดึงโค้ดที่กระจายตัวในลักษณะตัดขวางเหล่านั้นมารวบไว้ด้วยกันเป็น หน่วย เรียกว่า &lt;b&gt;aspect&lt;/b&gt; (ลักษณะ) โดยภายใน aspect จะประกอบไปด้วย pointcut ซึ่งเป็นประโยคอธิบายจุดนามธรรมที่เรียกว่า join point abstraction สำหรับ join point ก็คือจุดที่นิยามไว้ชัดเจน (well-defined points) ในการไหลของโปรแกรมอย่างเช่น constructor, method เป็นต้น ในการประกาศ pointcut จะมีการโยงเข้ากับโค้ดที่ต้องการให้ทำงานในจุดเหล่านั้น โค้ดดังกล่าวเรียกว่า advice code และจะสามารถระบุได้ว่า advice ที่ต้องการจะสาน (weave) ไปอยู่ในตำแหน่งใดของ join point เช่น before, around, after ซึ่งเรียกเป็นชนิดของ advice&lt;br /&gt;&lt;br /&gt;ด้านล่างจะเป็นนิยามที่ผมแปลและเรียบเรียงจากหลาย ๆ ที่เพื่อเสริมความเข้าใจ&lt;br /&gt;&lt;hr  width="100%" style="font-size:85%;"&gt;การโปรแกรมเชิงลักษณะ (Aspect-oriented programming) หรือ AOP เป็นกระบวนทัศน์หนึ่งของการเขียนโปรแกรมที่เพิ่มความเป็นโมดูลโดยอนุญาตให้แยกความเกี่ยวพันเชิงขวางได้&lt;br /&gt;&lt;br /&gt;การแยกความเกี่ยวพัน เป็นการแบ่งย่อยโปรแกรมเป็นแต่ละส่วน ๆ ที่แยกจากกันโดยเด็ดขาด ซึ่งเรียกว่าความเกี่ยวพัน โดยเป็นบริเวณที่เกาะกลุ่มกันตามหน้าที่การทำงาน ทุก ๆ กระบวนทัศน์ของการเขียนโปรแกรมจะสนับสนุนการรวมกลุ่มหรือห่อความเกี่ยวพันอย่างน้อย ๆ ในระดับหนึ่งเสมอ โดยจะรวบความเกี่ยวพันเป็นหน่วยที่แยกจากกันและมีนามธรรมเพื่อนิยามหน่วยนั้น ๆ เช่น procedure, module, class, method และนามธรรมดังกล่าวก็จะเป็นตัวแทนของความเกี่ยวพันเหล่านั้น อย่างไรก็ตาม มีความเกี่ยวพันบางชนิดที่ไม่เป็นไปตามที่นิยามข้างต้น จึงไม่สามารถจะรวบเป็นหน่วยได้ด้วยนิยามเหล่านั้น เช่นกลุ่มความเกี่ยวพันเชิงขวาง (crosscutting concerns) เพราะ ความเกี่ยวพันประเภทนี้ "ตัดผ่านในแนวขวาง" กับหน่วยนามธรรมประเภทอื่นในโปรแกรมหนึ่ง ๆ&lt;br /&gt;&lt;br /&gt;แปลและเรียบเรียงจาก &lt;a href="http://en.wikipedia.org/wiki/Aspect-oriented_programming" rel="nofollow"&gt;Wikipedia&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;hr size="2" width="100%"&gt;"เราพบว่ามีปัญหาของการโปรแกรมหลายปัญหาที่เทคนิคการโปรแกรมแบบ procedural หรือ object-oriented ไม่สามารถจับ&lt;span style="font-style: italic;"&gt; แนวคิดทางการออกแบบ&lt;/span&gt; ที่โปรแกรมนั้นจะต้องอิมพลีเมนต์ได้อย่างมีประสิทธิภาพ ความไร้ประสิทธิภาพจึงไปบังคับให้การอิมพลีเมนต์ของการออกแบบดังกล่าวแตก กระจายออกไปทั่วทั้งโค้ด ส่งผลให้เกิดโค้ดที่"ซ้ำซ้อน"ซึ่งทำให้เกิดความยากลำบากมากต่อการพัฒนาและ ดูแลรักษา เราเสนอการวิเคราะห์เหตุผลว่าทำไมจึงมีความยากในการจับแนวคิดการออกแบบดัง กล่าวในโค้ดจริง คุณสมบัติที่แนวคิดการออกแบบเหล่านี้สะท้อนออกมา เราเรียกว่า "ลักษณะ" และแสดงให้เห็นถึงเหตุผลว่า "ลักษณะ" เหล่านี้ยากที่จะจับและตัดขวางอยู่กับ ความสามารถพื้นฐานของระบบ เราเสนอพื้นฐานของเทคนิคการโปรแกรมแบบใหม่เรียกว่า &lt;span style="font-style: italic;"&gt;การโปรแกรมเชิงลักษณะ&lt;/span&gt; ที่สามารถทำให้อธิบายโปรแกรมได้อย่างชัดเจนด้วย&lt;br /&gt;"ลักษณะ"ดังกล่าว รวมถึงการแยกลักษณะออกอย่างเหมาะสม การรวมกลับ และการใช้ซ้ำของโค้ดลักษณะ การอภิปรายจะเป็นไปตามระบบที่เราพัฒนาขึ้นด้วยการโปรแกรมเชิงลักษณะ"&lt;br /&gt;&lt;br /&gt;แปลและเรียบเรียงจากบทคัดย่อของ&lt;a href="http://www.cs.ubc.ca/%7Egregor/papers/kiczales-ECOOP1997-AOP.pdf" rel="nofollow"&gt;งานตีพิมพ์ปี 1997 ของ เกรเกอร์ คิกซาเลส และคณะ&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;hr size="2" width="100%"&gt;สำหรับ&lt;a href="http://www.onjava.com/pub/a/onjava/2004/01/14/aop.html" rel="nofollow"&gt;บทความ&lt;/a&gt;บน Onjava.com ของ &lt;span&gt;Graham O'Regan ที่เขียนไว้เมื่อปี 2004 นั้น (ค้น Google ด้วยคำว่า aspect-oriented programming แล้วอยู่อันดับ 3) มีหลายท่านอ่านแล้วบอกว่าเข้าใจง่าย แต่ด้วยแนวคิดแล้วนั้นออกจะผิดหลุดกรอบหลักของ AOP ไปมาก โดยไปเน้นการแก้ไขโปรแกรมแบบไดนามิค (เปลี่ยนความหมายของโปรแกรมขณะรัน) แทนที่จะพูดถึงแนวคิดตัดขวางซึ่งเป็นพื้นฐานของ AOP&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;i&gt;&lt;span&gt;"Aspect-Oriented Programming (AOP) complements OO programming by &lt;b&gt;allowing the developer to dynamically modify the static OO model to create a system that can grow to meet new requirements&lt;/b&gt;. Just as objects in the real world can change their states during their lifecycles, an application can adopt new characteristics as it develops.&lt;/span&gt;"  &lt;/i&gt;(ตัวหนาเน้นโดยผม)&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;ซึ่งพอจะพูดได้ว่าบทความนี้เป็นต้นเหตุแห่งความเข้าใจ AOP ผิด ๆ ของยุคหลังปี 2000 เลยทีเดียว&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25915256-7032624745863799802?l=aspect-chanwit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aspect-chanwit.blogspot.com/feeds/7032624745863799802/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=25915256&amp;postID=7032624745863799802' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25915256/posts/default/7032624745863799802'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25915256/posts/default/7032624745863799802'/><link rel='alternate' type='text/html' href='http://aspect-chanwit.blogspot.com/2009/01/2552.html' title='สรุปนิยามการโปรแกรมเชิงลักษณะ 2552'/><author><name>chanwit</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_7gu9HQYUUjE/SZylbu8k6jI/AAAAAAAAASU/8LrnKrv5Gcs/s1600-R/8521163ddd403e477d514798488c4b6a%3Fs%3D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25915256.post-6539858513459376155</id><published>2008-04-10T06:40:00.001+07:00</published><updated>2008-04-10T06:40:34.105+07:00</updated><title type='text'>การศึกษาความหมายของ proceed</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;ตอนนี้ผมพยายามที่จะศึกษา formal definition ของภาษา AOP โดยใช้ภาษา &lt;a href='http://citeseer.ist.psu.edu/clifton05minimao.html'&gt;MiniMAO&lt;/a&gt; ของ Clifton และ Leavens เป็นเครื่องมือช่วย MiniMAO0 เป็น base language (ภาษาฐาน) มีข้อดีคือเป็น calculus ขนาดเล็กสุดที่ใช้อธิบายภาษาเชิงวัตถุได้ โดยลดรูปลงมาจาก Java ในแง่มุมเดียวกับ  &lt;a href='http://portal.acm.org/citation.cfm?id=503505'&gt;FGJ&lt;/a&gt; แต่ MiniMAO0 มีจุดพิเศษเพราะแยกความหมาย (semantics) ของ call และ execution ออกจากกัน เพื่อให้สะท้อนความหมายของ join point ให้ได้ดีขึ้นกว่าภาษาอื่น ๆ เช่น FGJ เป็นต้น&lt;br/&gt;&lt;br/&gt;เป้าหมายก็คือทำความเข้าใจความหมายของ proceed ผ่านทาง MiniMAO1 ซึ่งเป็นส่วนขยายภาษาเชิงลักษณะของ MiniMAO0 แล้วนิยามความหมายของ parproceed เพื่อการทำงานเชิงขนาน&lt;br/&gt;&lt;br/&gt;สำหรับผู้สนใจผมอธิบายแนวคิดของ parproceed เบื้องต้นไว้ใน paper ของ VMIL workshop ปี 2007 ชื่อ &lt;a href='http://portal.acm.org/citation.cfm?id=1230139'&gt;A Distributed Dynamic Aspect Machine for Scientific Software Development&lt;/a&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25915256-6539858513459376155?l=aspect-chanwit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aspect-chanwit.blogspot.com/feeds/6539858513459376155/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=25915256&amp;postID=6539858513459376155' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25915256/posts/default/6539858513459376155'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25915256/posts/default/6539858513459376155'/><link rel='alternate' type='text/html' href='http://aspect-chanwit.blogspot.com/2008/04/proceed.html' title='การศึกษาความหมายของ proceed'/><author><name>chanwit</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_7gu9HQYUUjE/SZylbu8k6jI/AAAAAAAAASU/8LrnKrv5Gcs/s1600-R/8521163ddd403e477d514798488c4b6a%3Fs%3D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25915256.post-6032521087750902388</id><published>2008-03-26T06:06:00.001+07:00</published><updated>2008-03-26T06:08:52.633+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Groovy'/><category scheme='http://www.blogger.com/atom/ns#' term='Grails'/><title type='text'>การใช้ Groovy AOP เพื่ออธิบายตรรกเชิงธุรกรรมในเกรลส์</title><content type='html'>เนื่องจากผมจะไปร่วมการประชุม AOSD '08 และไปนำเสนองานวิจัยใน SLAT 2008 workshop วันนี้ได้รับการบ้านมาหนึ่งชิ้นจากผู้จัด workshop โดยให้เตรียมการอธิบายสถานการณ์ในการพัฒนาซอฟต์แวร์ที่เจอมา ว่าการพัฒนาซอฟต์แวร์เชิงลักษณะเกี่ยวข้องกับสมบัติทางวิศวกรรมซอฟต์แวร์เชิงคุณภาพ (เลือกมา 1 ตัว) อย่างไร&lt;br /&gt;&lt;br /&gt;ผมเลือกที่จะอธิบาย Comprehensibility ที่สะท้อนออกมาจาก Groovy AOP เมื่อใช้งานกับ Grails เลยแปลงานตัวเองแล้วนำมาให้อ่านกันครับ&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;การใช้ Groovy AOP เพื่ออธิบายตรรกเชิงธุรกรรมในเกรลส์&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;เอกสารชิ้นนี้อธิบายปัญหาที่พบเมื่อนำ Groovy AOP ไปใช้กับเฟรมเวิร์คเกรลส์ซึ่งสะท้อน สมบัติ Comprehensibility&lt;br /&gt;&lt;br /&gt;ในเฟรมเวิร์คเกรลส์นั้นมีองค์ประกอบ (artefact) ระดับสูง(ที่มีความหมายเชิงนามธรรมสูงกว่าคลาส) หลาย ๆ อย่างเช่น ตัวควบคุม (Controller) หรือ โดเมนคลาส เป็นต้น ภาษา AOP ที่จะนำไปใช้กับเกรลส์นั้นจำเป็นที่จะต้องสนับสนุนการประกาศ pointcut ระดับที่สูงขึ้นเพื่อใช้อธิบายองค์ประกอบเหล่านั้น นอกจากนี้ เกรลส์สนับสนุนการพัฒนาส่วนขยายผ่านระบบปลั๊กอิน และนักพัฒนาก็สามารถนิยามองค์ประกอบเพิ่มขึ้นมาในปลั๊กอินที่พัฒนาขึ้นใหม่ได้ ดังนั้นภาษา AOP จึงจำเป็นที่จะต้องมีความสามารถในการพัฒนาส่วนขยายเช่นกัน เพื่อให้รองรับจุดร่วม (join point) ที่เพิ่มเข้ามาจากองค์ประกอบเหล่านั้น&lt;br /&gt;&lt;br /&gt;ยกตัวอย่างเช่น ในปัจจุบัน Groovy AOP สนับสนุน pointcut พื้นฐานดังเช่น:&lt;br /&gt;&lt;br /&gt;- pcall(pattern)&lt;br /&gt;- etc.&lt;br /&gt;&lt;br /&gt;แต่ pointcut เหล่านี้ไม่ได้สะท้อนความหมายขององค์ประกอบในเกรลส์ ซึ่งนักพัฒนาจะต้องการ pointcut เช่น:&lt;br /&gt;- controller(pattern)&lt;br /&gt;- action(pattern)&lt;br /&gt;- etc.&lt;br /&gt;&lt;br /&gt;ต่อไปนี้คือตัวอย่างของเวบแอพพลิเคชั่นที่เขียนด้วยเกรลส์&lt;br /&gt;&lt;pre&gt;class BookController {&lt;br /&gt;  def list = {&lt;br /&gt;    def books = Book.list()&lt;br /&gt;    render(view:'book', model:[books: books])&lt;br /&gt;  }&lt;br /&gt; &lt;br /&gt;  def show = {&lt;br /&gt;    ...&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  def update = {&lt;br /&gt;    ...&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;และนี่คือ aspect ที่เขียนด้วย Groovy AOP:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;aspect SecurityAspect {&lt;br /&gt;  def pc = pcall('BookController.*')&lt;br /&gt;  around(pc) {&lt;br /&gt;    // check access&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;และ aspect ต่อไปนี้เขียนด้วย Groovy AOP และใช้ pointcut ระดับสูงขึ้น (เพื่อจับความหมายของ ตัวควบคุม และ action):&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;aspect SecurityAspect {&lt;br /&gt;  def pc = controller('book') &amp; action('*')&lt;br /&gt;  around(pc) {&lt;br /&gt;    // check access&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;ตัวอย่างถัดมาคือ aspect เขียนด้วยไวยากรณ์อีกแบบของ Groovy AOP ด้วย pointcut ระดับสูงเช่นกัน แต่ไม่มีการนิยาม poincut แยก (ใช้แบบย่อ) ซึ่งแนวทางไวยากรณ์แบบนี้นำมาจากลักษณะภาษาที่นักพัฒนาเกรลส์คุ้นเคย&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;aspect SecurityAspect {&lt;br /&gt;   around(controller:'book', action:'*') {&lt;br /&gt;      // check access&lt;br /&gt;   }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;และนอกจากนี้ Groovy AOP ควรสนับสนุนความสามารถในการขยายระบบเพื่อให้ครอบคลุมองค์ประกอบซอฟต์แวร์ใหม่ ๆ ที่อาจเพิ่มเข้ามาได้ผ่านทางระบบปลั๊กอินของเกรลส์&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;บทสรุป&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Groovy AOP นั้นสามารถปรับใช้งานกับเฟรมเวิร์คเกรลส์ได้เนื่องจากตัวมันเป็นระบบ AOP เอนกประสงค์สำหรับภาษากรูวี่ ตัว Groovy AOP สามารถใช้อธิบายตรรกะเชิงธุรกรรมได้ในรูปของ ลักษณะระดับแอพพลิเคชั่น อย่างไรก็ตาม ตัวเฟรมเวิร์คเกรลส์นั้นมีความเป็นพลวัตรสูงและนักพัฒนาสามารถเพิ่มองค์ประกอบซอฟต์แวร์ได้ด้วยการสร้างปลั๊กอินตัวใหม่ เพื่อให้ระบบ AOP รองรับกับความต้องการนี้ ตัวระบบควรมีความสามารถรองรับการนิยาม pointcut ในลักษณะเดียวกันกับสถาปัตยกรรมปลั๊กอิน&lt;br /&gt;&lt;br /&gt;ตัวอย่างในบทความนี้สะท้อน Comprehensibility อย่างไร&lt;br /&gt;&lt;br /&gt;- เพื่อให้ภาษา AOP เพิ่มความเข้าใจให้กับนักพัฒนา&lt;br /&gt;ตัวระบบควรใช้ภาษาที่นักพัฒนาคุ้นเคย (โดยอ้างอิงจากภาษาหลัก หรือ เฟรมเวิร์คที่ระบบ AOP จะเข้าไปจัดการ)&lt;br /&gt;- เพื่อสนับสนุนความสามารถในการเปลี่ยนแปลงและปรับแต่ง&lt;br /&gt;ระบบควรเปิดช่องทางให้สามารถนิยาม PCD ใหม่ ๆ ได้&lt;br /&gt;- AOSD สนับสนุน Comprehensibility ดีแค่ไหน อย่างไร ?&lt;br /&gt;ขึ้นกับการอิมพลีเม้นต์และภาษาหลัก (เช่น Java / AspectJ, Groovy / Groovy AOP)&lt;br /&gt;อย่างไรก็ตามในปัจจุบัน Groovy AOP ยังไม่สนับสนุนสมบัติข้อดีได้ดีพอ&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25915256-6032521087750902388?l=aspect-chanwit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aspect-chanwit.blogspot.com/feeds/6032521087750902388/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=25915256&amp;postID=6032521087750902388' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25915256/posts/default/6032521087750902388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25915256/posts/default/6032521087750902388'/><link rel='alternate' type='text/html' href='http://aspect-chanwit.blogspot.com/2008/03/groovy-aop.html' title='การใช้ Groovy AOP เพื่ออธิบายตรรกเชิงธุรกรรมในเกรลส์'/><author><name>chanwit</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_7gu9HQYUUjE/SZylbu8k6jI/AAAAAAAAASU/8LrnKrv5Gcs/s1600-R/8521163ddd403e477d514798488c4b6a%3Fs%3D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25915256.post-2621418558898115166</id><published>2008-02-11T08:48:00.001+07:00</published><updated>2008-02-11T08:48:36.749+07:00</updated><title type='text'>ภาษา AOP ที่ใกล้ตัวเรามากที่สุด</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;เคยนั่งคิดเล่น ๆ กันมั้ยครับว่าภาษา AOP ที่เราใช้กันมากที่สุด คือภาษาอะไรและอยู่ในแอพพลิเคชั่นประเภทใด&lt;br/&gt;&lt;br/&gt;ภาษา AOP ที่เราใช้กันมากที่สุดก็คือ &lt;a href='http://en.wikipedia.org/wiki/Cascading_Style_Sheets'&gt;CSS&lt;/a&gt; ครับ และแน่นอนว่าอยู่ใน web browser นั่นเอง&lt;br/&gt;&lt;br/&gt;CSS จะประกอบไปด้วยสองส่วนคือ selectors และ declaration block ถ้ามองจากมุมมองของ AOP แล้วก็เหมือนกับว่า CSS จะอิมพลีเม้นต์ pointcut-advice model โดยที่มี selectors เป็น pointcut และ declaration block เป็น around advice นั่นแปลว่าใน CSS ไม่มี advice model แบบ before, after และอื่น ๆ ครับ&lt;br/&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25915256-2621418558898115166?l=aspect-chanwit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aspect-chanwit.blogspot.com/feeds/2621418558898115166/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=25915256&amp;postID=2621418558898115166' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25915256/posts/default/2621418558898115166'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25915256/posts/default/2621418558898115166'/><link rel='alternate' type='text/html' href='http://aspect-chanwit.blogspot.com/2008/02/aop.html' title='ภาษา AOP ที่ใกล้ตัวเรามากที่สุด'/><author><name>chanwit</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_7gu9HQYUUjE/SZylbu8k6jI/AAAAAAAAASU/8LrnKrv5Gcs/s1600-R/8521163ddd403e477d514798488c4b6a%3Fs%3D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25915256.post-1942633731347386628</id><published>2007-04-21T20:31:00.000+07:00</published><updated>2007-04-21T21:25:25.842+07:00</updated><title type='text'>ตัวอย่าง aspect อย่างง่าย</title><content type='html'>ในโพสต์นี้ผมแนะนำตัวอย่าง aspect ที่น่าจะเข้าใจได้ไม่ยากนักสำหรับการเริ่มต้นหัดเขียน AOP&lt;br /&gt;โจทย์คือ "สร้าง aspect สำหรับจับเวลาให้เมธอดในคลาส Target" ครับ&lt;br /&gt;&lt;br /&gt;1. ให้สร้่าง aspect เป็นชื่อ TimeMeasurement ตั้ง package เป็นอะไรก็ได้ เช่น net.ckblog.aspect.TimeMeasurement จะได้ไฟล์ชื่อ TimeMeasurement.aj ซึ่งจะคอมไพล์ได้ด้วยตัวคอมไพเลอร์ของ AspectJ&lt;br /&gt;2. ให้สร้างคลาส ชื่อ Target อาจจะเป็น net.ckblog.Target แล้วให้มี 2 เมธอด ชื่อ compute1000() กับ compute2000() แล้วลองเขียนโค้ดให้วนรอบใน 2 เมธอดนั้น 1000 รอบ และ 2000 รอบ ตามลำดับ&lt;br /&gt;จากนั้นให้เตรียมคลาส Main เพื่อสร้าง object ของ Target แล้วทำการเรียกใช้ทั้งสองเมธอดดังกล่างใน main()&lt;br /&gt;3. กลับมาที่ aspect TimeMeasurement ให้ประกาศ pointcut โดยเราจะใช้ pointcut designator (PCD) ชื่อ execution() ในการเลือก join point 2 จุด ณ ตำแหน่ง&lt;span style="font-weight:bold;"&gt;การทำงานของเมธอด&lt;/span&gt; ของ compute1000() และ compute2000()&lt;br /&gt;ซึ่งเหตุผลในการใช้ PCD มาจากวิธีคิดแบบนี้ครับ&lt;br /&gt;- การทำงานของเมธอด คือ execution of method (ต่างจากการเรียกใช้ คือ call)&lt;br /&gt;- นั่นคือความหมายของ PCD ชื่อ execution(...) (ถ้าเป็นการเรียกใช้ก็จะเป็น PCD ชื่อ call())&lt;br /&gt;และเป้าหมายของเราคือเมธอด compute1000() และ compute2000&lt;br /&gt;จะได้ pointcut ดังต่อไปนี้&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  execution(public Target.compute1000()) || &lt;br /&gt;  execution(public Target.compute2000())&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;ความหมายคือ เราสร้าง pointcut จาก PCD มากกว่า 1 ตัว และในกรณีนี้ เราใช้ PCD 2 ตัวทำการ or กัน&lt;br /&gt;ในการใช้งานจริง จะสามารถยุบรวมให้เป็น PCD เดียวโดยใช้ wildcard ซึ่งจะเป็นตามโค้ดต่อไปนี้ครับ&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  execution(public Target.compute*())&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;(หมายเหตุ: pointcut นี้จะเลือกทุก ๆเมธอดของคลาส Target ที่ชื่อเมธอด ขึ้นต้นด้วย compute นะครับ&lt;br /&gt;นั่นคือถ้าเีราเพิ่ม compute3000() เข้าไป method ใหม่ก็จะโดนเลือกด้วย ซึ่งจะทำให้ความหมายไม่ตรงเป๊ะ ๆ กับ code แรก&lt;br /&gt;แต่ผมต้องการแสดงให้เห็นว่าเราสามารถเลือกเชิงประมาณโดยใช้ wildcard ได้)&lt;br /&gt;&lt;br /&gt;4. ต่อมาเราก็จะประกาศ advice เพื่อให้ทำงาน ณ ตำแหน่ง join point ที่เราเลือกมาด้วย pointcut ในข้อ 3 ครับ&lt;br /&gt;ก่อนจะไปต่อ ผมเล่าให้ฟังนิดนึงว่า join point มีสมบัติสำคัญ ๆ คือ&lt;br /&gt;1) เราเข้ามาที่จุด join point ได้&lt;br /&gt;2) เมื่อมาถึงแล้ว เราทำงานที่จุด join point ได้&lt;br /&gt;3) และเมื่อมาถึงแล้ว เราออกจากจุด join point ได้&lt;br /&gt;&lt;br /&gt;ซึ่ง advice ก็คือคำแนะนำที่เราบอกกับโปรแกรมว่าควรจะทำอะไรที่จุด join point นี้&lt;br /&gt;&lt;br /&gt;ตาม aspect เราตั้งใจว่าจะ "จับเวลา" การทำงานของ 2 method&lt;br /&gt;นั้นคือเราะจะมีการจับเวลา "ก่อน" และ "หลัง" ในแต่ละ join point ที่เลือกไว้ด้วย pointcut ในข้อ 3 ครับ&lt;br /&gt;ตรงนี้เราจะใช้ before() เพื่อนิยามการแนะนำขณะเข้า join point&lt;br /&gt;และ after() เพื่อนิยามการแนะนำขณะออกจาก join point&lt;br /&gt;ดังนั้นเราก็จะได้&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;before(): &lt;ชื่อ pointcut&gt;() {&lt;br /&gt;  // จับเวลาใส่ตัวแปร&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;after(): &lt;ชื่อ pointcut&gt;() {&lt;br /&gt;  // จับเวลา แล้วเอาไปลบกับตัวแปรที่ตั้งค่าไว้ในโค้ดของ before&lt;br /&gt;  // แล้ว System.out.println(เวลา);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;แล้วก็สั่งรันโปรแกรม ก็เป็นอันเสร็จพิธีครับ&lt;br /&gt;&lt;br /&gt;ในตัวอย่างที่ผมยกมาให้ดูนี้ ผมใช้ join point model แบบ pointcut-advice เพื่่ออธิบาย aspect สำหรับ"จับเวลา" โดยสร้าง pointcut จากการใช้ PCD 2 ชุดมา or กัน เพื่อเลือก (quantify) join point 2 ตำแหน่งใน class Target แล้วก็สร้าง advice เพื่อแนะนำให้โปรแกรมทำการจับเวลา "ก่อน" และ "หลัง" จุดที่เลือกมาด้วย pointcut ผมตั้งใจละ code ไว้ให้ผู้อ่านลองนำไปเขียนเพิ่มเติมเองนะครับ&lt;br /&gt;&lt;br /&gt;สำหรับ join point อีก model ที่มีใน AspectJ คือ inter-type declaration หรือเรียกว่า introduction จะกล่าวถึงในโพสต์อื่น ๆ ครับ&lt;br /&gt;&lt;br /&gt;หมายเหตู ผมโพสต์ตอบแบบเดียวกันนี้ไว้ในกระดานข่าวของ narisa.com &lt;a href="http://www.narisa.com/forums/index.php?showtopic=17544"&gt;กระทู้นี้&lt;/a&gt;ครับ&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25915256-1942633731347386628?l=aspect-chanwit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aspect-chanwit.blogspot.com/feeds/1942633731347386628/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=25915256&amp;postID=1942633731347386628' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25915256/posts/default/1942633731347386628'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25915256/posts/default/1942633731347386628'/><link rel='alternate' type='text/html' href='http://aspect-chanwit.blogspot.com/2007/04/aspect.html' title='ตัวอย่าง aspect อย่างง่าย'/><author><name>chanwit</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_7gu9HQYUUjE/SZylbu8k6jI/AAAAAAAAASU/8LrnKrv5Gcs/s1600-R/8521163ddd403e477d514798488c4b6a%3Fs%3D80'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25915256.post-6409296107253623063</id><published>2007-04-21T20:02:00.000+07:00</published><updated>2007-04-21T20:03:30.610+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Groovy'/><category scheme='http://www.blogger.com/atom/ns#' term='Grails'/><title type='text'>เหตุผลที่ AOP แตกต่างจาก MOP</title><content type='html'>ผมกำลังสร้างระบบย่อยเชิงลักษณะ (AOP subsystem) สำหรับ Groovy โดยอิมพลีเม้นต์บน Meta Object Protocol (MOP - ระเบียบการเหนือวัตถุ?) ให้สนับสนุนสมบัติหลัก 2 ประการของแบบจำลอง pointcut-advice นั่นคือ การเลือกเชิงปริมาณ (Quantification) และ การไม่รับรู้ (Obliviousness)&lt;br /&gt;&lt;br /&gt;โดยปกติ การใช้เมต้าคลาสใน Groovy ก็สนับสนุนการไม่รับรู้ของวัตถุเป้าหมายได้อยู่แล้วเนื่องจากระเบียบการเหนือวัตถุจะใช้เมต้าคลาสของแต่ละวัตถุในการเรียกใช้เมธอดและเข้าถึงสมบัติของวัตถุนั้น ๆ &lt;br /&gt;สิ่งที่ขาดไปก็คือการเลือกเชิงปริมาณ ที่ใน AspectJ ใช้ wildcard เพื่อเลือกหลาย ๆ joinpoint จาก ประโยค pointcut เพียง 1 ประโยค&lt;br /&gt;รวมถึงจุดเล็ก ๆ น้อย ๆ ในการอิมพลีเม้นต์ที่ยอมให้พฤติกรรมซับซ้อนเช่น proceed หลายระดับใน advice แบบ around ทำได้ง่ายขึ้น&lt;br /&gt;และนี่คือจุดสำคัญที่ AOP แตกต่างจาก MOP และเป็นเหตุผลว่าทำไม AOP ถึงยังจำเป็นแม้จะมี MOP อยู่แล้วในภาษาพลวัตร&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25915256-6409296107253623063?l=aspect-chanwit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aspect-chanwit.blogspot.com/feeds/6409296107253623063/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=25915256&amp;postID=6409296107253623063' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25915256/posts/default/6409296107253623063'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25915256/posts/default/6409296107253623063'/><link rel='alternate' type='text/html' href='http://aspect-chanwit.blogspot.com/2007/04/aop-mop.html' title='เหตุผลที่ AOP แตกต่างจาก MOP'/><author><name>chanwit</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_7gu9HQYUUjE/SZylbu8k6jI/AAAAAAAAASU/8LrnKrv5Gcs/s1600-R/8521163ddd403e477d514798488c4b6a%3Fs%3D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25915256.post-7207332233791260565</id><published>2007-04-15T04:56:00.000+07:00</published><updated>2007-04-20T01:40:55.444+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Groovy'/><title type='text'>Groovy และเมต้าคลาสที่สนับสนุน AOP</title><content type='html'>ผม&lt;a href="http://chanwit.blogspot.com/2007/04/groovy-and-aop-metaclass.html"&gt;บล้อก&lt;/a&gt;เกี่ยวกับการอิมพลีเม้นต์เมต้าคลาสใน Groovy เพื่อสนับสนุนการโปรแกรมเชิงลักษณะตามโมเดลของ AspectJ โค้ดที่โพสต์ไว้ส่วนใหญ่มากจากบทความของ John McClean บน InfoQ ที่เพิ่งไปอ่านเจอมา ตกใจเล็กน้อยที่เค้าเขียนไว้นานแล้ว แต่ก็ดีใจที่เจอ เพราะผมยังห่างไกลเรื่องแนวคิดทาง Meta Object Protocol (MOP) อยู่มาก เห็นการเอาทั้ง 2 แนวคิด (คือ AOP และ MOP) มารวมกันทำให้ผมเข้าใจมันมากขึ้นและทำให้งานวิจัยค่อนข้างก้าวกระโดดทีเดียว&lt;br /&gt;&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;จากบทความที่ว่า ผมเห็นชัดเจนมากขึ้นว่าทำไมคนในโลกภาษาพลวัตรทั้งหลายเฉย ๆ กับ AOP เพราะ advice พื้นฐานของ AOP จำพวก before, after, around กลายเป็นของง่าย ๆ ด้วยเมต้าคลาส แต่จุดหนึ่งที่น่าสนใจคือ สมบัติของ AOP ในการเลือกเชิงปริมาณ (Quantification) นั้นยังทำได้ยากในแบบ crosscutting แต่ง่่ายในแบบ hierarchy ด้วยเมต้าคลาส แต่ยังไงก็ง่ายกว่าภาษาเชิงวัตถุแบบสถิตย์อย่าง Java (เมื่อไม่ใช้อะไรที่เกี่ยวข้องกับ AOP เลย) อยู่ดี&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25915256-7207332233791260565?l=aspect-chanwit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aspect-chanwit.blogspot.com/feeds/7207332233791260565/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=25915256&amp;postID=7207332233791260565' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25915256/posts/default/7207332233791260565'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25915256/posts/default/7207332233791260565'/><link rel='alternate' type='text/html' href='http://aspect-chanwit.blogspot.com/2007/04/groovy-aop.html' title='Groovy และเมต้าคลาสที่สนับสนุน AOP'/><author><name>chanwit</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_7gu9HQYUUjE/SZylbu8k6jI/AAAAAAAAASU/8LrnKrv5Gcs/s1600-R/8521163ddd403e477d514798488c4b6a%3Fs%3D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25915256.post-985478864578847940</id><published>2007-04-12T00:28:00.001+07:00</published><updated>2007-04-13T00:15:11.459+07:00</updated><title type='text'>การโปรแกรมเขิงลักษณะในอีก 10 ปี</title><content type='html'>Panelists จากการประชุมวิชาการ AOSD 07 พูดเสนอมุมมองที่น่าสนใจหลาย ๆ อย่างเกี่ยวกับ AOP ในอีก 10 ปีข้างหน้าว่าจะมีรูปแบบอย่างไร ผมเลยสรุปและรวมเข้ากันกับแนวคิดที่เสนอโดย Keynote Speakers 2 คนจาก AOSD 07 เช่นกันครับ งานวิจัยของผมมีหลาย ๆ ส่วนที่เป็นไปในแนวทางที่ทั้ง Panelists และ Keynote เสนอมา ผมเลยจะแทรกความเห็นของผมลงไปด้วยนะครับ&lt;br /&gt;&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;Crosscutting Concerns ไม่จำเป็นต้องตัดขวางเฉพาะการไหลของโปรแกรม - ประเด็นนี้ค่อนข้างตรงใจผมครับ เนื่องจากงานวิจัยใกล้เคียงกับที่ผมทำอยู่ ก็สามารถอธิบายได้ด้วย AOP และมันก็ไม่ใช่การไหลของโปรแกรมเสียทีเดียว ซึ่งจุดนี้ยืนยันแนวคิดการใช้งาน AOP ในโลกของ High-Performance Computing ได้ค่อนข้างดีครับ&lt;br /&gt;&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;การทำให้ภาษาเชิงลักษณะเข้าใจได้ง่ายขึ้น โดยการปรับปรุงส่วนของภาษาที่ใช้อธิบาย pointcut เป็นเรื่องใหญ่เรื่องหนึ่งที่เป็นปัญหาปลายเปิดให้ค้นคว้ากันครับ - ผมเห็นด้วยกับความคิดดังกล่าว เพราะทีมอื่น ๆ ในแล็บบอกให้ผมฟังว่าภาษาทาง AOP มันดูซับซ้อนและเข้าใจยาก อันนี้จริงครับ เพราะมันทรงพลังมาก และก็ค่อนข้างท้าทายที่เราจะทำให้ภาษาง่ายขึ้นและยังทรงพลังอยู่&lt;br /&gt;&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;จุดใหญ่จุดหนึ่งที่น่าสนใจเกี่ยวกับการโปรแกรมเชิงลักษณะในอีก 10 ปีถัดไปคือการพัฒนาและกระตุ้นการใช้งาน aspect ในระดับ domain ซึ่งเป็นเรื่องค่อนข้างที่จะท้าทายพอสมควรอีกเช่นกันครับ ประเด็นนี้เกี่ยวข้องกับประเด็นข้างบน นั้นคือ ผมมองว่าเราต้องมีภาษาที่ง่ายพอที่จะทำให้คนกลุ่มใหญ่ใช้ AOP ก่อน แล้วการนำ AOP ไปใช้ในระดับ domain ก็จะตามมามากขั้นครับ&lt;br /&gt;&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;จุดหลัก ๆ อีกประเด็นที่ผมจับได้ก็คือ ความพยายามในการสนับสนุน AOP สำหรับภาษาพลวัตร แนวคิดนี้ค่อนข้างทำได้ยาก เนื่องจากธรรมชาติของภาษาพลวัตร เช่น Ruby หรือ Groovy นั้นไม่ได้ต้องการ AOP อย่างชัดเจน เพราะกลไกของ Metaclass สามารถสนับสนุนการเปลี่ยนแปลงพฤติกรรมขณะเวลารันได้อยู่แล้ว จึงเป็นหัวข้อที่ท้าทายมาเรื่องหนึ่งครับ&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25915256-985478864578847940?l=aspect-chanwit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aspect-chanwit.blogspot.com/feeds/985478864578847940/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=25915256&amp;postID=985478864578847940' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25915256/posts/default/985478864578847940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25915256/posts/default/985478864578847940'/><link rel='alternate' type='text/html' href='http://aspect-chanwit.blogspot.com/2007/04/10.html' title='การโปรแกรมเขิงลักษณะในอีก 10 ปี'/><author><name>chanwit</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_7gu9HQYUUjE/SZylbu8k6jI/AAAAAAAAASU/8LrnKrv5Gcs/s1600-R/8521163ddd403e477d514798488c4b6a%3Fs%3D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25915256.post-114630925324035711</id><published>2006-04-29T18:03:00.001+07:00</published><updated>2006-10-27T02:45:48.371+07:00</updated><title type='text'>กลไกการสาน code ที่มีผลจากการใช้ IF pointcut</title><content type='html'>เราสามารถประกาศ pointcut แบบมีเงื่อนไขด้วย if(...) pointcut ใน Aspect J แต่ผลการทำงานของ pointcut ตัวนี้จะเป็นการทำงานขณะ runtime คือเงื่อนไขที่ระบุใน if(...) จะถูก bypass ขณะที่ weaver สาน code และจะนำเงื่อนไขดังกล่าวไปฝังไว้ใน advice เพื่อประมวลผลอีกทีโดยใช้ reflection ตอนโปรแกรมรันแล้ว&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;ผมคิดว่าเหตุผลก็คือ ผู้พัฒนา AspectJ ไม่มีทางรู้ล่วงหน้าว่าผู้ใช้ AspectJ จะประกาศเงื่อนไขพลิกแพลงขนาดไหน จึงใช้วิธีสร้าง if pointcut ที่ครอบคลุมการใช้งานได้ทุก ๆ กรณี &lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;ในขณะที่บางงานที่ต้องการ code optimisation (อย่างเช่นงานที่ผมกำลังทำอยู่) ต้องการ code ที่ค่อนข้างรัดกุมและอยากจะเลี่ยงการประมวลผลด้วย reflection ให้ได้มากที่สุด ตัว if pointcut จึงกลายเป็นตัวปัญหา&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25915256-114630925324035711?l=aspect-chanwit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aspect-chanwit.blogspot.com/feeds/114630925324035711/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=25915256&amp;postID=114630925324035711' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25915256/posts/default/114630925324035711'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25915256/posts/default/114630925324035711'/><link rel='alternate' type='text/html' href='http://aspect-chanwit.blogspot.com/2006/04/code-if-pointcut_29.html' title='กลไกการสาน code ที่มีผลจากการใช้ IF pointcut'/><author><name>chanwit</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_7gu9HQYUUjE/SZylbu8k6jI/AAAAAAAAASU/8LrnKrv5Gcs/s1600-R/8521163ddd403e477d514798488c4b6a%3Fs%3D80'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25915256.post-114481215740319204</id><published>2006-04-12T10:19:00.000+07:00</published><updated>2006-10-27T02:45:48.009+07:00</updated><title type='text'>AOP ในอุตสาหกรรม Java</title><content type='html'>&lt;a href="http://eclipse.org/aspectj"&gt;AspectJ&lt;/a&gt; เป็นภาษาและคอมไพเลอร์ตัวแรกที่สนับสนุนแนวคิดของ AOP โดยขยายจากภาษา Java ปัจจุบัน AspectJ เป็น Technology Project อยู่ภายใต้ Eclipse.org ซึ่งมี &lt;a href="#"&gt;AJDT&lt;/a&gt; ที่เป็น Eclipse plugin สำหรับสนับสนุนการใช้งานใน Eclipse &lt;br/&gt;&lt;br /&gt;&lt;br /&gt;AJDT สนับสนุนการทำงานกับ AspectJ ใน Eclipse ได้เป็นอย่างดี ความสามาถใน AJDT มีดังต่อไปนี้&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;  &lt;li&gt;Syntax Hi-li&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Weaving Info&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Generation of AOP.XML&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25915256-114481215740319204?l=aspect-chanwit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aspect-chanwit.blogspot.com/feeds/114481215740319204/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=25915256&amp;postID=114481215740319204' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25915256/posts/default/114481215740319204'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25915256/posts/default/114481215740319204'/><link rel='alternate' type='text/html' href='http://aspect-chanwit.blogspot.com/2006/04/aop-java.html' title='AOP ในอุตสาหกรรม Java'/><author><name>chanwit</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_7gu9HQYUUjE/SZylbu8k6jI/AAAAAAAAASU/8LrnKrv5Gcs/s1600-R/8521163ddd403e477d514798488c4b6a%3Fs%3D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25915256.post-114481196182338258</id><published>2006-04-12T10:16:00.000+07:00</published><updated>2006-10-27T02:45:47.953+07:00</updated><title type='text'>จุดเริ่มต้นของ aspect</title><content type='html'>AOP เป็นประเด็นขึ้นมาทันทีหลังจาก Kiczales และกลุ่มของเขาได้ตีพิมพ์บทความชื่อ Aspect-oriented programming ที่การประชุมทางวิชาการ ECOOP ในปี 1997 เอกสารชิ้นนี้จึงเป็นเอกสารที่เกี่ยวข้องกับการเปิดตัว AOP อย่างเป็นทางการชิ้นแรก&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25915256-114481196182338258?l=aspect-chanwit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aspect-chanwit.blogspot.com/feeds/114481196182338258/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=25915256&amp;postID=114481196182338258' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25915256/posts/default/114481196182338258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25915256/posts/default/114481196182338258'/><link rel='alternate' type='text/html' href='http://aspect-chanwit.blogspot.com/2006/04/aspect.html' title='จุดเริ่มต้นของ aspect'/><author><name>chanwit</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_7gu9HQYUUjE/SZylbu8k6jI/AAAAAAAAASU/8LrnKrv5Gcs/s1600-R/8521163ddd403e477d514798488c4b6a%3Fs%3D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25915256.post-114480928760755708</id><published>2006-04-12T09:33:00.000+07:00</published><updated>2006-10-27T02:45:47.891+07:00</updated><title type='text'>AOP: การโปรแกรมเชิงลักษณะ</title><content type='html'>ผู้พัฒนาซอฟต์แวร์ในประเทศเริ่มมีความรู้ความเข้าใจเกี่ยวกับ AOP หรือการโปรแกรมเชิงลักษณะมากขึ้น ผมคิดว่าน่าจะมี blog เสริมอีกซักตัวไว้เฉพาะสำหรับ AOP ที่เป็นภาษาไทย จึงเปิดตัวนี้เพิ่มครับ และจะทยอยนำเนื้อหาที่เกี่ยวข้องกับ AOP ทั้งย้อนหลังและที่กำลังจะออกมาใหม่มา blog ไว้ครับ&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;AOP คืออะไร&lt;/span&gt;&lt;br /&gt;Aspect-oriented programming หรือ AOP หรือที่ผมเรียกเป็นภาษาไทยว่า &lt;span style="font-weight:bold;"&gt;การโปรแกรมเชิงลักษณะ&lt;/span&gt; นั้นเป็นแนวคิดที่สร้างขึ้นบนการโปรแกรมเชิงวัตถุหรือ OOP โดยมีจุดประสงค์หลักเพื่อแก้ปัญหาที่ยากหรือแก้ไม่ได้ด้วย OOP ในแง่ของ Separation of Concerns ซึ่ง concern ที่ว่าก็คือ croscutting concerns ที่ ตัดขวาง การไหลของโปรแกรม (flow of program) แนวคิดของ AOP คือการดึง code ทั้งหลายที่กระจายตัวในลักษณะ crosscut มารวบไว้ด้วยกันเป็นหน่วย เรียกว่า &lt;span style="font-weight:bold;"&gt;aspect&lt;/span&gt; โดยภายใน aspect จะประกอบไปด้วย pointcut ซึ่งเป็น&lt;span style="font-weight:bold;"&gt;ประโยคอธิบาย&lt;/span&gt;จุดนามธรรมที่เรียกว่า joinpoint abstraction สำหรับ joinpoint ก็คือ well-defined point ในการไหลของโปรแกรมอย่างเช่น constructor, method เป็นต้นครับ ในการประกาศ pointcut จะมีการโยง advice เข้ากันกับ pointcut นั้น ๆ เพื่อระบุว่า code ที่ต้องการจะสาน (weave) จะอยู่ในตำแหน่งใดของ joinpoint เช่น before, around, after เป็นต้น &lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;ในปัจจุบันมีการใช้ AOP กันกว้างขวางขึ้นโดยเฉพาะในแวดวงของภาษา Java&lt;br/&gt;&lt;br /&gt;เฟรมเวิร์คหลายชุดเช่น Spring, Hibernate, JBoss AOP หรือแม้แต่ EJB 3 ก็มีแนวคิดและความสามารถในลักษณะของ AOP แทบทั้งสิ้น&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25915256-114480928760755708?l=aspect-chanwit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aspect-chanwit.blogspot.com/feeds/114480928760755708/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=25915256&amp;postID=114480928760755708' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25915256/posts/default/114480928760755708'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25915256/posts/default/114480928760755708'/><link rel='alternate' type='text/html' href='http://aspect-chanwit.blogspot.com/2006/04/aop.html' title='AOP: การโปรแกรมเชิงลักษณะ'/><author><name>chanwit</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_7gu9HQYUUjE/SZylbu8k6jI/AAAAAAAAASU/8LrnKrv5Gcs/s1600-R/8521163ddd403e477d514798488c4b6a%3Fs%3D80'/></author><thr:total>1</thr:total></entry></feed>
