2011-10-18 9 views
6

मुझे अपने एप्लिकेशन में एक आंतरिक स्टोरेज परत मिली है, जो Foo ऑब्जेक्ट्स को संभालती है। संचालन के दौरान, डेटा परत को क्लस्टरिंग के लिए महत्वपूर्ण लाभ होते हैं, लेकिन मैं वास्तव में केवल 10% समय के बारे में कई प्राप्त करता हूं।एक स्टोरेज एपीआई में सिंगुलर बनाम बहुवचन को परिभाषित करने का आदर्श तरीका क्या है?

दृष्टिकोण एक::

interface FooStorage { 
    Foo getFoo(String name); 
    List<Foo> getFoos(List<String> names); 
} 

दृष्टिकोण बी:

interface FooStorage { 
    List<Foo> getFoos(List<String> names); 
} 
class StorageUtility { 
    public static <T> T firstOrNull(List<T> data) { ... } 
} 

दृष्टिकोण सी:

interface FooStorage { 
    List<Foo> getFoos(String... names); 
} 
class StorageUtility { 
    public static <T> T firstOrNull(List<T> data) { ... } 
} 

नकारात्मक पक्ष यह एक दृष्टिकोण करने के लिए हो रही है यहाँ विभिन्न दृष्टिकोण मैं माना जाता है कर रहे हैं एक बड़ी सतह जिसे मुझे समर्थन करने की आवश्यकता है।
दृष्टिकोण बी के नकारात्मक पक्ष में उपभोक्ता एक सूची बना रहा है जब 90% मुझे इसकी आवश्यकता नहीं है। दृष्टिकोण सी के नकारात्मक पक्ष एक सूची को 10% समय में एक सूची में कॉपी करने का ओवरहेड है।

क्या ऐसा करने के लिए कोई वैधानिक सही तरीका है?

उत्तर

1

स्थिति के इस प्रकार में, मैं निम्नलिखित निर्माण के साथ जाना करते हैं:

Foo getFoo(String name) { 
    return firstOrNull(getFoos(name)); 
} 
List<Foo> getFoos(String ... names) { 
    return getFoos(Arrays.asList(names)); 
} 
List<Foo> getFoos(List<String> names) { 
    .... 
} 

आपका ग्राहक सबसे उपयुक्त विधि हर बार का उपयोग करना चाहिए, और यदि आप बाद कि प्रदर्शन की खोज के लिए एक अधिक लक्षित दृष्टिकोण की आवश्यकता है getFoo(name), आप उस एकल विधि को फिर से कार्यान्वित कर सकते हैं।

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

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

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