2010-12-16 11 views
7

मैं सीखने और अभ्यास IoC में अभ्यास करने और वस्तुओं के बजाय इंटरफेस के खिलाफ प्रोग्राम करने की कोशिश कर रहा हूं। यह मेरे लिए काफी कठिन है। मेरे पास अब तक का कोड है। क्या मैंने कोई गलतियां की हैं? उन्हें इंगित करें कि मुझे समझने में मदद मिलेगी कि यह वास्तव में अभ्यास में कब फिट बैठता है।क्या यह कोड डीकॉप्लेड है और क्या मैं इसे सही कर रहा हूं?

धन्यवाद!

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace SharpDIC.Api.Interfaces 
{ 
    interface IDownloader 
    { 
     void DownloadInformation(); 
    } 
} 



using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using SharpDIC.Api.Interfaces; 

namespace SharpDIC.Api.Models 
{ 
    public class Member 
    { 
     /******************************************************************************** 
     * Some of these attributes aren't even used. The API doesn't provide them yet, * 
     * so I'll have to scrape the information from the HTML itself. Still thinking * 
     * about how to tackle this.             * 
     *                    * 
     * Author: Sergio Tapia               * 
     * Website: http://www.alphaot.com  
     * Date: 16/12/2010 
     * ******************************************************************************/ 

     #region "Attributes" 
     public string ID { get; set; } 
     public string Name { get; set; } 
     public string Rating { get; set; } 
     public string Photo { get; set; } 
     public string LastActive { get; set; } 
     public string Location { get; set; } 
     public string Birthday { get; set; } 
     public string Age { get; set; } 
     public string Gender { get; set; } 
     public string Email { get; set; } 


     public string Title { get; set; } 
     public string Reputation { get; set; } 
     public string DreamKudos { get; set; } 
     public string Group { get; set; } 
     public string Posts { get; set; } 
     public string PostsPerDay { get; set; } 
     public string MostActiveIn { get; set; } 
     public string JoinDate { get; set; } 
     public string ProfileViews { get; set; } 

     public string FavoriteOs { get; set; } 
     public string FavoriteBrowser { get; set; } 
     public string FavoriteProcessor { get; set; } 
     public string FavoriteConsole { get; set; } 

     public List<Visitor> Visitors { get; set; } 
     public List<Friend> Friends { get; set; } 
     public List<Comment> Comments { get; set; } 
     public string ProgrammingLanguages { get; set; } 

     public string Aim { get; set; } 
     public string Msn { get; set; } 
     public string Website { get; set; } 
     public string Icq { get; set; } 
     public string Yahoo { get; set; } 
     public string Jabber { get; set; } 
     public string Skype { get; set; } 
     public string LinkedIn { get; set; } 
     public string Facebook { get; set; } 
     public string Twitter { get; set; } 
     public string XFire { get; set; } 
     #endregion 
    } 

    public class Comment 
    { 
     public string ID { get; set; } 
     public string Text { get; set; } 
     public string Date { get; set; } 
     public string Owner { get; set; } 
    } 

    public class Friend 
    { 
     public string ID { get; set; } 
     public string Name { get; set; } 
     public string Url { get; set; } 
     public string Photo { get; set; } 
    } 

    public class Visitor 
    { 
     public string ID { get; set; } 
     public string Name { get; set; } 
     public string Url { get; set; } 
     public string Photo { get; set; } 
     public string TimeOfLastVisit { get; set; } 
    } 
} 



using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml.Linq; 
using SharpDIC.Api.Interfaces; 
using SharpDIC.Api.Models; 

namespace SharpDIC.Api 
{ 
    public class Wrapper : IDownloader 
    { 
     public void DownloadInformation() 
     { 

     } 

     public Member SearchForMember(int memberID) 
     { 
      XDocument response = GetXmlResponse(memberID); 
      //Member then is responsible to parse and fill his contents. 
      Member member = new Member(response); 
     } 
    } 
} 

आप इस कोड में क्या बदलेंगे? क्या मैं इसे ठीक से कर रहा हूं?

संपादित करें: ध्यान दें कि DownloadInformation() विधि वास्तव में कुछ भी नहीं कर रही है। मेरा इरादा था कि एक इंटरफ़ेस में वह तरीका हो, जिस तरह से मैं या तो xml (अब के लिए) से जानकारी प्राप्त कर सकता हूं लेकिन भविष्य में जेएसओएन या जो भी प्रदाता ऑफर कर सकता है, पर स्विच करने में सक्षम हो सकता है।

+1

मुझे कोई आईओसी अपने कोड में देखते हैं। – VVS

+0

धन्यवाद, आपकी टिप्पणी मुझे बहुत मदद करता है।/s –

उत्तर

3

