को लागू करने मैं अक्सर करते हैं पीएचपी परियोजनाओं वेब पृष्ठों से श्रेणीबद्ध स्क्रैप डेटा और उन्हें डीबी (अनिवार्य रूप से, संरचना के आंकड़ों के बचाने के लिए डिज़ाइन किया गया - लगता है scraping सरकारी वेबसाइटों की क्या ज़रूरत है कि डेटा, लेकिन इसे संरचित तरीके से प्रदान न करें)। मामले में मूल वेब पेज में परिवर्तन पीएचपी OOP डिजाइन - विशिष्ट बच्चे कक्षाओं के लिए मानकों को सीमित करते हुए सामान्य इंटरफेस
- आसानी से नए लोगों को साथ वर्तमान HTML पार्स स्क्रिप्ट की जगह,: हर बार, मैं एक OOP डिजाइन कि मेरा पीछा प्राप्त करने की अनुमति होगी आने की कोशिश डेटा स्क्रैप और सहेजा गया, क्योंकि ये परियोजनाएं दूसरों के लिए लेने और बनाने के लिए भी हैं। मेरा लक्ष्य "आधार" डेटा एकत्र करना है, जबकि अन्य कुछ अतिरिक्त शामिल करने का निर्णय ले सकते हैं, इसे सहेजने के तरीके को बदल सकते हैं और आदि
अभी तक मुझे समाधान मिल गया है, लेकिन निकटतम मुझे मिला यह कुछ इस तरह:
मैं डेटा कंटेनर है कि आम पेड़ traversing कार्यों को लागू होता है के लिए एक अमूर्त वर्ग को परिभाषित:
abstract class DataContainer {
protected $parent = NULL;
protected $children = NULL;
public function getParent() {
return $this->parent;
}
public function getChildren() {
return $this->children;
}
}
और फिर मैं वास्तविक डेटा कंटेनरों की है। कल्पना कीजिए, मैं संसदीय सत्रों में "बैठे बैठे" स्तर पर भागीदारी पर डेटा स्क्रैप कर रहा हूं। मेरे पास SessionContainer
, SittingContainer
, QuestionContainer
होगा जो सभी DataContainer
का विस्तार करेंगे।
प्रत्येक सत्र, बैठे और प्रश्न डेटा को एक अलग यूआरएल से हटा दिया जाता है। यूआरएल सामग्री को अलग करने के तंत्र को छोड़कर, मान लीजिए कि मुझे स्क्रैपर कक्षाएं चाहिए, जो वास्तविक पार्सिंग के लिए कंटेनर और डीओएमडी दस्तावेज़ ले लेंगे। फिर सत्र के प्रत्येक
interface Scraper {
public function scrapeData(DOMDocument $Dom, DataContainer $DataContainer);
}
, बैठे और सवाल अपने स्वयं के स्क्रेपर्स, जो इंटरफ़ेस को लागू करना होगा: तो मैं इस तरह एक सामान्य इंटरफेस को परिभाषित करेगा। लेकिन मैं यह भी सुनिश्चित करना चाहता हूं कि वे केवल उन कंटेनरों को स्वीकार कर सकें जिनके लिए वे हैं। तो यह देखने के लिए की तरह होगा:
class SessionScraper implements Scraper {
public function scrapeData(DOMDocument $DOM, SessionContainer $DataContainer) {
}
}
अंत में, मैं एक सामान्य Factory
वर्ग भी स्क्रैपर इंटरफ़ेस लागू करता है और सिर्फ प्रासंगिक स्क्रेपर्स के लिए scraping वितरित करता होगा। इस तरह:
public function scrapeData(DOMDocument $DOM, DataContainer $DataContainer) {
//get the scraper from configuration array
$class = $this->config[get_class($DataContainer)];
$craper = new $class();
$class->scrapeData($DOM, $DataContainer);
}
यह वह वर्ग है जिसे वास्तव में कोड में बुलाया जाएगा। इसी तरह, मैं डीबी को बचाने के साथ सौदा कर सकता था - प्रत्येक डेटा कंटेनर में इसकी डीबीएसएवर कक्षा हो सकती है, जो डीबीएसवर इंटरफ़ेस को कार्यान्वित करेगी। दोबारा, सभी कॉल Factory
कक्षा के माध्यम से की जा सकती हैं, जो डीबीएसएवर इंटरफेस को भी लागू करेगी।
सबकुछ सही होगा, लेकिन समस्या यह है कि इंटरफ़ेस को लागू करने वाले वर्गों को इंटरफ़ेस के सटीक हस्ताक्षर को लागू करना चाहिए। जैसे विधि SessionScraper::scrapeData
केवलSessionContainer
वस्तुओं स्वीकार नहीं कर सकते, यह सब DataContainer
वस्तुओं स्वीकार करना चाहिए। लेकिन इसका मतलब यह नहीं है!
अंत में, सवाल:
- मेरी डिजाइन गलत है और मैं एक पूरी तरह से अलग तरीके से सब कुछ की संरचना की जानी चाहिए? (किस तरह?), या:
- मेरे डिजाइन ठीक है, यह सिर्फ है कि मैं प्रकार typehinting के माध्यम से इसे लागू करने के बजाय
instanceof
और इसी तरह के चेक के तरीकों के भीतर लागू करने की आवश्यकता है? सभी सुझावों/आलोचनाओं के लिए पहले से
धन्यवाद। अगर आवश्यक हो तो मैं इस कोड को अपने सिर पर उलझाने से पूरी तरह से खुश हूं! आंख में
व्यापक उत्तर के लिए धन्यवाद - कुछ अन्य विचारों को भी ट्रिगर किया! एक स्पष्टीकरण - क्या मैं आपको सही ढंग से समझता हूं कि आप अनिवार्य रूप से सभी डेटा रखने के लिए एक डेटा/कंटेनर कक्षा रखने का सुझाव देते हैं, और इसे बाल कक्षाएं बनाने के बजाय संपत्ति प्रकार द्वारा पहचानते हैं? या यह दोनों प्रकार की संपत्ति और बाल कक्षाएं होगी, केवल स्क्रैपर्स ही खाते को ध्यान में रखेंगे? – Aurimas
मुझे आपके डेटा को विशेष रूप से नहीं पता है, इसलिए यह कहना मुश्किल है। यदि डेटा बहुत आम है तो केवल अलग-अलग गुण हैं, आपको कई डेटा कक्षाएं बनाने की आवश्यकता नहीं है, आप गतिशील गुणों के साथ जा सकते हैं। बाद में समग्र आवेदन के लिए यह काफी बेहतर है। ज्यादातर स्क्रैपर्स बदल जाएंगे, कभी-कभी इसके साथ डेटा भी। आपको हमेशा एक नई डेटा क्लास बनाने की आवश्यकता होगी क्योंकि कुछ वेबसाइट थोड़ी बदल गई है। अच्छा नही :) – hakre