मैं एक मॉड्यूल (फ्रेमवर्क विशिष्ट) लिखना चाहता हूं, जो फेसबुक PHP-sdk (https://github.com/facebook/php-sdk/) को लपेट और विस्तारित करेगा। मेरी समस्या यह है कि - अच्छी तरह से कक्षाओं को व्यवस्थित करने के लिए कैसे।बहु स्तरीय विरासत प्रतिस्थापन
तो विस्तार में हो रही - फेसबुक पीएचपी-sdk दो वर्गों के होते हैं:
- BaseFacebook - फैली BaseFacebook, और लागू करता है माता पिता सार दृढ़ता से संबंधित तरीकों - सार वर्ग सब सामान SDK के साथ
- फेसबुक करता है डिफ़ॉल्ट सत्र उपयोग के साथ
अब मैं जोड़ने के लिए कुछ कार्यक्षमता है:
- फेसबुक वर्ग प्रतिस्थापन, ढांचा सत्र वर्ग के साथ एकीकृत
- आशुलिपि तरीकों, कि रन API कॉल, मैं ज्यादातर का उपयोग करें (BaseFacebook के माध्यम से :: एपीआई()),
- प्राधिकरण के तरीकों, तो मैं यह फिर से लिखने की जरूरत नहीं है तर्क हर बार,
- विन्यास, फ्रेमवर्क वर्गों से चूसा, पारित कर दिया के रूप में पैरामीटर
- कैशिंग, ढांचा कैश मॉड्यूल के साथ एकीकृत
मैं कुछ पता बहुत गलत हो गया है के insted, क्योंकि मैं बहुत ज्यादा विरासत है यह बहुत सामान्य नहीं दिखता है। एक "जटिल विस्तार" कक्षा में सब कुछ लपेटना भी बहुत अधिक लगता है। मुझे लगता है कि मेरे पास कुछ काम करने वाले वर्ग होना चाहिए - लेकिन मुझे ऐसी समस्याएं मिलती हैं जैसे: यदि कैश क्लास वास्तव में बेसफैसबुक :: एपीआई() विधि को विस्तारित नहीं करता है और ओवरराइड करता है - शॉर्टेंड और प्रमाणीकरण कक्षाएं कैशिंग का उपयोग करने में सक्षम नहीं होंगी।
शायद यहां कुछ प्रकार का पैटर्न सही होगा? आप इन वर्गों और उनकी निर्भरताओं को कैसे व्यवस्थित करेंगे?
संपादित 04.07.2012
कोड के टुकड़े, विषय से संबंधित:
इस तरह फेसबुक पीएचपी-sdk के आधार वर्ग है:
abstract class BaseFacebook {
// ... some methods
public function api(/* polymorphic */)
{
// ... method, that makes api calls
}
public function getUser()
{
// ... tries to get user id from session
}
// ... other methods
abstract protected function setPersistentData($key, $value);
abstract protected function getPersistentData($key, $default = false);
// ... few more abstract methods
}
Normaly फेसबुक वर्ग फैली यह, और उन सार तरीकों का पालन करता है। मैं अपने substitude से बदल दिया - Facebook_Session वर्ग:
class Facebook_Session extends BaseFacebook {
protected function setPersistentData($key, $value)
{
// ... method body
}
protected function getPersistentData($key, $default = false)
{
// ... method body
}
// ... implementation of other abstract functions from BaseFacebook
}
ठीक है, तो मैं इस अधिक आशुलिपि तरीकों और विन्यास चर के साथ विस्तार:
class Facebook_Custom extends Facebook_Session {
public function __construct()
{
// ... call parent's constructor with parameters from framework config
}
public function api_batch()
{
// ... a wrapper for parent's api() method
return $this->api('/?batch=' . json_encode($calls), 'POST');
}
public function redirect_to_auth_dialog()
{
// method body
}
// ... more methods like this, for common queries/authorization
}
मुझे यकीन नहीं कर रहा हूँ अगर यह भी नहीं है एक वर्ग के लिए बहुत कुछ (प्राधिकरण/लघुरूप विधियों/विन्यास)। फिर एक और विस्तार परत - कैश:
class Facebook_Cache extends Facebook_Custom {
public function api()
{
$cache_file_identifier = $this->getUser();
if(/* cache_file_identifier is not null
and found a valid file with cached query result */)
{
// return the result
}
else
{
try {
// call Facebook_Custom::api, cache and return the result
} catch(FacebookApiException $e) {
// if Access Token is expired force refreshing it
parent::redirect_to_auth_dialog();
}
}
}
// .. some other stuff related to caching
}
अब यह बहुत अधिक काम करता है। Facebook_Cache का नया उदाहरण मुझे सभी कार्यक्षमता देता है। फेसबुक_Custom से शॉर्टंड विधियों का उपयोग कैशिंग, क्योंकि फेसबुक_Cache ने एपीआई() विधि को ओवरराइट किया है।लेकिन यहां मुझे परेशान कर रहा है:
- मुझे लगता है कि यह बहुत अधिक विरासत है।
- यह सब बहुत तंग युग्मित है - जैसा दिखता है कि मुझे फेसबुक पैरेंट पर एपीआई() विधि लूप से बचने के लिए 'parent: api' के बजाय 'फेसबुक_Custom :: api' निर्दिष्ट करना था।
- कुल मिलाकर गड़बड़ और कुरूपता।
तो फिर, यह काम करता है लेकिन मैं सिर्फ क्लीनर और स्मार्ट तरीके से ऐसा करने के पैटर्न/तरीकों के बारे में पूछ रहा हूं।
कृपया प्रदान करते हैं कुछ और जानकारी समाधान के लिए पास अधिक प्राप्त करने के लिए .. –
मैं कोड बिट्स को शामिल किया है, sory कि यह इतना समय लगा। – Luigi
वैसे; एकाधिक विरासत एक वर्ग से अधिक एक वर्ग का विस्तार कर रही है। यह कुछ अलग है। – Sherlock