यदि आपके पास तर्क का एक टुकड़ा है जिसे दो नियंत्रकों के बीच साझा करने की आवश्यकता है तो आप इसे कहाँ रखते हैं?


10

मेरे पास एकल उद्देश्य कार्यों का एक सेट है जो मुझे दो अलग-अलग नियंत्रकों में चाहिए। अभी मेरे पास केवल डुप्लिकेट कोड है और मैं इससे छुटकारा पाना चाहता हूं। यह कोड नियंत्रक का हिस्सा है और मेरी सेवा परत में नहीं है। आप इसे कहां रखेंगे?


CakePHP उन्हें घटक कहता है: book.cakephp.org/2.0/en/controllers/compords.html शायद यह कुछ प्रेरणा है।
ल्यूक फ्रेंकिन

जवाबों:


12

आपने यह नहीं कहा कि यह किस प्रकार का तर्क है जिसे आप साझा कर रहे हैं। संक्षेप में, क्या यह नियंत्रक तर्क या सहायक कार्य है? वस्तु उन्मुख भाषा में इससे निपटने के दो तरीके विरासत और रचना हैं। यदि दो नियंत्रकों के बीच एक साझा कार्रवाई है, तो वंशानुक्रम समझ में आता है। रचना बाकी समय समझ में आता है। उत्तराधिकार का उपयोग करने का उदाहरण विभक्त के नीचे मेरे मूल उत्तर में निहित है।

आपके फ्रेमवर्क के आधार पर उपयोगिता वर्ग या सहायक वर्ग का होना असामान्य नहीं है। उदाहरण के लिए, जावा और C # वेब फ्रेमवर्क में आपके पास उपयोगिताओं के लिए एक पैकेज / नाम स्थान हो सकता है। रूबी ऑन रेल्स में, आप उस Helperवर्ग का लाभ उठा सकते हैं जो नियंत्रकों और विचारों के बीच तर्क साझा करता है। मूल रूप से, यह इस तरह दिखेगा:

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

वैकल्पिक रूप से, आप इसे एक ऐसा वर्ग बना सकते हैं, जिसे आप तुरंत भेज सकते हैं। उपरोक्त स्थिर वर्ग पैटर्न की कुंजी आपके कार्यों को शुद्ध कार्य करना है। दूसरे शब्दों में, आप किसी भी राज्य में पास हो जाते हैं कि उसे काम करने की आवश्यकता है, और फ़ंक्शन सिस्टम में किसी भी अन्य स्थिर स्थिति का संदर्भ नहीं देता है।

किसी भी स्थिति में, आप इसे अपने प्रत्येक नियंत्रक में इस तरह से एक्सेस करेंगे:

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

मूल उत्तर

आपने यह नहीं कहा कि आपका प्लेटफ़ॉर्म क्या था, क्योंकि यह उत्तर को प्रभावित कर सकता है। यह मानते हुए कि यह एक वस्तु उन्मुख भाषा है, सबसे आम दृष्टिकोण एक आधार वर्ग बनाना है जो दोनों नियंत्रकों का विस्तार करता है। उदाहरण के लिए रूबी ऑन रेल्स में आपके पास हो सकता है:

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

class Controller1 < BaseController
    # ...
end

class Controller2 < BaseController
    # ...
end

आप विचार को अन्य भाषाओं में भी अनुवादित कर सकते हैं। एक ही दृष्टिकोण ASP.NET MVC, Apache Wicket, Grails या किसी अन्य ऑब्जेक्ट ओरिएंटेड वेब फ्रेमवर्क के बारे में काम करेगा। यदि आपकी भाषा ऑब्जेक्ट ओरिएंटेड नहीं है, तो यह वास्तव में इस बात पर निर्भर करता है कि फ्रेमवर्क को सबसे अच्छा तरीका कैसे बनाया गया है ।


3
विकल्प एक अलग वर्ग में तर्क को अतिक्रमण करना है, फिर उस वर्ग को तत्काल करना और दोनों नियंत्रकों से तर्क को कॉल करना है।
क्रामि

5
यूप I हमेशा रचना से अधिक विरासत का पक्ष लेता है
रेनो

1
Kramii के सुझाव को विरासत की एक अतिरिक्त परत जोड़ने के बजाय करें। लेकिन मुझे लगता है कि उनका वास्तविक सवाल यह था कि समाधान उस वर्ग में कहां जाता है।
कोई नहीं

1
यह इस बात पर निर्भर करता है कि कार्य और रूपरेखा क्या है। रेल में, यह हेल्पर वर्ग में हो सकता है। ASP.NET या Java में, आपके पास उस प्रकार के फ़ंक्शन के लिए एक उपयोगिता वर्ग हो सकता है। यह वास्तव में निर्भर करता है कि नियंत्रक के कितने करीब रहना होगा।
बेरिन लोरिट्श

यह नियंत्रक तर्क है। मुझे सिर्फ दो जगहों पर इसकी जरूरत है। मेरे पास अब एक विस्तार वर्ग है जिसका उपयोग मैं तर्क को एक स्थान पर रखने के लिए करता हूं।
एरिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.