ปัญหาบางอย่างได้รับการแก้ไขอย่างสวยงามยิ่งขึ้นด้วย AOP หรือไม่?


19

ฉันได้พบกับแนวคิดของการเขียนโปรแกรม Aspect Oriented และฉันมีข้อกังวลบางอย่างกับมัน

แนวคิดพื้นฐานน่าจะเป็นที่เราต้องการที่จะกังวลข้ามตัดซึ่งไม่ได้เป็นโมดูลที่ดีในการใช้วัตถุและทำให้เป็นโมดูล นั่นคือทั้งหมดที่ดีและดี

แต่การใช้ AOP ดูเหมือนว่าเป็นการปรับเปลี่ยนรหัสจากภายนอกโมดูล ตัวอย่างเช่นสามารถเขียนมุมมองที่เปลี่ยนแปลงสิ่งที่เกิดขึ้นเมื่อวัตถุเฉพาะถูกส่งผ่านเป็นพารามิเตอร์ในฟังก์ชั่น ดูเหมือนว่าจะขัดกับแนวคิดของโมดูลโดยตรง ฉันไม่ควรแก้ไขพฤติกรรมของโมดูลจากด้านนอกของโมดูลนั้นมิฉะนั้นจุดทั้งหมดของโมดูลจะถูกยกเลิก แต่ดูเหมือนว่าจะทำอย่างนั้น!

โดยทั่วไปลักษณะต่าง ๆ เป็นรูปแบบของการแก้ไขโค้ด มันอาจมีประโยชน์สำหรับแฮ็กเร็ว ๆ แต่ตามหลักการทั่วไปอาจไม่ใช่สิ่งที่คุณต้องการทำ Aspect Oriented Programming ดูเหมือนว่าฉันจะฝึกฝนและพัฒนาหลักการออกแบบทั่วไปไม่ดี

AOP เป็นแนวปฏิบัติที่ดีหรือไม่? ปัญหาการเขียนโปรแกรมบางอย่างได้รับการแก้ไขอย่างสวยงามยิ่งขึ้นด้วย AOP หรือไม่?


ahhh แพทช์ลิงที่มีชื่อเสียง!
Muad'Dib

1
ฉันได้แก้ไขคำถามเพื่อปรับปรุงโทนเสียงและโหวตให้เปิดใหม่อีกครั้ง
Robert Harvey

Questio ยังถูกถามอีกครั้งในรูปแบบที่แตกต่างกันที่นี่: programmers.stackexchange.com/questions/19344/ …
Peter Boughton

คำตอบ:


19

การเขียนโปรแกรมแบบ Aspect-Oriented ทำให้การเขียนโปรแกรมบางประเภทที่ทำได้ยากโดยไม่จำเป็นต้องมีการกระเจิงของรหัสในแอพพลิเคชั่นหรือไลบรารี่ที่ไม่เกี่ยวข้องกับฟังก์ชั่นหลักของซอฟต์แวร์ของคุณ ตัวอย่างรวมถึง:

  1. การบันทึกและตรวจสอบ
  2. การวิเคราะห์ประสิทธิภาพ
  3. การดีบักและติดตาม
  4. เลิกทำการทำงาน
  5. การตรวจสอบอินพุตและเอาต์พุต
  6. Morphing พฤติกรรมของวัตถุที่มีอยู่
  7. ตัวกรองวัตถุ
  8. การใช้งานด้านความปลอดภัย
  9. การจัดการธุรกรรม

โดยการจำกัดความกังวลเกี่ยวกับการตัดขวางให้เป็นส่วนเดียวของแอปพลิเคชันจากนั้นอ้างอิงคุณสมบัติเหล่านี้ในรหัสผ่านคุณลักษณะการสกัดกั้นการเรียกใช้เมธอดหรือพร็อกซีแบบไดนามิกคุณอนุญาตให้มีการห่อหุ้มพฤติกรรมการตัดขวาง สิ่งนี้มีประโยชน์ทั้งหมด (เช่นจุดเปลี่ยนเดียว) การห่อหุ้มจะให้ทุกที่อื่นในใบสมัครของคุณ

จุดสำคัญที่นี่คือ AOP ห่อหุ้มพฤติกรรมที่เป็น 1) ทั่วทั้งแอปพลิเคชันและ 2) อุปกรณ์ต่อพ่วงกับฟังก์ชั่นหลักของแอปพลิเคชัน


7

