2014-11-12 18 views
6

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

मैंने पहली बार कोर बंडल बनाने के लिए AMD & require.js का उपयोग करने का प्रयास किया, लेकिन मैं परिपत्र निर्भरताओं के साथ एक समस्या में आया। यह पढ़ने के बाद कि यह requ.js के साथ आम है और सामान्य जेएस को अक्सर बड़ी परियोजना के लिए सलाह दी जाती है, मैंने कोशिश की। लेकिन अब यह ब्राउज़र के साथ एक साथ स्थापित है, मेरे पास सटीक संकलित बंडल चलाने पर एक ही समस्या ठीक उसी स्थान पर आ रहा है।

मेरे पास 10 आधार वर्गों की तरह कुछ है जो हर दूसरे पर भरोसा करते हैं और कई परिपत्र निर्भरता बनाते हैं। मुझे उन सभी को हटाने का कोई तरीका नहीं दिख रहा है। क्यों मुझे नहीं लगता कि मैं परिपत्र निर्भरता को दूर कर सकते हैं

एक सरलीकृत सेटअप व्याख्या करने के लिए:

Triples are made of 3 Resources (subject,predicate,object) 
Resource has TripleCollections to keep track of which triples its used in 
Resource has multiple functions which rely on properties of Triple 
Triple has some functions which handle TripleCollections 
TripleCollection has multiple functions which uses functions of Triple 
TripleCollection.getSubjects() returns a ResourceCollection 
ResourceCollection.getTriples() returns a TripleCollection 
Resource keeps track of the objects of its triples in ResourceCollections 
ResourceCollection uses multiple functions of Resource 

मैं इतना (this one सबसे उपयोगी किया जा रहा है) पर यहाँ कई संबंधित मुद्दों पढ़ा है, और से क्या मैं इकट्ठा कर सकते हैं मेरे पास केवल कुछ विकल्प हैं:

1) सभी मूल वर्गों को गोलाकार निर्भरताओं के साथ 1 फ़ाइल में रखें।

इसका मतलब है कि यह एक फ़ाइल का नरक बन जाएगा। और आयात हमेशा उपनाम की आवश्यकता होगी:

import core = require('core'); 
import BaseA = core.BaseA; 

2) आंतरिक मॉड्यूल

कोर बंडल ठीक काम किया (अपने परिपत्र निर्भरता के साथ) जब मैं आंतरिक टाइपप्रति मॉड्यूल और संदर्भ फ़ाइलों का उपयोग का उपयोग करें। हालांकि अगर मैं अलग-अलग बंडल बनाना चाहता हूं और उन्हें रन टाइम पर लोड करना चाहता हूं, तो मुझे requ.js के साथ सभी मॉड्यूल के लिए शिम्स का उपयोग करना होगा।


हालांकि मैं वास्तव में सभी अलियासिंग की तरह, मुझे लगता है क्योंकि अगर यह काम करता है मैं CommonJS के साथ जा रहा रखने के लिए और browserify और बाद में मैं भी और अधिक आसानी से सब कुछ चलाए जा सकते हैं मैं अब विकल्प 1 की कोशिश करेंगे, करते हैं नोड में सर्वर। और यदि विकल्प काम नहीं करता है तो मुझे विकल्प 2 का सहारा लेना होगा।

प्रश्न 1: क्या कोई संभावित समाधान है जिसका मैंने उल्लेख नहीं किया है?

प्रश्न 2: 1 कोर बंडल के साथ टाइपस्क्रिप्ट प्रोजेक्ट के लिए सबसे अच्छा सेटअप क्या है जो मांग पर अन्य बंडलों (जो कोर पर निर्माण) लोड करता है। ऐसा लगता है कि सर्कुलर निर्भरताओं के आसपास नहीं जा सकता है। और जो क्लाइंट और सर्वर दोनों पर अधिमानतः चल सकता है।

या क्या मैं सिर्फ असंभव पूछ रहा हूं? :)

उत्तर

7

बस डालें (शायद सरलता से, लेकिन मुझे ऐसा नहीं लगता), यदि आपके पास ModuleA और ModuleB है और दोनों एक दूसरे पर भरोसा करते हैं, तो वे मॉड्यूल नहीं हैं। वे अलग फाइलों में हैं, लेकिन वे मॉड्यूल जैसे अभिनय नहीं कर रहे हैं।

