2015-04-22 11 views
12

यदि मेरे पास एक कक्षा है जो किसी भी तरह से मेरे डीबी में एक विशिष्ट तालिका में मैपिंग का प्रतिनिधित्व करती है .. इस कक्षा में लगभग 30 गुण हैं।यदि मैं CRUD विधियों के एकाधिक अधिभार बनाना चाहता हूं तो मुझे क्या करना चाहिए?

मैंने CRUD Methods बनाया है।

और मुझे खुद को एक और (UPDATE) विधि की आवश्यकता है जो केवल दो फ़ील्ड अपडेट करना चाहिए।


सरल उदाहरण के साथ मुझे अच्छे तरीके से क्या करना चाहिए?

  1. मेरे अस्तित्व विधि (बेकार काम) एक और नाम के साथ
  2. बनाएँ स्थिर विधि का प्रयोग, पूरी वस्तु भरने और मेरे इरादा दो क्षेत्रों सहित सभी क्षेत्रों को अद्यतन? (लेकिन मैं अपने विधि नाम cuz रखना चाहते हैं यह अभिव्यक्तिपूर्ण है) !! और दो पैरामीटर लेता है?
+0

बस ओवरलोडिंग का उपयोग करें, पैरामीटर – Coder1409

+0

@ कोडर 140 9 इंस्टेंस विधि के रूप में अपडेट करने के लिए दो फ़ील्ड के साथ एक ही विधि बनाएं या इसे स्थिर विधि बनाएं ?? क्योंकि अगर मैं पैरामीटर के साथ ओवरलोड बनाने का निर्णय लेता हूं तो उन पैरामीटर पहले से ही ऑब्जेक्ट का हिस्सा हैं !! –

+0

आपको मौजूदा विधि का उपयोग करना चाहिए। ऐसा लगता है कि यह बहुत अधिक काम है लेकिन यह वास्तव में कम है। आपकी कक्षा एक अवधारणा को समाहित करती है और उस वस्तु की स्थिति बदलती है भले ही आप एक ही संपत्ति बदलते हैं। सभी गुणों का उपयोग करके अद्यतन करने से आप अपडेट से पहले उन सभी को जान सकेंगे और यह एक अच्छा प्रतिबंध है। – boosts

उत्तर

3

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

public interface ICommonProperties 
{ 
    public string P1{get; set;} 
    public string P2{get; set;} 
    public string P3{ get; set; } 
} 
public interface ITrackable 
{ 
    public string Status{get; set;} 
} 
public class FinalClass : ICommonProperties, ITrackable 
{ 
    public string P1{get; set;} 
    public string P2{get; set;} 
    public string P3{get; set;} 
    public string Status{get; set;} 
} 

public class FinalClassOperations 
{ 
    public void Update(FinalClass finalClassInstance) { }; //Updates everything 
    public void Update(ICommonProperties finalClassInstance) { }; //Updates only ICommonProperties 
    public void Update(ITrackable finalClassInstance) { }; //updates only Status. 
} 

साथ ही, यदि आप चाहते हैं तो आप सिर्फ स्थिति को अपडेट करने के लिए एक अलग वर्ग बना सकते हैं और है कि अभी भी में फिट होगा:

public class Tracker : ITrackable{ 
    public string Status{get; set;} 
} 

लेकिन हाँ, अगर दो गुण जा अलग नहीं कर सकता तार्किक रूप से, मैं ऐसा नहीं करता और उन्हें एक साथ रखता हूं।

1

यह क्या अपनी प्राथमिकताएं परियोजना पर कर रहे हैं पर निर्भर करता है: अपने पहले से ही विद्यमान अद्यतन विधि सब कुछ हर समय अद्यतन वाला है का उपयोग करते हुए, incressing यातायात, आईओ और प्रक्रिया में समय (मान्यता और इतने पर ...) हैं आप एक प्रोजेक्ट पर हैं जहां गुण टाइमस्टैम्प किए गए हैं, वे मूल्य अपडेट नहीं किए गए हैं, भले ही वे वास्तव में बदल गए हों ...

