2012-02-28 10 views
12

हमारे पास पुराने जेडीके 1.4 के आधार पर एक बड़ी परियोजनाएं हैं। हमने वेब ऐप को जेडीके 1.6 में माइग्रेट कर दिया है लेकिन कोड में अभी भी बहुत अक्षम अक्षमता और खराब डिज़ाइन मौजूद है।जावा स्थिरांक व्यवस्थित करने का आदर्श तरीका

प्रमुख दर्द बिंदुओं पर विशाल जावा कक्षाओं में 2500+ एकल जावा फ़ाइल में कोड की रेखाएं। इन तरह की कई फाइलें।

कक्षाओं को दोबारा शुरू करने के प्रयास में मैंने स्थिरांक को हटाकर और विभिन्न Constants.java फ़ाइल में स्थिरांक डालने से शुरू किया था। लेकिन चूंकि एप्लिकेशन के माध्यम से इतने सारे स्थिरांक हैं, इसलिए स्थिरांक फ़ाइल में भारी अनुपात में वृद्धि का खतरा होता है।

मैं कोड को स्वच्छ और रखरखाव रखने के लिए डेवलपर्स को किस रणनीति को अपनाने के बारे में प्रतिक्रिया की सराहना करता हूं।

+6

एक एकल 'कॉन्स्टेंट' वर्ग एक एंटीपाटर की तरह लगता है।स्थिरांक के अर्थ के आधार पर उन्हें विभाजित करें, या उचित जगहों पर उन्हें बदलें। – millimoose

+2

एक प्रोफाइलैक्टिक के रूप में, अपने डेवलपर्स को इलेक्ट्रोड हुक करें जो उन्हें किसी भी समय फ़ाइल को सहेजने के लिए वोल्टेज के LOC * 0.01V जैसे कुछ के साथ झटका देगा। – millimoose

+0

आप किस विशिष्ट समस्या को हल करने की कोशिश कर रहे हैं? बस तथ्य यह है कि फाइलें बहुत बड़ी हैं? यदि ऐसा है, तो सबकुछ रिफैक्टर करने की लागत इसके लायक नहीं होगी। –

उत्तर

13

अपने स्थिरांक को उस कक्षा में रखें जो वे संबंधित हैं, उन्हें निकालने के लिए बाध्य न हों। यह कक्षा के कोड को साफ कर सकता है, लेकिन फ़ाइल में असंबंधित स्थिरांक मिश्रण एक सुधार नहीं है।

चीजों को एक साथ संबंधित रखें

और आप उन्हें एनम्स में परिवर्तित/उपयोगी (लेकिन इसके लिए कुछ रिफैक्टरिंग की आवश्यकता हो सकती है) में परिवर्तित कर सकते हैं।

+1

लेकिन फिर स्थिरांक के लिए हमेशा डुप्लिकेट मानों का जोखिम होता है। उदाहरण के लिए तालिका का नाम "user_profile" EMPLOYER_USER_PROFILE और WEB_USER_PROFILE जैसे कई स्थिरांक में संग्रहीत है। आदि –

+1

आप तालिका नाम को डीएओ कक्षा (उस तालिका के लिए कक्षा) में निरंतर क्यों नहीं स्टोर कर सकते हैं, और उसके बाद अन्य कक्षाओं से उस निरंतर उपयोग का उपयोग क्यों कर सकते हैं? (इसे निरंतर सार्वजनिक रूप से घोषित करने की आवश्यकता है) –

+0

@RegMem आप समान स्ट्रिंग खोजने के लिए चेकस्टाइल और संभवतः अन्य स्थिर कोड विश्लेषकों का उपयोग कर सकते हैं और डुप्लीकेट पर एक चेतावनी (या 'सूचनात्मक', जैसा कि मैं उपयोग करता हूं) टैग डाल सकता हूं। –

0

मैंने कभी भी सभी स्थिरांक को एक जावा फ़ाइल में डालने के बारे में नहीं सुना है। सबसे अच्छा तरीका है कि स्थिरांक स्वयं को कक्षाओं के साथ accossiated, लेकिन उन्हें पूंजी पत्र और अंडरस्कोर के साथ नाम दें: EXAMPLE_CONSTANT

+1

मेरा डाउनवोट नहीं है, लेकिन समस्या तब होती है जब एक से अधिक कक्षाओं द्वारा स्थिरांक की आवश्यकता होती है, यानी स्थिरांक कक्षाओं के बीच बातचीत के साथ होते हैं, न कि कक्षा – DNA

+0

@ डीएनए के आंतरिक व्यवहार के बाद, तो आप उन्हें सबसे तार्किक वर्ग में डालते हैं और बनाते हैं उन्हें सार्वजनिक –

+0

@owlstead जो कहना आसान है, लेकिन "सबसे स्पष्ट वर्ग" नहीं हो सकता है। जब कई वर्ग सहयोग करने के लिए स्थिरांक पर भरोसा करते हैं, तो वे सभी उन स्थिरांक को समान रूप से साझा करते हैं, और यह तय करने का कोई तरीका नहीं है कि उनमें से कौन सा होना चाहिए। इसका मतलब यह नहीं है कि _all_ स्थिरांक को _one_ फ़ाइल में जाना चाहिए। साझा साझा इंटरफ़ेस में बस साझा स्थिरांक सबसे अच्छा हो सकता है। उदाहरण के लिए http://docs.oracle.com/javase/6/docs/api/javax/swing/SwingConstants.html देखें – DNA