มาถึงช่วงท้ายเกม แต่ฉันให้สิ่งนี้กับนักพัฒนาในภายหลังที่อาจสะดุดกับคำถามนี้

ฉันขอแนะนำอย่างยิ่งให้ต่อต้าน AOP หากใบสมัครของคุณขึ้นอยู่กับการทำงานอย่างถูกต้อง ด้านการทำงานเช่นนี้:

  • คำแนะนำ (พฤติกรรมเพิ่มเติม) ถูกนำไปใช้
  • เข้าร่วมคะแนน (สถานที่ที่สามารถแนบรหัสพิเศษเช่นวิธีการเริ่มต้นหรือสิ้นสุดหรือเมื่อมีการเรียกเหตุการณ์)
  • ... โดยที่pointcut (รูปแบบที่ตรวจจับว่ารูปแบบจุดเชื่อมต่อที่กำหนด) ตรงกันหรือไม่

สำหรับใครก็ตามที่ใช้คอมพิวเตอร์เป็นเวลานานความจริงที่ว่ารูปแบบการใช้อาจเป็นสิ่งที่ต้องพิจารณาอย่างใกล้ชิด ดังนั้นนี่คือตัวอย่างของ Pointcut ที่ตรงกับวิธีการตั้งชื่อsetโดยไม่คำนึงถึงข้อโต้แย้ง:

call(* set(..))

นั่นเป็นจุดตัดที่ค่อนข้างเป็นธรรมและควรชัดเจนว่าควรจัดการกับเรื่องนี้ด้วยความระมัดระวัง (ไม่ต้องใช้ปุน) เพราะคุณกำลังใช้คำแนะนำกับสิ่งต่าง ๆ

หรือขอให้คำแนะนำกับทุกสิ่งโดยไม่คำนึงถึงชื่อหรือลายเซ็น!

execution(* *(..))

เห็นได้ชัดว่าเราควรระวังเพราะมีพลังมากมายที่นี่ แต่นี่ไม่ใช่การโต้แย้งในแง่มุม - มันเป็นข้อโต้แย้งที่ควรระวังเพราะมีพลังมากมายที่นี่และการจับคู่รูปแบบสามารถไปได้อย่างง่ายดาย (แค่กดเครื่องมือค้นหาที่คุณชื่นชอบ ข้อผิดพลาด aop และสนุก)

ดังนั้นนี่คือสิ่งที่ดูเหมือนว่าจุดตัดที่ค่อนข้างปลอดภัย:

pointcut setter(): target(Point) &&
                   ( call(void setX(int)) ||
                     call(void setY(int)) );

ซึ่งจะให้คำแนะนำอย่างชัดเจนหากพบวิธีการตั้งชื่อsetXหรือsetYบนPointวัตถุ วิธีการนั้นสามารถรับได้intและจะต้องเป็นvoidเท่านั้น ดูปลอดภัยทีเดียวใช่มั้ย ดีว่าปลอดภัยหากวิธีการเหล่านั้นมีอยู่และคุณได้ใช้คำแนะนำที่ถูกต้อง ถ้าไม่เลวเกินไป มันล้มเหลวอย่างเงียบ ๆ

เพื่อให้เป็นตัวอย่างเพื่อนกำลังพยายามแก้ไขข้อบกพร่องของแอปพลิเคชัน Java ที่ทุกคนอยู่ในช่วงเวลาที่ดีมันจะส่งคืนข้อมูลที่ไม่ถูกต้อง มันเป็นความล้มเหลวไม่บ่อยนักและไม่ปรากฏว่ามีความสัมพันธ์กับเหตุการณ์หรือข้อมูลใดโดยเฉพาะ มันเป็นจุดบกพร่องของเกลียวสิ่งที่ยากต่อการทดสอบหรือตรวจจับ เมื่อปรากฎว่าพวกเขากำลังใช้วิธีต่าง ๆ เพื่อล็อควิธีการและทำให้พวกเขา "ปลอดภัยเธรด" แต่โปรแกรมเมอร์เปลี่ยนชื่อวิธีการและ pointcut ไม่ตรงกับมันจึงก่อให้เกิดความแตกแยกเงียบของแอพลิเคชัน

