2011-08-06 16 views
5

मैं वर्तमान में एक परियोजना है, जहां हम एक 3 डी वातावरण में वैक्टर का एक सेट का प्रतिनिधित्व करने के लिए है पर काम कर रहा हूँ की एक कंटेनर के रूप में उपयोग करते हुए enums। हमारे पास कई अलग-अलग विज़ुअलाइजेशन कार्यान्वयन हैं।कार्यान्वयन

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

अब मैं इंटरफ़ेस वर्ग में शामिल किया है निम्नलिखित enum:

public interface VectorVisualization { 

    public enum VectorVisualizationType { 
     CYLINDER(new VectorVisualizationCylinder(), "Cylinder"), 
     CONES(new VectorVisualizationCones(), "Cones"), 
     FATCONES(new VectorVisualizationFatCones(), "Fat cones"), 
     ARROWS(new VectorVisualizationArrows(), "Arrows"); 

     private final String label; 
     private final VectorVisualization vis; 

     VectorVisualizationType(VectorVisualization vis, String label) { 
      this.vis = vis; 
      this.label = label; 
     } 

     public VectorVisualization getVisualization() { 
      return this.vis; 
     } 

     public String getLabel() { 
      return this.label; 
     } 
    } 

    void prepareVBO(GL gl, ArrayList<VectorData> vectors, VectorField field); 
    void render(GL gl); 
    void clearOldVBOS(GL gl); 
} 

लेबल गुई में एक JComboBox के लिए है। तो अब मैं enum पर बस फिर से शुरू कर सकते हैं और विभिन्न प्रकार के लेबल प्राप्त कर सकते हैं। एक कार्यान्वयन सेट करने के लिए मैं इस तरह के enum का उपयोग कर सकते हैं:

VectorVisualizationType.CYLINDER.getVisualization() 

लेकिन क्या यह एक अच्छा तरीका है? या क्या उस दृष्टिकोण के साथ कोई समस्या है? बेशक, अब जब आपने एक नया कार्यान्वयन बनाया है तो आपको इसे enum में जोड़ना होगा।

आपकी राय के लिए धन्यवाद!

उत्तर

1

दिलचस्प। मैंने पहले मेटाडेटा के उपयोगी बिट्स को ले जाने के लिए गणना किए गए प्रकारों का उपयोग किया है, लेकिन इसे निष्पादन योग्य कोड के टुकड़े संग्रहित करने तक अब तक काफी नहीं लिया है।

यह कहा गया है कि, मैं आपके दृष्टिकोण के साथ एकमात्र मुद्दा देखता हूं, जैसा कि आपने पहले ही उल्लेख किया है, जब आप नया VectorVisualization कार्यान्वयन बनाते हैं तो आपको गणना में मैन्युअल रूप से एक नई प्रविष्टि जोड़नी होगी। आम तौर पर जहां मैं संभव हो, ऐसे मैन्युअल ओवरहेड से बचना पसंद करता हूं, लेकिन वास्तव में यह व्यक्तिगत वरीयता का मामला है।

आप (और बाकी सब आप के साथ इस कोड पर काम कर) इस बाधा के बारे में पता कर रहे हैं और यह कोई आपत्ति नहीं है, तो मुझे लगता है कि अपने समाधान ठीक है।

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

+0

आपके उत्तर के लिए धन्यवाद! थ्रेड-सेफ्टी के साथ यह एक अच्छा मुद्दा है। लेकिन हमारे मामले में यह एक समस्या नहीं होनी चाहिए। समान कार्यक्षमता प्रदान करने का एक और तरीका एक मानचित्र का उपयोग करेगा जहां आप एक कुंजी के रूप में enum का उपयोग करेंगे और वेक्टर विज़ुअलाइजेशन को मान के रूप में उपयोग करेंगे। लेकिन जब एक नया कार्यान्वयन जोड़ते हैं तो आपको enum के साथ एक के बजाय दो कोड स्थानों पर परिभाषित करना होगा .. तो मैं अभी भी enum पक्ष पर हूँ :)। – Prine

+0

@Prine - हां, मैंने अतीत में कई बार मानचित्र-आधारित दृष्टिकोण का उपयोग किया है, लेकिन यह enum के साथ किए गए कार्यों पर कोई लाभ नहीं देता है (संभव अपवाद: आप रनटाइम पर गतिशील रूप से मानचित्र में नई प्रविष्टियां जोड़ सकते हैं, और/या मौजूदा लोगों को हटा दें), इसलिए मैंने इसे नहीं लाया। अगली बार जब मुझे इसकी ज़रूरत है, तो मैं इसके बजाय आपके enum- आधारित विचार का प्रयास कर सकता हूं। – aroth

1

वर्तमान कार्यान्वयन सूची एक गणन का उपयोग करना बहुत अच्छा गुण की एक संख्या है। जैसे सभी मौजूदा कार्यान्वयन को ढूंढना बहुत आसान है क्योंकि परिभाषा द्वारा गणना की घोषणा में परिभाषित किया जाना चाहिए और आपके पास कार्यान्वयन तक पहुंच प्राप्त करने के लिए मानक enum इंटरफ़ेस है।

लेकिन यह भी है कि यह एक प्लगेबल तरह से वर्तमान सेट का विस्तार करने के असंभव बना देता है - तो एक 3 पार्टी एक नया कार्यान्वयन नहीं जोड़ सकते। इसी कारण से मैं आमतौर पर एक सिंगलटन प्रबंधक का उपयोग करना पसंद करता हूं जो सभी कार्यान्वयन को रोक देगा। यह पैटर्न ओएसजीआई जैसे कई घटक ढांचे के साथ भी बहुत अच्छी तरह से खेलता है।

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