आपकी स्थिति में, कक्षाएं अत्यधिक परस्पर निर्भर हैं, आप उन सभी वर्गों में से किसी एक को बिना किसी आवश्यकता के उपयोग कर सकते हैं, इसलिए जब तक कि आप कार्यक्रम को दोबारा करने के बजाय निर्भरताओं को एक-तरफा बनाने की कोशिश नहीं कर सकते, रास्ता (उदाहरण के लिए), मैं कक्षाओं के समूह को एक मॉड्यूल के रूप में मानता हूं।

Dependencies

आप एक ही मॉड्यूल में इन सब डाल करते हैं, तो आप अभी भी निर्भरता से कुछ, उदाहरण के लिए ले जाकर मॉड्यूल में तोड़ने में सक्षम हो सकता है (और इन सवालों के सभी के रूप में बड़े पैमाने पर बयानबाजी कर रहे हैं वे ऐसे प्रश्न हैं जिन्हें आपको खुद से पूछना होगा), Triple और Resource एक दूसरे पर साझा करते हैं? क्या इसे कक्षा में स्थानांतरित किया जा सकता है जिससे वे दोनों निर्भर हो सकें? Triple को TripleCollection (शायद क्योंकि यह कुछ पदानुक्रमित डेटा का प्रतिनिधित्व करता है) के बारे में जानने की आवश्यकता क्यों है? केवल कुछ चीजें हो सकती हैं जिन्हें आप स्थानांतरित कर सकते हैं, लेकिन इस वर्तमान डिज़ाइन से हटाई गई कोई निर्भरता जटिलता को कम करेगी। उदाहरण के लिए, यदि Triple और Resource के बीच दो-तरफा संबंध हटाया जा सकता है।

यह हो सकता है कि आप अभी इस डिजाइन को काफी हद तक नहीं बदल सकते हैं, इस मामले में आप इसे सभी मॉड्यूल में डाल सकते हैं और इससे मॉड्यूल लोडिंग समस्या को काफी हद तक हल किया जाएगा और यह कोड को एक साथ रखेगा उसी कारण के लिए बदलें।

इस सब का सार है:

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

तो अपने विकल्पों पर मेरे विचार आपके प्रश्नों में उन लोगों के लिए थोड़ा अलग है ...

1) युग्मन कम करने के लिए देखने के लिए अगर आप छोटे मॉड्यूल

रख सकते कोड पुनर्रचना का प्रयास करें विफल रहा है ...

2) सभी मूल वर्गों को 1 फ़ाइल में परिपत्र निर्भरताओं के साथ रखें।

मैं सूची में आंतरिक मॉड्यूल विकल्प नहीं रखूंगा - मुझे लगता है कि बाहरी मॉड्यूल एक बड़े कार्यक्रम के प्रबंधन का एक बेहतर तरीका है।

+5

धन्यवाद स्टीव, आप रॉक। मैं दो तरह की निर्भरताओं को हटाने की कोशिश करने में कुछ और समय बिताने जा रहा हूं और सूची से आंतरिक मॉड्यूल पार कर रहा हूं। मॉड्यूल _is_ क्या उत्कृष्टता से नोट्स भी उपयोगी हैं। क्योंकि अब - अगर मैं चीजों को एक फाइल में डालता हूं - यह एक वर्कअराउंड की तरह कम महसूस करेगा, और मॉड्यूल के तरीके के प्राकृतिक परिणाम की तरह। यह सब वास्तव में मुझे कुछ और निश्चितता – Flion

+0

@ फ़्लियन के साथ आगे बढ़ने में मदद करता है, जो कि आप [निर्भरता संरचना मैट्रिक्स] (http://stackoverflow.com/questions/1841552/what- ओपन-सोर्स-विकल्प-टू-लैटिक्स) और विशेष रूप से कुछ टूल्स द्वारा ऑफ़र किए गए स्वचालित विभाजन एल्गोरिदम में से कुछ, उदाहरण के लिए http://lattix.com/videos – xmojmr

+1

मुझे लगता है कि मुझे भ्रमित करने वाला क्या था मेरी डेटाबेस संरचना के ठीक बाद मेरे जावास्क्रिप्ट कक्षाओं को मॉडल करने का प्रयास कर रहा था। निश्चित रूप से वे एक-दूसरे के समान होना चाहिए, लेकिन डेटाबेस डिज़ाइन में सर्कुलर निर्भरता वर्जित नहीं हैं और इससे मुझे फिसल गया। एक बार मुझे एहसास हुआ कि वे विभिन्न उद्देश्यों की सेवा करते हैं, यह समझना आसान था कि प्रत्येक को कैसे मॉडलिंग किया जाना चाहिए। – aaaaaa

संबंधित मुद्दे