2010-02-20 9 views
5

में छोटी "कोड का दोहराव" गंध को कैसे संभालना है, इसलिए हम सभी डुप्लिकेशन (डीआरवाई) और अन्य गंध को कम करने का प्रयास करते हैं, और हमारे कोड को जितना संभव हो उतना अच्छा और साफ रखें। रूबी कोड के लिए, गंध का पता लगाने के लिए बहुत सारे यंत्र हैं, उदाहरण के लिए बहुत अच्छी Caliber सेवा।रेल/रूबी

हालांकि, ऐसा लगता है कि मेरे पास टूल की तुलना में कोड डुप्लिकेशन की एक अलग परिभाषा है। मुझे लगता है कि यह चीजों को करने के रूबी तरीके से जुड़ा हो सकता है, जहां आप लगभग एक चर का उपयोग कभी नहीं करते हैं, बल्कि इसके बजाय एक विधि कॉल के माध्यम से। एक रेल नियंत्रक से इस स्निपेट पर विचार करें:

def update_site_settings 
    SiteSettings.site_name = params[:site_name] 
    SiteSettings.site_theme = params[:site_theme] 
    expire_fragment('layout_header') 
    flash[:notice] = t(:Site_settings_updated) 
    redirect_to :controller => 'application', :action => 'edit_site_settings' 
end 

इसका कारण यह है "पैरामीटर" विधि करने के लिए दो कॉल की, एक कोड दोहराव चेतावनी के साथ ध्वजांकित है। तो मेरा सवाल यह है कि, क्या यह वास्तव में params को स्थानीय चर में असाइन करने में सुधार होगा? मैं इसे करने का सबसे स्पष्ट और संक्षिप्त तरीका होने के तरीके के बारे में सोचता हूं, और तथ्य यह है कि params एक विधि है और रूबी में एक वैरिएबल "व्यवसाय करने की लागत" सरल नहीं है।

क्या मैं इसे गलत तरीके से देख रहा हूं?

संपादित करें: इस मामले में, SiteSettings.update_attributes(params) शैली अद्यतन करने के लिए एक सुंदर तरीका हो सकता है। पर विचार करें, यदि आप होगा, एक ही समस्या एक और टुकड़ा में:

def update 
    @mailing_list = MailingList.find(params[:id]) 

    if @mailing_list.update_attributes(params[:mailing_list]) 
    flash[:notice] = t:Mailing_list_updated 
    redirect_to(mailing_lists_path) 
    ... 
+1

धन्यवाद दोस्तों। मैं सामान्य जवाब के साथ जा रहा हूं "गंध की रिपोर्ट को दिशानिर्देश के रूप में उपयोग करें, और हर विवरण पर पसीना न करें"। –

उत्तर

1

मुझे लगता है कि आप Feature Envy कोड गंध का मामूली उदाहरण भी घोषित कर सकते हैं, हालांकि यह वास्तव में कुछ मामूली है।

शायद मेलिंग सूची पर एक वर्ग विधि, पेश किया जा सकता है, ताकि नियंत्रक विधि

def update 
    if @mailing_list = MailingList.update_attributes_by_id(params) 
    ... 

class MailingList 
    def self.update_attributes_by_id(params) 
    id = params.delete(:id) 
    find(id).update_attributes(params) 
    ... 

की तरह कुछ (परीक्षण नहीं किया है, इसलिए सावधानी से कार्य)

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

ये विश्लेषक (मैं अपने स्वयं के कोड पर केविन रदरफोर्ड के reek चलाता हूं) बहुत अच्छा है, लेकिन वे संदर्भ को समझ में नहीं आते हैं, इसलिए वे शायद ही कभी सही जानकारी प्रदान करने जा रहे हैं। वे उन क्षेत्रों की पहचान करने के लिए उपयोगी हैं जो ध्यान से लाभ उठा सकते हैं लेकिन बहुत सारे झूठे सकारात्मक होंगे और वे चीजों को भी याद करेंगे, इसलिए उन्हें जागरूकता के साथ उपयोग करने की आवश्यकता है।

3

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

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

  • कोई संबंधित समस्या नहीं^_^