dependencies - गो में आयात चक्र से बचने के तरीके के बारे में कोई अच्छी सलाह है?




go circular-dependency (2)

चूंकि कोड बढ़ने के दौरान आयात संबंध अधिक जटिल हो जाता है, इसलिए मैं जानना चाहता हूं कि गो में आयात चक्र से अधिक कुशलता से कैसे बचें।

एक और विकल्प आपकी परियोजना में निर्भरताओं को कल्पना करना है। यह सीएलआई उपकरण godepgraph साथ किया जा सकता है। आप इसे इसके साथ स्थापित कर सकते हैं:

go get -u github.com/kisielk/godepgraph

और उसके बाद किसी अन्य सीएलआई टूल graphvis की सहायता से अपने ऐप में आयात चक्र खोजने के लिए इसका उपयोग करें। इस उपकरण को रखने से आप पैकेज निर्भरताओं को कल्पना कर सकते हैं:

godepgraph -s path/to/my/package | dot -Tpng -o godepgraph.png
open ./godepgraph.png

मेरे कोड में चक्र खोजने के लिए:

मैं एक महीने के लिए एक गो परियोजना पर काम कर रहा हूँ। अच्छी बात यह है कि गो वास्तव में बेहद कुशल है। लेकिन एक महीने के विकास के बाद मुझे पहले से ही हजारों लाइन कोड और कई packages मिल चुके packages । आयात चक्र से बचने के लिए मेरे लिए एक बड़ा मुद्दा है कि जब भी मुझे आयात चक्र त्रुटि मिलती है, मुझे नहीं पता कि समस्या पहली बार कहां हो सकती है।

गो कंपाइलर में केवल इतना ही सरल नोटिस होता है कि हमेशा समस्या का पता लगाने के लिए पर्याप्त अच्छा नहीं है: main.go:7:3: import cycle not allowed । यह केवल आपको यह जानने में मदद करेगा कि कौन सी फाइल समस्या का कारण बन सकती है लेकिन कुछ और गहराई से नहीं। चूंकि कोड बढ़ने के दौरान import संबंध अधिक जटिल हो जाता है, इसलिए मैं जानना चाहता हूं कि गो में आयात चक्र से अधिक कुशलता से कैसे बचें। किसी भी प्रकार की मदद की बेहद सराहना की जाती है।


जेएनएमएल के उत्तर पर पूरक होने के लिए (जो "डीबग" परिपत्र संदर्भ समस्याओं में मदद करता है), आप उन चक्रों को तोड़ने के लिए निर्भरता विचलन का उपयोग कर सकते हैं, निर्भरता इंजेक्शन के साथ। एक आवेदन के लिए, मैं हमेशा स्वच्छ वास्तुकला के दिशानिर्देशों का पालन करने का प्रयास करता हूं - here एक गो-विशिष्ट उदाहरण के लिए देखें - और मुझे लगता है कि गो के इंटरफेस के "गैर-घोषणात्मक कार्यान्वयन" (यानी, आपको स्पष्ट रूप से कहना नहीं है type MyStruct struct implements IfceSomething ) यह बहुत आसान बनाता है।

इसलिए, यदि आपके पास संकुल A -> B -> C -> A , तो आप InterfaceA (कुछ प्रासंगिक नाम, जाहिर है, पैकेज से संबंधित पैकेज से संबंधित व्यवहार से संबंधित व्यवहार) बनाते हैं और इसे इस इंटरफ़ेस पर निर्भर करते हैं पैकेज ए, और आप सुनिश्चित करते हैं कि यह इंटरफ़ेस पैकेज ए "लागू करता है"।

तो आपको किसी बिंदु पर ए से सी के ठोस कार्यान्वयन प्रदान करना होगा (यहां कई संभावनाएं हैं, मैं आमतौर पर मुख्य पैकेज में यह "गोंद" कोड करता हूं जो सभी निर्भरताओं के बारे में जानता है)।