0

क्या आपने अपने सभी स्थिरांक के लिए एम्स का उपयोग करने का प्रयास किया है? मुझे बताया गया है कि यह जावा 1.5 के बाद से पसंदीदा तरीका है।

http://docs.oracle.com/javase/1.5.0/docs/guide/language/enums.html

+1

Enums बहुत अच्छे हैं, लेकिन वे हमेशा स्थिरांक को प्रतिस्थापित करने में सक्षम नहीं होते हैं - प्रत्येक लागू होने पर उपयोग किया जाना चाहिए। –

2

बस एक Constant.java फ़ाइल में स्थिरांक डाल नहीं है मेरी राय में Sens (यह सिर्फ दूर समस्या ले जाते हैं)। लेकिन कभी-कभी मैं चीजों को साफ़ करने के लिए उन्हें पुन: समूहित करने के लिए उपयोग करता हूं और उन्हें पुन: समूहित करने के लिए कई फ़ाइलों का उपयोग करता हूं: DatabaseConstants.java, GraphicConstants.java और इसी तरह ... और निश्चित रूप से, enums का उपयोग भी उपयोगी हो सकता है (और सर्वोत्तम अभ्यास)।

संपादित करें: सटीक होने के लिए, मैं वास्तव में जावा एमई एप्लिकेशन के साथ काम करता हूं, इसलिए यह अमूर्त कक्षाओं में "नियंत्रित शब्दावली" के साथ "उन नकल" की नकल करने का एक तरीका है (मुझे सभी जावा याद आती है) ईई विशेषताएं ...)

+0

मैं इस रणनीति का उपयोग करने के बारे में सोच रहा था, लेकिन मेरा सवाल इस बात को प्रतिबिंबित नहीं करता है क्योंकि मैं अभी भी इस रणनीति को अपनाने के लिए बहस कर रहा था। एक ऐप जिसमें 150 मॉडल अद्वितीय वस्तुओं के ऊपर है (नहीं, हम वसंत, या स्ट्रेट आदि का उपयोग नहीं कर रहे हैं)। इन मॉडल ऑब्जेक्ट्स में से प्रत्येक में पूरी तरह से बिखरे हुए स्थिरांक हैं, लेकिन इसका दृष्टिकोण –

8

सभी कॉन्स्टेंट को एक ही फाइल में रखना एक भयानक विचार है! विशेष रूप से उबर-कॉन्स्टेंट एंटी-पैटर्न जहां सभी कॉन्स्टेंट Interface में हैं कि प्रत्येक वर्ग में implement है। रविवार को भयानक 10 तरीके! यह एक बुरा विचार था जब लोगों ने जावा के पहले 1 99 0 के शुरू में इसे वापस करना शुरू किया था! 2012 में यह निश्चित रूप से एक बुरा विचार है!

इसका मतलब है कि आप कई गैर-संबंधित जानकारी को जोड़ रहे हैं और जब भी आप इस उबर-कॉन्स्टेंट फ़ाइल आयात करते हैं तो अनिवार्य निर्भरताएं बनाते हैं। जो चीजें एक साथ जाती हैं उन्हें Enum या कम से कम Class में एक साथ होना चाहिए जो उन्हें अपने तरीकों के लिए तर्क के रूप में उपयोग करता है ताकि जब वे बदल जाए तो आप आसानी से प्रभाव विश्लेषण कैसे करें।

कल्पना करें ColorDaysOfTheWeek स्थिरांक के साथ मिश्रित स्थिरांक अन्य व्यावसायिक डोमेन स्थिरांक के साथ मिश्रित हैं और सैकड़ों होंगे यदि इन फ़ाइलों में से एक हजार में नहीं। इसे कभी भी एक अच्छा विचार कैसे माना जा सकता है?प्रत्येक गैर-संक्रमित मामले में, EnumClass का सदस्य एक बेहतर समाधान है।

इसका मतलब यह भी है कि आपके पास संघर्ष करने वाले नामों को बनाने और बनाने के लिए एक एकल फ्लैट नामस्थान है, तो वे स्पष्ट नहीं हैं कि वे किस प्रकार हैं और उनका उपयोग कैसे किया जाना चाहिए। यह कभी भी एक सकारात्मक अभ्यास नहीं है।

जब डिजाइन और पुनर्रचना आप हमेशा यह करे:

उच्च सामंजस्य के लिए प्रयास करते हैं, इसका मतलब संभव के रूप में एक साथ करीब के रूप में संबंधित चीजें रखने के लिए।

ढीले युग्मन के लिए प्रयास करें इसका मतलब है कि गैर-संबंधित चीजें अन्य गैर-संबंधित क्षेत्रों में रिसाव न करें।

