Nếu bạn có một phần logic cần được chia sẻ giữa hai bộ điều khiển, bạn sẽ giữ nó ở đâu?


10

Tôi có một bộ các chức năng mục đích duy nhất mà tôi cần trong hai bộ điều khiển riêng biệt. Ngay bây giờ tôi chỉ có mã trùng lặp và tôi muốn thoát khỏi nó. Mã này là một phần của bộ điều khiển và không thuộc về lớp dịch vụ của tôi. bạn sẽ đặt nó ở đâu?


CakePHP gọi chúng là Thành phần: book.cakephp.org/2.0/en/controllers/components.html có thể đó là một nguồn cảm hứng.
Luc Franken

Câu trả lời:


12

Bạn đã không nói loại logic mà bạn đang chia sẻ. Nói tóm lại, bộ điều khiển này logic hay là hàm trợ giúp? Hai phương pháp xử lý vấn đề này trong một ngôn ngữ hướng đối tượng là kế thừa và thành phần. Kế thừa có ý nghĩa nếu có một hành động chia sẻ giữa hai bộ điều khiển. Thành phần có ý nghĩa phần còn lại của thời gian. Ví dụ về việc sử dụng tính kế thừa nằm trong câu trả lời ban đầu của tôi bên dưới dải phân cách.

Không có gì lạ khi có một lớp tiện ích hoặc một lớp trợ giúp tùy thuộc vào khung của bạn. Ví dụ: trong các khung web Java và C #, bạn có thể có một gói / không gian tên cho các tiện ích. Trong Ruby on Rails, bạn có thể tận dụng Helperlớp chia sẻ logic giữa các bộ điều khiển và khung nhìn. Về cơ bản, nó sẽ trông như thế này:

// NOTE: group similar functions
static class LoginUtility
{
    static bool IsLoggedIn(Request request) { /* ... */ }
}

Ngoài ra, bạn có thể làm cho nó một lớp bạn khởi tạo. Chìa khóa cho mẫu lớp tĩnh ở trên là làm cho các hàm của bạn hoạt động thuần túy. Nói cách khác, bạn vượt qua trong bất kỳ trạng thái nào mà nó cần để thực hiện công việc của nó và hàm không tham chiếu bất kỳ trạng thái tĩnh nào khác trong hệ thống.

Trong cả hai trường hợp, bạn sẽ truy cập nó trong mỗi bộ điều khiển của bạn như thế này:

void MyAction()
{
    if (LoginUtiltiy.IsLoggedIn(Request))
    {
        // Do something ...
    }
}

Câu trả lời gốc

Bạn đã không nói nền tảng của bạn là gì, vì điều đó có thể ảnh hưởng đến câu trả lời. Giả sử rằng đó là một ngôn ngữ hướng đối tượng, cách tiếp cận phổ biến nhất là tạo ra một lớp cơ sở mà cả hai bộ điều khiển mở rộng. Ví dụ: trong Ruby on Rails bạn có thể có:

class BaseController < ApplicationController
    def my_special_function
        # ...
    end
end

class Controller1 < BaseController
    # ...
end

class Controller2 < BaseController
    # ...
end

Bạn có thể dịch ý tưởng sang các ngôn ngữ khác là tốt. Cách tiếp cận tương tự sẽ hoạt động đối với ASP.NET MVC, Apache Wicket, Grails hoặc bất kỳ khung web hướng đối tượng nào khác. Nếu ngôn ngữ của bạn không hướng đối tượng, thì nó thực sự phụ thuộc vào cách khung được thiết kế theo cách tiếp cận tốt nhất .


3
Cách khác là đóng gói logic trong một lớp riêng biệt, sau đó khởi tạo lớp đó và gọi logic từ cả hai bộ điều khiển.
Kramii

5
Yup tôi luôn ưu tiên sáng tác hơn thừa kế
Reno

1
Làm đề xuất của Kramii thay vì thêm một lớp thừa kế. Nhưng tôi nghĩ rằng câu hỏi thực tế của anh ấy là lớp học đó đi đâu.
Không ai

1
Nó phụ thuộc vào chức năng và khung là gì. Trong đường ray, nó có thể thuộc về lớp Người trợ giúp. Trong ASP.NET hoặc Java, bạn có thể có một lớp tiện ích cho loại hàm đó. Nó thực sự phụ thuộc vào mức độ gần với bộ điều khiển mà nó cần để sống.
Berin Loritsch

Đó là logic điều khiển. Tôi chỉ cần nó ở hai nơi. Những gì tôi có bây giờ là một lớp mở rộng mà tôi sử dụng để đặt logic ở một vị trí.
Erin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.