ฉันต้องการที่จะรู้ว่าสิ่งที่แตกต่างชั้นบริการจากระดับยูทิลิตี้หรือชั้นผู้ช่วย? ชั้นเรียนที่มีวิธีการพื้นฐานเรียก dao เป็นบริการหรือไม่ การใช้คลาส Helper ไม่เป็นการละเมิด SRP หรือไม่
ฉันต้องการที่จะรู้ว่าสิ่งที่แตกต่างชั้นบริการจากระดับยูทิลิตี้หรือชั้นผู้ช่วย? ชั้นเรียนที่มีวิธีการพื้นฐานเรียก dao เป็นบริการหรือไม่ การใช้คลาส Helper ไม่เป็นการละเมิด SRP หรือไม่
คำตอบ:
เส้นอาจเบลอเล็กน้อย แต่ฉันเห็นด้วยวิธีนี้:
คลาสบริการ / อินเทอร์เฟซเป็นวิธีที่ลูกค้าจะโต้ตอบกับฟังก์ชันการทำงานบางอย่างในแอปพลิเคชัน โดยทั่วไปจะเป็นสาธารณะพร้อมความหมายทางธุรกิจบางอย่าง ยกตัวอย่างเช่นTicketingService
อินเตอร์เฟซที่อาจจะช่วยให้คุณbuyTicket
, sellTicket
และอื่น ๆ
คลาสตัวช่วยมีแนวโน้มที่จะถูกซ่อนจากไคลเอนต์และถูกใช้ภายในเพื่อจัดเตรียมงานจานหม้อไอน้ำที่ไม่มีความหมายโดเมนธุรกิจ ตัวอย่างเช่นสมมติว่าคุณต้องการแปลงวันที่เป็นเวลาประทับเพื่อบันทึกลงในที่เก็บข้อมูลเฉพาะของคุณ คุณอาจมีคลาสยูทิลิตี้ที่เรียกว่าDateConvertor
ด้วยconvertDateToTimestamp
วิธีการที่ทำการประมวลผลนี้
บริการไม่ได้เชื่อมโยงกับ DAO อย่างแน่นหนา แต่เป็นรูปแบบการใช้งาน / คำศัพท์ที่กว้างกว่าการคงอยู่
คลาสตัวช่วยจะไม่ละเมิด SRP หากโค้ดตามหลักการนั้น นั่นคือแต่ละวิธีควรทำสิ่งหนึ่งและสิ่งหนึ่งที่ดีชั้นควรดำเนินการช่วยเหลือยูทิลิตี้ประเภทหนึ่ง (เช่นการแปลงวันที่) และทำได้ดี
ไม่ใช่คำจำกัดความทางวิทยาศาสตร์ แต่การรับทั่วไปของฉันคือคลาสบริการมีบริบทบางอย่างภายในแอปพลิเคชันในขณะที่ผู้ช่วยเหลือทั่วไปมากกว่าและไม่สนใจว่าแอปใดที่พวกเขากำลังช่วยเหลือ
สำหรับฉันฉันไปตามคำนิยามของ Eric Evansservice
ซึ่งเป็นดังนี้:
โดยทั่วไปในระบบที่ออกแบบมาอย่างดีคลาสส่วนใหญ่ (ในรูปแบบโดเมน) มีความรับผิดชอบหรือหน้าที่ค่อนข้างชัดเจนในการจัดการกับเอนทิตีเฉพาะหรือชุดเอนทิตีในรูปแบบ
กล่าวคือ
เมื่อคุณมีฟังก์ชั่นการใช้งานที่ไม่ได้อยู่ในเอนทิตี้เฉพาะใด ๆ มันอาจเป็นเรื่องยากที่จะหาสถานที่ที่ถูกต้องให้นั่ง บางสิ่งบางอย่างเช่นที่ห่อหุ้มกระบวนการที่เกี่ยวข้องกับทั้งและAccount
Customer
ดังนั้นนี่คือที่service
มาของมันคือที่ที่คุณใส่รหัสที่อยู่ในรูปแบบโดเมน แต่ไม่ได้เป็นของเอนทิตี / ส่วนประกอบหนึ่งหรืออีกอันหนึ่ง
ฉันคิดว่าhelper
เป็นคลาสกลยุทธ์ สำหรับฉันแล้วมันเป็นสถานที่ที่จะวางโค้ดที่จำเป็นต้องใช้ซ้ำโดยคลาสต่างๆ แต่อาจจะไม่ค่อยมีวิธีที่เป็นนามธรรมในลำดับชั้นของคลาสที่ใช้ โดยส่วนตัวแล้วฉันพบคำศัพท์helper
ที่ค่อนข้างคลุมเครือและไม่มีคำเหล่านั้นในแบบจำลองของฉัน แม้ว่าจะมีอยู่ในห้องสมุดที่ฉันใช้
ระดับบริการ:มีตรรกะทางธุรกิจ
Helper Class: คลาสนี้เป็นส่วนประกอบที่นำมาใช้ใหม่ได้หนึ่งประเภท
คุณผสมสองหลักการที่ไม่เกี่ยวข้อง บริการและคลาสผู้ช่วยไม่ได้เชื่อมต่อ โดยเฉพาะอย่างยิ่งคำว่า "Service Class" นั้นทำให้เข้าใจผิด - ฉันคิดว่าคุณหมายถึง "Service" ซึ่งอยู่ในระดับที่สูงกว่านามธรรม บริการมีลักษณะผ่าน
"กลไกการเปิดใช้งานการเข้าถึงความสามารถอย่างน้อยหนึ่งอย่างซึ่งการเข้าถึงนั้นมีให้โดยใช้อินเทอร์เฟซที่กำหนดและมีการใช้งานที่สอดคล้องกับข้อ จำกัด และนโยบายตามที่ระบุไว้โดยคำอธิบายบริการ"
คำจำกัดความนี้เปลี่ยนแปลงเล็กน้อยขึ้นอยู่กับบริบทของคุณ แต่จุดสำคัญคือว่าคำว่า "บริการ" คือในระดับนามธรรมระดับของสถาปัตยกรรมและโดเมนของความรู้ "การ Helper Class" เป็นรูปแบบการออกแบบ (แม้ว่ามันจะต่อต้านรูปแบบที่พวกเขามีแนวโน้มที่จะพัฒนาขึ้นไปหรือเรียนพระเจ้าหยด) หมายถึงระดับที่แค็ปซูลการดำเนินงานทั่วไป (ทราบว่านี้อยู่ในระดับที่ต่ำกว่าของนามธรรมและมีการเชื่อมต่อ เพื่อความรู้เกี่ยวกับแอปพลิเคชัน / โซลูชัน ) ฉันตระหนักถึงความจริงที่ว่าไม่มีซอฟต์แวร์ใดที่ไม่ได้มีระดับตัวช่วย แต่อย่างใด แต่ก็เป็นการปฏิบัติที่ไม่ดี
สิ่งหนึ่งที่ต้องระวังคือคำจำกัดความหลายประการของ 'บริการ' ใน DDD:
บริการแอปพลิเคชัน: สิ่งเหล่านี้อยู่ในเลเยอร์แอปพลิเคชันและสื่อสารกับโดเมนและชั้นข้อมูลซึ่งเป็นอินเทอร์เฟซที่ระบบภายนอก / UI โต้ตอบกับระบบ DDD
บริการโดเมน: โดเมนหรือชั้นแอปพลิเคชันนี้สามารถใช้งานได้และมีตรรกะทางธุรกิจที่ไม่เหมาะกับองค์กรเดียว
บริการโครงสร้างพื้นฐาน: โดเมนใช้เพื่อสื่อสารกับทรัพยากรภายนอก
คลาสตัวช่วยมักจะมีรหัสหรืออัลกอริทึมที่จะถูกนำมาใช้ซ้ำโดยเอนทิตีหลาย ๆ ตัวดังนั้นจึงไม่สามารถเข้าสู่เอนทิตีได้โดยไม่ละเมิดหลักการ DRY พวกเขาอาจใกล้เคียงกับ Domain Services มากที่สุดโดยพวกเขาเรียงลำดับตามวัตถุประสงค์เดียวกัน (ทำให้ตรรกะทางธุรกิจจากเอนทิตี้ภายนอก) แต่พวกเขาทำมันด้วยเหตุผลที่แตกต่างกัน