ความแตกต่างระหว่างระดับบริการและระดับผู้ช่วย [ปิด]


61

ฉันต้องการที่จะรู้ว่าสิ่งที่แตกต่างชั้นบริการจากระดับยูทิลิตี้หรือชั้นผู้ช่วย? ชั้นเรียนที่มีวิธีการพื้นฐานเรียก dao เป็นบริการหรือไม่ การใช้คลาส Helper ไม่เป็นการละเมิด SRP หรือไม่

คำตอบ:


73

เส้นอาจเบลอเล็กน้อย แต่ฉันเห็นด้วยวิธีนี้:

  • คลาสบริการ / อินเทอร์เฟซเป็นวิธีที่ลูกค้าจะโต้ตอบกับฟังก์ชันการทำงานบางอย่างในแอปพลิเคชัน โดยทั่วไปจะเป็นสาธารณะพร้อมความหมายทางธุรกิจบางอย่าง ยกตัวอย่างเช่นTicketingServiceอินเตอร์เฟซที่อาจจะช่วยให้คุณbuyTicket, sellTicketและอื่น ๆ

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

บริการไม่ได้เชื่อมโยงกับ DAO อย่างแน่นหนา แต่เป็นรูปแบบการใช้งาน / คำศัพท์ที่กว้างกว่าการคงอยู่

คลาสตัวช่วยจะไม่ละเมิด SRP หากโค้ดตามหลักการนั้น นั่นคือแต่ละวิธีควรทำสิ่งหนึ่งและสิ่งหนึ่งที่ดีชั้นควรดำเนินการช่วยเหลือยูทิลิตี้ประเภทหนึ่ง (เช่นการแปลงวันที่) และทำได้ดี


24

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


15

สำหรับฉันฉันไปตามคำนิยามของ Eric Evansserviceซึ่งเป็นดังนี้:

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

กล่าวคือ

  • บัญชีโรงงานบัญชีที่เก็บบัญชี ฯลฯ
  • ลูกค้าโรงงานลูกค้าคลังลูกค้า ฯลฯ

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

ดังนั้นนี่คือที่serviceมาของมันคือที่ที่คุณใส่รหัสที่อยู่ในรูปแบบโดเมน แต่ไม่ได้เป็นของเอนทิตี / ส่วนประกอบหนึ่งหรืออีกอันหนึ่ง

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


1
คำนิยามของ Eric Evan ที่กล่าวถึงข้างต้นนั้นใช้สำหรับบริการโดเมนโดยเฉพาะ DDD มีบริการโดเมน, บริการแอปพลิเคชัน, บริการโครงสร้างพื้นฐานและแม้กระทั่งที่เก็บซึ่งจะถูกมองว่าเป็นบริการการเข้าถึงข้อมูล
Songo

12

ระดับบริการ:มีตรรกะทางธุรกิจ
Helper Class: คลาสนี้เป็นส่วนประกอบที่นำมาใช้ใหม่ได้หนึ่งประเภท


5

คุณผสมสองหลักการที่ไม่เกี่ยวข้อง บริการและคลาสผู้ช่วยไม่ได้เชื่อมต่อ โดยเฉพาะอย่างยิ่งคำว่า "Service Class" นั้นทำให้เข้าใจผิด - ฉันคิดว่าคุณหมายถึง "Service" ซึ่งอยู่ในระดับที่สูงกว่านามธรรม บริการมีลักษณะผ่าน

"กลไกการเปิดใช้งานการเข้าถึงความสามารถอย่างน้อยหนึ่งอย่างซึ่งการเข้าถึงนั้นมีให้โดยใช้อินเทอร์เฟซที่กำหนดและมีการใช้งานที่สอดคล้องกับข้อ จำกัด และนโยบายตามที่ระบุไว้โดยคำอธิบายบริการ"

คำจำกัดความนี้เปลี่ยนแปลงเล็กน้อยขึ้นอยู่กับบริบทของคุณ แต่จุดสำคัญคือว่าคำว่า "บริการ" คือในระดับนามธรรมระดับของสถาปัตยกรรมและโดเมนของความรู้ "การ Helper Class" เป็นรูปแบบการออกแบบ (แม้ว่ามันจะต่อต้านรูปแบบที่พวกเขามีแนวโน้มที่จะพัฒนาขึ้นไปหรือเรียนพระเจ้าหยด) หมายถึงระดับที่แค็ปซูลการดำเนินงานทั่วไป (ทราบว่านี้อยู่ในระดับที่ต่ำกว่าของนามธรรมและมีการเชื่อมต่อ เพื่อความรู้เกี่ยวกับแอปพลิเคชัน / โซลูชัน ) ฉันตระหนักถึงความจริงที่ว่าไม่มีซอฟต์แวร์ใดที่ไม่ได้มีระดับตัวช่วย แต่อย่างใด แต่ก็เป็นการปฏิบัติที่ไม่ดี


4

สิ่งหนึ่งที่ต้องระวังคือคำจำกัดความหลายประการของ 'บริการ' ใน DDD:

บริการแอปพลิเคชัน: สิ่งเหล่านี้อยู่ในเลเยอร์แอปพลิเคชันและสื่อสารกับโดเมนและชั้นข้อมูลซึ่งเป็นอินเทอร์เฟซที่ระบบภายนอก / UI โต้ตอบกับระบบ DDD

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

บริการโครงสร้างพื้นฐาน: โดเมนใช้เพื่อสื่อสารกับทรัพยากรภายนอก

คลาสตัวช่วยมักจะมีรหัสหรืออัลกอริทึมที่จะถูกนำมาใช้ซ้ำโดยเอนทิตีหลาย ๆ ตัวดังนั้นจึงไม่สามารถเข้าสู่เอนทิตีได้โดยไม่ละเมิดหลักการ DRY พวกเขาอาจใกล้เคียงกับ Domain Services มากที่สุดโดยพวกเขาเรียงลำดับตามวัตถุประสงค์เดียวกัน (ทำให้ตรรกะทางธุรกิจจากเอนทิตี้ภายนอก) แต่พวกเขาทำมันด้วยเหตุผลที่แตกต่างกัน

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