यदि आपको इन सबके बारे में कोई बात नहीं है, तो हर समय अपने अपडेट() विधि का उपयोग करें ।

मेरा व्यक्तिगत पीओवी है: एक नई विधि बनाएं (एक स्पष्ट नाम के साथ)। यह अब से उसी प्रक्रिया का समय होगा जब आपको इस कक्षा को बदलना होगा;)

1

मुझे नहीं पता कि यह आवश्यक है कि आपको क्या करना चाहिए, लेकिन यहां कुछ ऐसा है जो आप कर सकते हैं: SetAll या SetMany बनाएं या जो भी तरीका आप अपनी कक्षा (स्रोत) के किसी अन्य उदाहरण में पास करते हैं। प्रत्येक प्रॉपर्टी की जांच करें और यदि यह गैर-शून्य है, तो आप गंतव्य ऑब्जेक्ट का प्रॉपर्टी वैल्यू स्रोत ऑब्जेक्ट के प्रॉपर्टी वैल्यू पर सेट करते हैं। ध्यान दें कि यह रणनीति शून्य प्रकारों पर निर्भर करेगी, और मान लीजिए कि आप एक नए सेटर विधि में पारित शून्य मानों को अनदेखा कर सकते हैं। यहां एक उदाहरण दिया गया है:

using System; 

namespace BlogPartialUpdateTrick 
{ 
    public class SomeClass 
    { 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public int? HeightInches { get; set; } 
     public DateTime? Dob { get; set; } 

     public void SetAll(SomeClass source) 
     { 
      this.FirstName = source.FirstName ?? this.FirstName; 
      this.LastName = source.LastName ?? this.LastName; 
      this.HeightInches = source.HeightInches ?? this.HeightInches; 
      this.Dob = source.Dob ?? this.Dob; 
     } 

     public override string ToString() 
     { 
      return String.Format("fn: {0}, ln: {1}, height: {2}, DOB: {3}", FirstName ?? String.Empty, LastName ?? String.Empty, 
       HeightInches.HasValue ? HeightInches.Value.ToString() : "null", Dob.HasValue ? Dob.Value.ToShortDateString() : "null"); 
     } 
    } 
} 

इस पहले कोड नमूने में, हमारे पास मेरी स्पिफी क्लास SomeClass है। इसमें 4 गुण हैं, जिनमें से सभी शून्य हैं। इस वर्ग का उल्लेखनीय हिस्सा SetAllMethod है जहां मैं एक स्रोत ऑब्जेक्ट में पास कर सकता हूं जो कि SomeClass टाइप भी है। यह इस पैरामीटर के गुण मान को स्रोत पैरामीटर में दिए गए मानों पर सेट करता है, लेकिन केवल तभी होता है जब वे नॉन-नल हों। यहाँ एक 2 कोड blurb जहां मैं इस सामान का उपयोग कर रहा है:

using System; 
using System.Windows.Forms; 

namespace BlogPartialUpdateTrick 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      var destination = new SomeClass() { FirstName = "Freddy", LastName = "Fingers", Dob = DateTime.Parse("01/01/1970"), HeightInches = 72 }; 
      var source = new SomeClass() { FirstName = null, LastName="Flippers", Dob = null, HeightInches = 80 }; 
      destination.SetAll(source); 
      MessageBox.Show(destination.ToString()); 
     } 
    } 
} 

एक गंतव्य वस्तु, एक स्रोत ऑब्जेक्ट बनाएँ, नई विधि, देखा कहते हैं!

"fn:, जन्म तिथि 80: फ्रेडी, ln: फ़्लिपर थे, जिनमें ऊंचाई 1970/01/01" आउटपुट यह है

1

आप शायद इकाई की रूपरेखा का उपयोग करना चाहिए और संदर्भ यह तुम्हारे लिए क्या करते हैं।एफई का उपयोग करना, आप इस तरह संस्थाओं को अद्यतन करने में सक्षम हो जाएगा:

 try 
     { 
      var original = ObjectContext.Set<Request>().SingleOrDefault(x => x.Id.Equals(_request.Id)); 
      if (original != null) 
      { 
       ObjectContext.Entry(original).CurrentValues.SetValues(_request); 
      } 

      return ObjectContext.SaveChanges(); 

     } 
     catch (Exception ee) 
     { 
      return -1; 
     } 