स्व-दस्तावेज रखने योग्य कोड, दर्जनों या सैकड़ों private static final String/int घोषणाओं के साथ प्रयास करें जो सभी मिश्रित घोषणाएं किसी के मानक द्वारा इस परिभाषा को फिट नहीं करती हैं!

2012 में सी-स्टाइल स्थिरांक एक खराब समाधान हैं जब आपके पास अब एक उपकरण के रूप में Enum है, तो आपको जहां भी संभव हो,पर कॉन्स्टेंट के इन समूहों में से कई को परिवर्तित करने पर ध्यान केंद्रित किया जाना चाहिए। Enum टाइप सुरक्षित है और intelligent बनाने के लिए उससे जुड़े अन्य गुण और गुण और व्यवहार हो सकते हैं। वह नीचे जाने का रास्ता है।

+0

शायद यह जोड़ना उपयोगी है कि चीजें "संबंधित" बनाती हैं: वे असंबद्ध चीजों के कारण (बहुत अधिक) परिवर्तन किए बिना * एक साथ बदल सकते हैं। – reinierpost

+0

(सिर्फ इसलिए कि स्थिरांक 'इंटरफ़ेस' में हैं, इसका मतलब यह नहीं है कि उस इंटरफ़ेस * को कार्यान्वित किया जाना है।) –

-1

मुझे लगता है कि अगर आपके पास 2500 से अधिक एलओसी से अधिक जावा फाइलें हैं, तो कॉन्स्टेंट को रखने का निर्णय आपकी समस्याओं का सबसे कम होना चाहिए। आपको एक स्पष्ट तस्वीर बनाना चाहिए कि पुनर्गठित प्रणाली कैसा दिखाई देगी। यह संभवत: यह तय करना कठिन होता है कि स्थिरांक और अन्य वाक्य रचनात्मक विचारों को कहां रखना है, लेकिन फिर भी इसे पहले करने की आवश्यकता है।

+0

हां, मुझे पता है, लेकिन एक डरावनी टीम और परिष्कृत हिस्सेदार धारकों (सामान्य मामले) के साथ मैंने सोचा सबसे छोटा चक्र और सबसे कम जोखिम के माध्यम से मेरी "रिफैक्टरिंग यात्रा" शुरू करना। मैं कई चरणों में कोड में "poop" को साफ करने की योजना बना रहा हूं –

+0

ठीक है, एक बार आपके पास एक डिज़ाइन होने के बाद, यह एक और तरीका है, निरंतर प्रश्न दूर जाने की संभावना है। –

1

इस पृष्ठ पर जा रहे किसी भी व्यक्ति के लिए।

यदि आप एकाधिक निरंतर फ़ाइलों को बनाए रखना नहीं चाहते हैं, तो नीचे व्यवस्थित करने का बेहतर तरीका है।

public interface Constants { 
    public static final String CREATE_USER = "createUser"; 
    // Nested Interface. 
    public interface ProjectConstants { 
     public static final String CREATE_PROJECT = "createProject"; 
     public static final String INVALID_SESSION = "Invalid Session"; 
     // As you know they are implicity public static final. 
    } 
}// Accessed as: 
Constants.ProjectConstants.CREATE_PROJECT 
+0

हाँ, हमने इसे शुरू करना शुरू कर दिया है, आपकी प्रतिक्रिया के लिए धन्यवाद –

1

मैं स्थिरांक मैं कुछ साल पहले कि शायद देखा है मदद कर सकता है के लिए एक डिजाइन पैटर्न साझा करना चाहते हैं।

बेसकॉन्स्टेंट फ़ाइल बनाकर प्रारंभ करें। यह आपके सभी वैश्विक स्थिरांक रखेगा कि सभी पैकेज उपयोग कर सकते हैं।

अब आपके ऐप के प्रत्येक उप-पैकेज में एक कॉन्स्टेंट फ़ाइल बनाएं जो केवल उप-पैकेज से संबंधित होगी। तो अगर आपके पास था। लॉगिन नामक एक उप-संग्रह केवल लॉगिन से संबंधित स्थिरांक रखता है। लेकिन कुंजी बेसकॉन्स्टेंट का विस्तार करना है। इस तरह आप आईडीई चयनकर्ता में सभी वैश्विक स्थिरांक देख सकते हैं लेकिन जब आप फ़ाइल खोलते हैं तो आप केवल अपने पैकेज स्थिरांक देखते हैं। कहा जा रहा है कि मुझे लगता है कि निरंतर फाइलें वास्तव में भारी और डुप्लिकेट मान और पढ़ने के लिए कठिन हो सकती हैं।

यहाँ मैं क्या मतलब है ..

public class BaseConstants{ 

public static final String GLOBAL1= "GLOBAL string"; 

public static final String GLOBAL2= "another GLOBAL string"; 
} 

अब आपके सभी अन्य संकुल में इस तरह की एक फ़ाइलों को बनाने: "। MyPackageConstants" जब आप लिखते हैं

class MyPackageConstants extends BaseConstants{ 

public static final String LOCAL1 = "local String" 
public static final String LOCAL2= "ANOTHER LOCAL string"; 
} 
अपने आईडीई में

आपको पूरे आवेदन के लिए सभी स्थिरांक देखना चाहिए।

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