หากคุณมีตรรกะบางอย่างที่ต้องแชร์ระหว่างสองคอนโทรลเลอร์คุณเก็บไว้ที่ไหน?


10

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


CakePHP เรียกว่าส่วนประกอบ: book.cakephp.org/2.0/en/controllers/components.htmlบางทีนั่นอาจเป็นแรงบันดาลใจ
Luc Franken

คำตอบ:


12

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

ไม่ใช่เรื่องแปลกที่จะมีคลาสยูทิลิตี้หรือคลาสตัวช่วยขึ้นอยู่กับกรอบงานของคุณ ตัวอย่างเช่นใน 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 หรือกรอบงานเว็บเชิงวัตถุอื่น ๆ หากภาษาของคุณไม่ได้เป็นแบบเชิงวัตถุจริง ๆ แล้วมันก็ขึ้นอยู่กับว่ากรอบงานนั้นได้รับการออกแบบมาเป็นวิธีการที่ดีที่สุด


3
อีกทางเลือกหนึ่งคือแค็ปซูลลอจิกในคลาสที่แยกต่างหากจากนั้นอินสแตนซ์คลาสนั้นและเรียกตรรกะจากตัวควบคุมทั้งสอง
Kramii

5
ใช่ฉันชอบการแต่งเพลงมากกว่ามรดกเสมอ
Reno

1
ทำข้อเสนอแนะของ Kramii แทนที่จะเพิ่มชั้นพิเศษของการสืบทอด แต่ฉันคิดว่าคำถามที่แท้จริงของเขาคือการแก้ปัญหาในชั้นเรียนนั้น
ไม่มีใคร

1
มันขึ้นอยู่กับหน้าที่และกรอบการทำงาน ในรางมันอาจอยู่ในชั้นผู้ช่วย ใน ASP.NET หรือ Java คุณอาจมีคลาสยูทิลิตี้สำหรับฟังก์ชั่นประเภทนั้น มันขึ้นอยู่กับความใกล้ตัวควบคุมที่ต้องใช้จริง ๆ
Berin Loritsch

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