यह कोड क्या करने जा रहा है?

जिस तरह से मैं आईओसी करना चाहता हूं, मेरे कार्यान्वयन मेरे इंटरफेस से अलग असेंबली में हैं। व्यापार तर्क सिर्फ इंटरफेस और आईओसी कंटेनर का संदर्भ देता है (स्ट्रक्चर मैप मेरा पसंद का हथियार है, लेकिन प्रत्येक के लिए ... आप इसे मैन्युअल रूप से भी कर सकते हैं) कार्यान्वयन को तार देता है।

विपरीत करने के लिए है कि आप यहाँ क्या अब तक के साथ:

  1. आपका कार्यान्वयन एक ही नाम स्थान में है (और मैं विधानसभा मान) अपने इंटरफेस के रूप में। अपनी परिश्रम के अलावा, इंटरफ़ेस की बजाय कार्यान्वयन के खिलाफ प्रोग्रामिंग से आपको रोकने के लिए वास्तव में कुछ भी नहीं है। तो युग्मन का खतरा अभी भी मौजूद है।
  2. आपके कार्यान्वयन में एक सार्वजनिक विधि है जो इंटरफ़ेस पर नहीं है। इंटरफ़ेस के खिलाफ जो कुछ भी प्रोग्राम इस विधि को देखने में सक्षम नहीं होंगे। यह ठीक है क्योंकि सिस्टम बढ़ता है। ऐसा कोई कारण नहीं है कि एक ही कार्यान्वयन एकाधिक इंटरफेस लागू नहीं कर सकता है। इंटरफेस अलगाव सिद्धांत यह अनुमति देता है, जब तक कि इंटरफेस स्वयं एक कारण के लिए अलग और अलग होते हैं। लेकिन अगर यह विधि कार्यान्वयन का एक आंतरिक हिस्सा है, तो private अधिक समझ में आ जाएगा।

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

आईओसी का असली हिस्सा होगा जहां आप IDownloader का उपयोग करेंगे, जो ऐसा नहीं लगता है कि इसका अभी तक उपयोग किया जा रहा है।

2

सर्जियो,

कुछ चीजें है कि मैं बदल जाएगा (आईओसी के आधार पर इतना नहीं - अधिक इंटरफ़ेस कल्पना):

interface IDownloader<T> 
{ 
    T DownloadInformation(); 
} 

यह मेरे लिए बेहतर महसूस करता है, आप तो हो सकता है की तरह अपने ठोस वर्ग कुछ में लागू:

public class Wrapper : SharpDIC.Api.Interfaces.IDownloader<string> 
{ 
    public Member SearchForMember(int memberID) 
    { 
     XDocument response = GetXmlResponse(memberID); 
     //Member then is responsible to parse and fill his contents. 
     Member member = new Member(response); 
    } 

    public string DownloadInformation() 
    { 
     throw new NotImplementedException(); 
    } 
} 

जाहिर है, मैं प्रकार के रूप में 'स्ट्रिंग' का इस्तेमाल किया है, लेकिन आप किसी भी प्रकार आप कार्यान्वयन के लिए आवश्यक इस्तेमाल कर सकते हैं। मैं भी IList सूची को बदल देंगे:

public IList<Visitor> Visitors { get; set; } 
public IList<Friend> Friends { get; set; } 
public IList<Comment> Comments { get; set; } 

सिर्फ बेहतर कार्यान्वयन विस्तार के लिए बनाता है (सभी के बाद, हम इंटरफेस चर्चा कर रहे हैं :-))

बस इतना ही है - 'बुद्धिमान' सामान के साथ डेविड के जवाब सौदों (अच्छा एक डेविड) ...

0

कुछ जल्दी अंक (आईओसी के बारे में नहीं):

आपका सदस्य वर्ग पुनर्संशोधित किया जाना चाहिए।

एमएसएन, ICQ आदि वरना आप अपने वर्ग हर बार जब आप को दूर करने के लिए या एक IM प्रकार जोड़ने (और इसलिए तोड़ खुला/बंद सिद्धांत)

ले जाएँ चाहते हैं बदलने की जरूरत है की तरह सभी पतों के बजाय एक IList<IInstantMessanger> जोड़े एक अलग वर्ग के लिए पसंदीदा और IList<> बनाएँ। इसी कारण से।

0

आपकी संस्थाओं के डेटा प्रकारों के बारे में।

  • अन्य डेटाटाइप्स स्ट्रिंग आईडी से अलग इस्तेमाल करने की कोशिश -> पूर्णांक, Guid
  • प्रतिष्ठा -> एक अंकीय मान है? > IList - - पूर्णांक,
  • सूची नाव> उपयोग इंटरफेस के बजाय
संबंधित मुद्दे