2011-05-24 20 views
5

मुझे कुछ कोड विरासत में मिला है और जब मैं इसे देखता हूं तो यह मुझे क्रिंग कर रहा है। निम्नलिखित लिखने के लिए और अधिक सुरुचिपूर्ण तरीका है?क्या इस कोड को लिखने का कोई शानदार तरीका है?

Dim myItem As DTO.MyBaseClass = Nothing 
Dim myType As String = GetTypeString() 
Select Case myType 
    Case Is = "Case1" 
    myItem = Bus.BusManager(Of DTO.MyClass1).Read() 
    Case Is = "Case2" 
    myItem = Bus.BusManager(Of DTO.MyClass2).Read() 
'... etc etc for 30 lines 

क्या स्ट्रिंग से क्लास प्रकार तक नक्शा बनाने का कोई तरीका है और फिर बस ऐसी लाइन है? या कुछ समान है?

myItem = Bus.BusManager(Of MappingDealy(myType)).Read() 

उत्तर

1

BusManager एक जेनेरिक है, जिस प्रकार आप Of <type> में पास करते हैं, संकलन समय पर निर्दिष्ट होना चाहिए। यह पारंपरिक पैरामीटर की तरह नहीं है जिसे आप रनटाइम पर बदल सकते हैं।

यह आपके द्वारा सूचीबद्ध कोड से अस्पष्ट है BusManager वास्तव में करता है। यदि यह सब कुछ कर रहा है जेनेरिक प्रकार का एक उदाहरण बना रहा है, तो हो सकता है कि जिस व्यक्ति ने इसे बनाया है वह वास्तव में जेनेरिक समझ में नहीं आता है। क्या आपके पास BusManager काम करने के लिए पुन: कार्य करने की क्षमता है, या आप इसका उपयोग करने के लिए सीमित हैं?

जैसा कि @jmoreno ने उल्लेख किया है, आप प्रकार के नाम को शामिल करने वाली स्ट्रिंग से किसी प्रकार का उदाहरण बनाने के लिए प्रतिबिंब का उपयोग कर सकते हैं। यहाँ है कि कैसे काम करेगा:

Imports System.Reflection 
Imports System.IO 

Public Class ObjectFactory 
    Private Shared Function CreateObjectFromAssembly(ByVal assembly As Assembly, ByVal typeName As String) As Object 
     ' resolve the type 
     Dim targetType As Type = assembly.GetType(typeName) 
     If targetType Is Nothing Then 
      Throw New ArgumentException("Can't load type " + typeName) 
     End If 

     ' get the default constructor and instantiate 
     Dim types(-1) As Type 
     Dim info As ConstructorInfo = targetType.GetConstructor(types) 
     Dim targetObject As Object = info.Invoke(Nothing) 
     If targetObject Is Nothing Then 
      Throw New ArgumentException("Can't instantiate type " + typeName) 
     End If 

     Return targetObject 
    End Function 

    Public Shared Function CreateObject(ByVal typeName As String) As Object 
     Return CreateObjectFromAssembly(Assembly.GetExecutingAssembly, typeName) 
    End Function 

    Public Shared Function CreateObject(ByVal typeName As String, ByVal assemblyFileName As String) As Object 
     Dim assemblyFileInfo = New FileInfo(assemblyFileName) 
     If assemblyFileInfo.Exists Then 
      Return CreateObjectFromAssembly(Reflection.Assembly.LoadFrom(assemblyFileName), typeName) 
     Else 
      Throw New ArgumentException(assemblyFileName + " cannot be found.") 
     End If 
    End Function 

End Class 

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

जगह में है कि कारखाने वर्ग के साथ

, तो अपने कोड के सुरुचिपूर्ण संस्करण कुछ इस तरह दिखेगा:

Dim myItem as DTO.MyBaseClass = ObjectFactory.CreateObject("DTO." & GetTypeString()) 
+0

वाह अच्छा लग रहा है, धन्यवाद एक गुच्छा! –

0

सबसे पहले, कभी नहीं Case Is = का उपयोग करें और कभी नहीं Nothing को आरंभ कर देगा। तो एक त्वरित एक होगा:

Dim myItem As DTO.MyBaseClass 
Select Case GetTypeString() 
    Case "Case1" 
     myItem = Bus.BusManager(Of DTO.MyClass1).Read() 
    ' etc etc 

लेकिन जब से तुम templating का उपयोग कर रहे हैं, वहाँ वास्तव में इसे मैप करने के लिए जब तक आप प्रतिबिंब, जो थोड़ा क्लीनर और कम कोड की कीमत पर बुरी तरह अक्षम है का उपयोग करना चाहते कोई रास्ता नहीं है। आप 124 अक्षरों को सहेजने के लिए Imports DTO और अन्य 120 वर्णों को सहेजने के लिए बस भी जोड़ सकते हैं।

+1

आप कभी नहीं का उपयोग पर विस्तृत करने में सक्षम हो सकते हैं 'प्रकरण = है' और 'कुछ भी नहीं करने के लिए प्रारंभ कभी नहीं ' मैं वीबी के लिए अपेक्षाकृत नया हूँ। –

+0

'केस इज़ = xxx' सीधे' केस xxx' के बराबर है, इसलिए कोई बात नहीं है - यह सिंटैक्टिक शोर जोड़ता है। संदर्भ प्रकारों को 'कुछ भी नहीं' में शुरू करना भी व्यर्थ है क्योंकि यह डिफ़ॉल्ट रूप से वे हैं। कभी-कभी 'बूलियन' मानों को' गलत 'और संख्यात्मक मानों को' 0' 'में प्रारंभ करने के लिए और अधिक स्पष्ट हो सकता है लेकिन कभी भी' कुछ भी नहीं 'के संदर्भ प्रकारों को संदर्भित किया जा सकता है। – Ryan

+1

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

0

कोड को और देखे बिना मैं मामूली बग को प्रदर्शित होने से रोकने के लिए अपने केस स्टेटमेंट पर Enumeration का उपयोग करने की अनुशंसा करता हूं।

आप या तो गणना के आधार पर डेटा को संसाधित करने के लिए Factory Method का उपयोग कर सकते हैं।

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

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