2

मैं अपने दूसरे विकल्प का पालन करने का सुझाव देते हैं, लेकिन नाम बदलने के लिए के रूप में विधि पैरामीटर की संख्या दोनों यह है पर अलग होगा कोई जरूरत नहीं है चलिए कुछ उदाहरणों में चलते हैं

मैं एक समान स्थिति बनाने की कोशिश करूंगा, मुझे उम्मीद है कि यह आपकी स्थिति है। अगर आप गलत तरीके से सवाल उठाते हैं तो आप स्पष्ट कर सकते हैं।

वर्गों और विधि

/// <summary> 
/// CLass to store properties related to database 
/// </summary> 
class ObjectoA 
{ 
    public string A{get; set;} 
    public string B{get; set;} 
    public string C{ get; set; } 
} 

/// <summary> 
/// class to call method to update. 
/// 
/// </summary> 
class ObjectB 
{ 
    /// <summary> 
    /// update method. 
    /// I would go with this solution. 
    /// optionlay you can call the method which receive parameter of object 
    /// </summary> 
    /// <param name="A"> Object with properties mapped to database</param> 
    /// <param name="updatetwoproperties">Optional paramneter to decide which update to run. 
    /// the default value should be for update that run most. For your need if you want to create an update methods for other 
    /// two sets of parameter a suggest you create an Enum and pass this enum as optional parameter instead of bool parameter or you 
    /// can pass as string and map each string value to specific update inside. IF YOU NEED EXAMPLE 
    /// REPLAY ON COMMENTS</param> 
    /// <returns></returns> 
    public bool update(ObjectoA A, bool updatetwoproperties=false) 
    { 
     //method implementation 
     if (updatetwoproperties) 
     { 
      //implement a update to all field 
     } 
     else 
     { 
      //implement update just to two field 
     } 
     return true; 
    } 

    /// <summary> 
    /// update method based on parameter to update 
    /// </summary> 
    /// <param name="a">this properties is mapped on database</param> 
    /// <param name="b">this propertie is mapped on database</param> 
    /// <returns></returns> 
    public bool update(string a, string b) 
    { 
     //method implementation e validate the return value 
     return true; 
    }  
} 

/// <summary> 
/// I don't suggest to use this solution because 
/// it will add a method on string type while this method isn't related to string 
/// I just added here as a workaround for you. 
/// </summary> 

सार्वजनिक स्थैतिक कक्षा ObjectC { सार्वजनिक स्थैतिक bool अद्यतन (इस स्ट्रिंग एक, स्ट्रिंग ख) { // अद्यतन के कार्यान्वयन और मान्य वापसी मान वापसी सच; } }

बुला विधि और व्याख्या

static void Main(string[] args) 
    { 
        ObjectB B = new ObjectB(); //Class with methods 
     ObjectoA A = new ObjectoA(); //object with properties 

     #region Using Optional parameter to decide which update to run 
     //Calling a method to update all columns 
     B.update(A); 
     //Calling a method to update two columns 
     B.update(A, true); 
     #endregion 

     #region Using polymorphism to update 
     //Calling a method to update all columns 
     B.update(A); 
     //Update only using paramenter 
     B.update(A.B, A.C); 
     #endregion 

     //NOT RECOMMEND BECAUSE THIS UPDATE ISN'T RELATED TO STRING TYPE 
     #region Using extension method to update 
     //Calling a method to update all columns 
     B.update(A); 
     //using the extension method on variable type 
     A.B.update(A.C); 
     #endregion 

     //WE COULD USE EXTENSION METHOD ON YOUR OBJECT BUT IT WILL FAIL BECAUSE WE ALREADY AS UPDATE METHOD ON CLASS 
     //IF YOU WANT TO SEE HOW JUST REPLAY 
    } 

मैं आपको अपनी पद्धति पर वैकल्पिक पैरामीटर जोड़े गए अद्यतन

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

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