decoupling คนที่กล้าหาญ DRY เป็น REST หรือไม่?


19

ฉันกำลังสร้าง REST API เพื่อแสดงการทำงานส่วนใหญ่ของ Java API ที่มีอยู่ API ทั้งสองมีไว้สำหรับใช้ภายในองค์กรของฉัน ฉันไม่ต้องออกแบบเพื่อใช้ภายนอก ฉันมีอิทธิพลเหนือ API ทั้งคู่ แต่กำลังใช้งาน REST อยู่ Java API จะยังคงใช้งานต่อไปสำหรับแอปพลิเคชันในพื้นที่ (ไม่ใช่ "เลิกใช้") แต่ REST API จะใช้สำหรับการพัฒนาใหม่ที่สำคัญ

บางคลาส Java API เป็นเพียงข้อมูล (beans ที่มีคุณสมบัติ, getters, setters) และอย่างน้อยสิ่งเหล่านี้ก็เหมาะสมที่จะส่งผ่าน (ในบางรูปแบบ) ผ่าน REST API เป็นข้อมูล (ซึ่งจะถูกจัดให้อยู่ในรูปแบบ XML หรือ JSON) ตัวอย่างเช่นคลาสที่เก็บข้อมูลเกี่ยวกับเครื่องเซิร์ฟเวอร์ ฉันกำลังเผชิญกับตัวเลือกต่อไปนี้สำหรับคลาสข้อมูลเหล่านี้: ฉัน ...

  1. เปิดเผยคลาส Java ดั้งเดิม (หรือคลาสย่อย) โดยตรงใน REST API หรือ
  2. สร้างคลาสการถ่ายโอนข้อมูลใหม่ (รูปแบบ DTO) โดยเฉพาะสำหรับ REST API หรือไม่

ทั้งสองวิธีฉันจะมีคลาสการถ่ายโอนข้อมูล REST; คำถามคือจะใส่คำอธิบายประกอบต้นฉบับหรือสร้างใหม่ (ซึ่งอาจใกล้สำเนาต้นฉบับ) อาจมีตัวเลือกอื่น ๆ แต่ฉันจะเน้นไปที่สองคนนั้นเป็นหลัก

อาร์กิวเมนต์สำหรับ # 1:

  • แห้ง (ไม่ต้องทำซ้ำตัวเอง)
  • เร็วกว่าที่จะใช้
  • ง่ายต่อการอัพเกรด REST API

อาร์กิวเมนต์สำหรับ # 2:

  • จะเกิดอะไรขึ้นถ้า REST API จำเป็นต้องแยกรุ่นจาก Java API (อาจเป็นไปได้)
  • เกิดอะไรขึ้นถ้ามีการเปลี่ยนแปลงที่สำคัญในคลาสข้อมูล Java เช่นการลบคุณสมบัติการเพิ่มพฤติกรรมหรือการเปลี่ยนแปลงลำดับชั้นของคลาส? (นี่อาจเป็นไปได้เช่นกัน)

บรรทัดล่างคือดูเหมือนว่าการแลกเปลี่ยนระหว่าง DRY (# 1) และ decoupling (# 2)

ฉันเอนตัวไปสู่การเริ่มต้นด้วย # 1 แล้วหากเกิดปัญหาขึ้นมาที่ # 2 ในภายหลังให้ทำตามแนวทางที่คล่องแคล่วของการไม่สร้างสิ่งที่คุณไม่สามารถพิสูจน์ได้ว่าคุณต้องการ นี่เป็นความคิดที่ไม่ดี ฉันควรเริ่มต้นด้วย # 2 หรือไม่ถ้าฉันคิดว่าฉันจะลงเอยด้วย

มีข้อโต้แย้ง / ผลที่สำคัญหายไปจากรายการของฉันหรือไม่?


ถ้าผมจำไม่ PragProg สิ่งที่แห้งจริงๆที่จะทำจะมีแหล่งเดียวจากการที่ทั้งสองชั้น Java และ DTO จะถูกสร้างขึ้น
AakashM

"จะเกิดอะไรขึ้นถ้า" = YAGNI IMO
Jonathan Cast

คำตอบ:


10

คำถามที่ดีเพียงแค่วางแยก นั่นคือวิธีที่จะไปที่นี่คุณไม่ต้องการที่จะเชื่อมโยงกับเวอร์ชันของจาวา

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

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

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

โดยส่วนตัวแล้วฉันจะแยกออกตอนนี้

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


7

ข้อโต้แย้งหลักสำหรับ # 1 นั้นง่ายต่อการนำไปใช้และการอัพเกรด แต่มันตอบสนองความต้องการของคุณหรือไม่?

ในข้อโต้แย้งของคุณสำหรับ # 2 คุณระบุว่า Java API และ REST API อาจมีการเปลี่ยนแปลงอย่างอิสระ ซึ่งหมายความว่าพวกเขามีความกังวลแยกต่างหากและคุณไม่ได้ทำซ้ำตัวเองโดยใช้ชั้นเรียนแยกต่างหาก เพียงเพราะสองสิ่งที่มีลักษณะเดียวกันไม่ได้หมายความว่าพวกเขามีเหมือนกัน


6

REST API ของคุณไม่จำเป็นต้องทำตามโครงสร้างเดียวกับตัวแบบข้อมูลของคุณ

เมื่อใช้งาน REST ตรวจสอบให้แน่ใจว่าคุณกำลังสร้าง API ภายนอกที่ใช้งานง่ายจากนั้นจับคู่สิ่งนี้กับคลาสโมเดลข้อมูลภายในของคุณ นี้ช่วยให้คุณเปลี่ยนไปในแต่ละอิสระจากชั้นนำอื่น ๆ เพื่อAPIs ที่สามารถมีอายุการใช้มานานหลายทศวรรษ

ดังนั้นการแยกเป็นวิธีที่จะไปที่นี่

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