ฉันมีชุดของฟังก์ชั่นวัตถุประสงค์เดียวที่ฉันต้องการในตัวควบคุมแยกกันสองตัว ตอนนี้ฉันเพิ่งมีรหัสที่ซ้ำกันและฉันต้องการที่จะกำจัดมัน รหัสนี้เป็นส่วนหนึ่งของคอนโทรลเลอร์และไม่ได้อยู่ในเลเยอร์บริการของฉัน คุณจะวางไว้ที่ไหน
ฉันมีชุดของฟังก์ชั่นวัตถุประสงค์เดียวที่ฉันต้องการในตัวควบคุมแยกกันสองตัว ตอนนี้ฉันเพิ่งมีรหัสที่ซ้ำกันและฉันต้องการที่จะกำจัดมัน รหัสนี้เป็นส่วนหนึ่งของคอนโทรลเลอร์และไม่ได้อยู่ในเลเยอร์บริการของฉัน คุณจะวางไว้ที่ไหน
คำตอบ:
คุณไม่ได้บอกว่ามันเป็นการใช้ตรรกะแบบใด ในระยะสั้นเป็นตรรกะตัวควบคุมนี้หรือฟังก์ชั่นผู้ช่วยหรือไม่ สองวิธีในการจัดการกับสิ่งนี้ในภาษาเชิงวัตถุคือการสืบทอดและการจัดวาง การรับมรดกมีเหตุผลถ้ามีการกระทำร่วมกันระหว่างสองคอนโทรลเลอร์ องค์ประกอบทำให้รู้สึกถึงเวลาที่เหลือ ตัวอย่างของการใช้การสืบทอดอยู่ในคำตอบดั้งเดิมของฉันใต้ตัวแบ่ง
ไม่ใช่เรื่องแปลกที่จะมีคลาสยูทิลิตี้หรือคลาสตัวช่วยขึ้นอยู่กับกรอบงานของคุณ ตัวอย่างเช่นใน Java และ C # เว็บเฟรมเวิร์กคุณอาจมีแพ็คเกจ / เนมสเปซสำหรับยูทิลิตี้ ใน Ruby on Rails คุณอาจใช้ประโยชน์จากHelper
คลาสที่แชร์ตรรกะระหว่างตัวควบคุมและมุมมอง โดยทั่วไปจะมีลักษณะเช่นนี้:
// NOTE: group similar functions
static class LoginUtility
{
static bool IsLoggedIn(Request request) { /* ... */ }
}
หรือคุณสามารถทำให้เป็นคลาสที่คุณยกตัวอย่าง กุญแจสำคัญของรูปแบบคลาสคงที่ข้างต้นคือการทำให้ฟังก์ชั่นของคุณบริสุทธิ์ฟังก์ชั่น กล่าวอีกนัยหนึ่งคุณผ่านในสถานะใด ๆ ที่จำเป็นต้องทำหน้าที่และฟังก์ชันไม่อ้างอิงสถานะคงที่อื่น ๆ ในระบบ
ไม่ว่าในกรณีใดคุณจะเข้าถึงมันในคอนโทรลเลอร์แต่ละตัวของคุณเช่นนี้:
void MyAction()
{
if (LoginUtiltiy.IsLoggedIn(Request))
{
// Do something ...
}
}
คำตอบเดิม
คุณไม่ได้พูดว่าแพลตฟอร์มของคุณคืออะไรซึ่งอาจส่งผลต่อคำตอบ สมมติว่ามันเป็นภาษาเชิงวัตถุวิธีที่ใช้กันมากที่สุดคือการสร้างคลาสพื้นฐานที่ทั้งคอนโทรลเลอร์ขยายออก ตัวอย่างเช่นใน Ruby on Rails คุณอาจมี:
class BaseController < ApplicationController
def my_special_function
# ...
end
end
class Controller1 < BaseController
# ...
end
class Controller2 < BaseController
# ...
end
คุณสามารถแปลความคิดเป็นภาษาอื่นได้เช่นกัน วิธีการเดียวกันนี้จะใช้ได้กับ ASP.NET MVC, Apache Wicket, Grails หรือกรอบงานเว็บเชิงวัตถุอื่น ๆ หากภาษาของคุณไม่ได้เป็นแบบเชิงวัตถุจริง ๆ แล้วมันก็ขึ้นอยู่กับว่ากรอบงานนั้นได้รับการออกแบบมาเป็นวิธีการที่ดีที่สุด