ดังนั้นฉันจึงบอกคนอื่นว่าถ้าพวกเขาต้องใช้ AOP เพื่อรักษาลักษณะเช่นข้อยกเว้น: ในระบบที่ออกแบบมาอย่างดีและหากไม่มีอะไรผิดพลาดพวกเขาสามารถลบออกได้และซอฟต์แวร์ยังคงทำงานได้อย่างถูกต้อง อย่างไรก็ตามหากฟังก์ชันการทำงานของโปรแกรมขึ้นอยู่กับ AOP คุณจะสามารถแนะนำโปรแกรมที่ไม่มีการรับประกันได้

ดังนั้นการบันทึกการดีบักและการติดตามจึงเป็นตัวอย่างที่ดีของพฤติกรรมที่สมบูรณ์แบบสำหรับแง่มุม แต่ความปลอดภัย? Nope ปลอดภัยไหม? Nope

สำหรับทางเลือกที่มีประสิทธิภาพเพื่อ AOP ดูลักษณะ แทนที่จะรวมเข้ากับภาษาพวกเขาจะถูกรวมเข้ากับมันโดยตรงไม่จำเป็นต้องมี IDE "ลักษณะนิสัย" (แม้ว่าจะสามารถช่วยได้) และมีความล้มเหลวในการรวบรวมเวลาหากวิธีการที่คุณต้องการไม่มีอยู่ ลักษณะการทำงานมีความสะอาดกว่ามากในการจัดการกับการแยกความกังวลเนื่องจากปัญหานั้นถูกกำหนดไว้ตั้งแต่ต้น ฉันใช้มันอย่างกว้างขวางและพวกเขาก็ยอดเยี่ยม


แทนที่จะเถียงว่า AOP ไม่ควรใช้สำหรับฟังก์ชั่นหลักมันอาจจะเหมาะสมกว่าถ้าจะบอกว่าปุ่มลัดที่ใช้ชื่อเมธอดเป็นความคิดที่ไม่ดี ฉันอาจยืนยันว่าการล็อกและการซิงโครไนซ์ไม่ใช่กรณีการใช้งานที่ดีสำหรับ AOP
รหัส Bling

2

สถานการณ์หนึ่งที่ AOP อาจเป็นทางออกที่ดีและมีประโยชน์เพียงอย่างเดียวคือเมื่อคุณไม่สามารถเข้าถึงซอร์สโค้ดได้ หากต้องการใช้ตัวอย่างเก่า ๆ ที่ล้าของ Logging cross-cut

สมมติว่าคุณต้องการบันทึกการไหลของการควบคุมในห้องสมุดบุคคลที่สามที่คุณใช้ คุณมีรหัสของตัวเองอย่างสมบูรณ์พร้อมกับคำสั่งการบันทึก อย่างไรก็ตามสำหรับห้องสมุดนี้คุณไม่มีแหล่งที่มาทำให้ไม่สามารถเพิ่มคำสั่งการบันทึกของคุณได้ เนื่องจากคุณทำมี bytecode ที่ AOP ช่วยให้คุณสามารถเครื่องดนตรีที่อยู่แล้วห้องสมุดของบุคคลที่สาม

และถ้าคุณกำลังสร้างแง่มุมการบันทึกอยู่ดีคุณอาจลองใช้การบันทึกด้วย AOP troughout โค้ดของคุณเองเช่นกัน


การบันทึกเป็นสิ่งที่ "น่าสนใจ" คุณจะทำสิ่งอื่นนอกเหนือจาก "การป้อนด้วยพารามิเตอร์เหล่านี้" และ "ออก" ด้วยการบันทึก AOP ได้อย่างไร

@Thorbjorn: การบันทึก / ตรวจแก้จุดบกพร่อง / ติดตามเป็นเพียงหนึ่งในหลาย ๆ ด้านของการทำงาน AOP ที่สามารถช่วยได้ ฉันใช้มันเป็นตัวอย่างเพื่ออธิบายประเด็นของฉัน ประเด็นที่ฉันพยายามทำคือ AOP ช่วยให้คุณสามารถควบคุมรหัสบุคคลที่สามได้มากขึ้น
โจเซฟ Tanenbaum

แน่นอน แต่ฉันอยากรู้ว่าการบันทึก AOP สามารถทำได้มากกว่าแค่การบันทึกการเข้าสู่ระบบหรือไม่

ขึ้นอยู่กับเครื่องมือ AOP ที่คุณใช้ แต่มีข้อ จำกัด อย่างแน่นอนว่าคุณสามารถทำอะไรได้บ้าง อาจเป็นไปไม่ได้ที่จะไปไกลกว่าการบันทึกการเข้า - ออก
โจเซฟ Tanenbaum
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.