क्या एक छवि को ओओपी में खुद को आकार देने में सक्षम होना चाहिए?


9

मैं एक ऐप लिख रहा हूं जिसमें एक Imageइकाई होगी , और मुझे पहले से ही यह तय करने में परेशानी हो रही है कि प्रत्येक कार्य की जिम्मेदारी किसकी होनी चाहिए।

पहले मेरे पास Imageक्लास है। इसमें एक पथ, चौड़ाई और अन्य विशेषताएँ हैं।

तब मैंने ImageRepositoryएक एकल और परीक्षण विधि के साथ छवियों को पुनः प्राप्त करने के लिए एक वर्ग बनाया , जैसे findAllImagesWithoutThumbnail():।

लेकिन अब मुझे भी सक्षम होना चाहिए createThumbnail()। किससे निपटना चाहिए? मैं एक ImageManagerक्लास होने के बारे में सोच रहा था , जो कि एक ऐप-स्पेसिफिक क्लास होगी (इसमें थर्ड पार्टी इमेज में हेरफेर भी होगा जो पसंद का रियूजेबल कंपोनेंट होगा, मैं व्हील रीइन्वेंट नहीं कर रहा हूं)।

या शायद Imageखुद को आकार देने के लिए यह 0K होगा ? या जाने ImageRepositoryऔर ImageManagerएक ही कक्षा हो सकता है?

तुम क्या सोचते हो?


छवि अब तक क्या करती है?
विंस्टन एवर्ट

आप छवियों का आकार बदलने की उम्मीद कैसे करते हैं? क्या आप कभी केवल सिकुड़ती हुई छवियां हैं या क्या आप पूर्ण आकार में वापस जाने की कल्पना कर सकते हैं?
रोबोट

@InstonEwert यह स्वरूपित रिज़ॉल्यूशन (जैसे: स्ट्रिंग '1440x900'), विभिन्न URLs जैसे डेटा उत्पन्न करता है, और आपको कुछ आँकड़े जैसे 'विचार' या 'वोट' संशोधित करने देता है।
चोकोडेवेलपर

@StevenBurnap मैं मूल छवि को सबसे महत्वपूर्ण चीज मानता हूं, मैं केवल तेज ब्राउज़िंग के लिए थंबनेल का उपयोग करता हूं या यदि उपयोगकर्ता अपने डेस्कटॉप या किसी चीज को फिट करने के लिए आकार बदलना चाहता है, तो वे एक अलग चीज हैं।
चोकोडेवेलर

मैं छवि वर्ग को अपरिवर्तनीय बनाऊंगा ताकि जब आप इसे चारों ओर से गुजारें तो आपको इसे रक्षात्मक रूप से कॉपी न करना पड़े।
dan_waterworth

जवाबों:


8

जैसा कि पूछा गया है सवाल वास्तविक जवाब देने के लिए बहुत अस्पष्ट है क्योंकि यह वास्तव में इस बात पर निर्भर करता है कि Imageवस्तुओं का उपयोग कैसे किया जा रहा है।

यदि आप केवल एक आकार में छवि का उपयोग कर रहे हैं, और आकार बदल रहे हैं क्योंकि स्रोत छवि गलत आकार है, तो यह हो सकता है कि रीडिंग कोड का आकार परिवर्तन करना सबसे अच्छा हो। क्या आपकी createImageविधि एक चौड़ाई / ऊँचाई लेती है और फिर उस चौड़ाई / ऊँचाई पर आकार बदलने वाली छवि लौटाती है।

यदि आपको कई आकारों की आवश्यकता है, और यदि स्मृति चिंता का विषय नहीं है, तो छवि को स्मृति में रखना सबसे अच्छा है क्योंकि मूल रूप से पढ़ा जाता है और प्रदर्शन समय के अनुसार किसी भी आकार का होता है। ऐसे मामले में, कुछ अलग-अलग डिज़ाइन हैं जो आप उपयोग कर सकते हैं। छवि widthऔर heightतय हो जाएगी, लेकिन आपके पास एक ऐसी displayविधि होगी जो एक स्थिति और एक लक्ष्य ऊंचाई / चौड़ाई लेती है या आपके पास एक चौड़ाई / ऊँचाई लेने वाली कुछ विधि होगी जो एक वस्तु लौटाती है जो भी प्रदर्शन प्रणाली आप उपयोग कर रहे हैं। अधिकांश ड्राइंग एपीआई जिनका मैंने उपयोग किया है, आपको ड्रॉ के समय लक्ष्य आकार निर्दिष्ट करने देते हैं।

अगर प्रदर्शन के लिए आवश्यकताएं विभिन्न आकारों में अक्सर एक चिंता का विषय होती हैं, तो आपके पास एक ऐसा तरीका हो सकता है जो मूल के आधार पर एक अलग आकार की एक नई छवि बनाता है। एक विकल्प यह होगा कि आपके Imageवर्ग का कैश अलग-अलग अभ्यावेदन हो, ताकि पहली बार जब आप displayथम्बनेल साइज के साथ कॉल करें तो यह आकार बदलता है जबकि दूसरी बार यह कैश्ड कॉपी को खींचता है जो पिछली बार से बचाई गई थी। यह अधिक मेमोरी का उपयोग करता है, लेकिन यह दुर्लभ है कि आपके पास कुछ सामान्य रीज़निंग से अधिक होगा।

एक अन्य विकल्प एक एकल Imageवर्ग का होना है जो आधार छवि को बनाए रखता है और उस वर्ग में एक या अधिक प्रतिनिधित्व होते हैं। एक Imageअपने आप में एक ऊंचाई / चौड़ाई नहीं होगा। इसके बजाय, यह एक के साथ शुरू होगा ImageRepresentationजिसकी ऊंचाई और चौड़ाई थी। आप इस प्रतिनिधित्व को आकर्षित करेंगे। एक छवि को "आकार" देने के लिए, आप Imageकुछ ऊंचाई / चौड़ाई के मैट्रिक्स के साथ प्रतिनिधित्व के लिए कहेंगे । यह तब इस नए प्रतिनिधित्व के साथ-साथ मूल को शामिल करेगा। यह आपको वास्तव में अतिरिक्त जटिलता की कीमत पर स्मृति में घूमने वाले नियंत्रण पर बहुत नियंत्रण देता है।

मैं व्यक्तिगत रूप से उन कक्षाओं को नापसंद करता हूं जिनमें शब्द शामिल हैं Managerक्योंकि "प्रबंधक" एक बहुत अस्पष्ट शब्द है जो वास्तव में आपको क्लास के बारे में वास्तव में बहुत कुछ नहीं बताता है। क्या यह वस्तु जीवनकाल का प्रबंधन करता है? क्या यह आवेदन के बाकी हिस्सों और इसे प्रबंधित करने वाली चीज़ों के बीच खड़ा है?


"यह वास्तव में इस बात पर निर्भर करता है कि छवि वस्तुओं का उपयोग कैसे किया जा रहा है।" यह कथन वास्तव में एनकैप्सुलेशन और ढीले युग्मन की धारणा के अनुरूप नहीं है (हालांकि यह इस मामले में सिद्धांत को बहुत दूर ले जा सकता है)। भेदभाव का एक बेहतर बिंदु यह होगा कि क्या छवि की स्थिति सार्थक रूप से आकार में शामिल है या नहीं।
क्रिस बाय

लगता है कि आप एक छवि संपादन आवेदन बिंदु के बारे में बात कर रहे हैं। पूरी तरह से स्पष्ट नहीं है कि क्या ओपी ऐसा चाहता था या नहीं?
-हो

6

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

class Image
{
    public Image createThumbnail(int sizeX, int sizeY)
    {
         // ...
         // later delegate the actual resize operation to a separate component
    }
}

जब आप अधिक मापदंडों को पारित करने की आवश्यकता होती है, तो चीजें अलग हो सकती हैं createThumbnail(), और उन मापदंडों को अपने स्वयं के जीवनकाल की आवश्यकता होती है। उदाहरण के लिए, मान लें कि आप कई सौ छवियों के लिए थंबनेल बनाने जा रहे हैं, सभी कुछ दिए गए गंतव्य आकार, एल्गोरिथ्म या गुणवत्ता का आकार बदल सकते हैं। इसका मतलब यह होगा कि आप createThumbnailकिसी अन्य वर्ग में जा सकते हैं, उदाहरण के लिए, एक प्रबंधक वर्ग, या एक ImageResizerवर्ग, जहां उन मापदंडों को कंस्ट्रक्टर द्वारा पारित किया जाता है और इसलिए वे ImageResizerऑब्जेक्ट के जीवनकाल के लिए बाध्य होते हैं ।

वास्तव में, मैं पहले दृष्टिकोण और बाद में रिफ्लेक्टर के साथ शुरू करूंगा जब मुझे वास्तव में इसकी आवश्यकता होगी।


ठीक है, अगर मैं पहले से ही एक अलग घटक को कॉल सौंप रहा हूं तो इसे ImageResizerपहली जगह में कक्षा की जिम्मेदारी क्यों नहीं बनायें? जब आप एक नई कक्षा में जिम्मेदारी को स्थानांतरित करने के बजाय कॉल करते हैं?
सांगो

2
@Songo: 2 संभावित कारण: (1) को सौंपने के लिए कोड - शायद पहले से मौजूद - अलग घटक केवल एक साधारण एक-लाइनर नहीं है, शायद सिर्फ 4 से 6 कमांड का एक क्रम है, इस प्रकार आपको इसे स्टोर करने के लिए जगह की आवश्यकता है । (2) सिंथेटिक चीनी / उपयोग में आसानी: यह लिखना बहुत ही सुंदर होगा Image thumbnail = img.createThumbnail(x,y)
Doc Brown

+1 आह मैं देख रहा हूँ। स्पष्टीकरण के लिए धन्यवाद :)
सांगो

4

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

एक तरीका यह हो सकता है कि आपका Imageकंस्ट्रक्टर छवि युक्त संसाधन ले ले, और ऊँचाई और चौड़ाई मापदण्डों के अनुरूप हो और खुद को उचित रूप से बनाए। तब आकार बदलना उतना ही सरल हो सकता है जितना कि मूल संसाधन (छवि के अंदर कैश्ड) और नए आकार के मापदंडों का उपयोग करके एक नया ऑब्जेक्ट बनाना। जैसे foo.createThumbnail()कि बस return new Image(this.source, 250, 250)। ( निश्चित रूप Imageसे foo, ठोस प्रकार होने के साथ )। यह आपकी छवियों को अपरिवर्तनीय और उनके कार्यान्वयन को निजी रखता है।


मुझे यह समाधान पसंद है, लेकिन मुझे समझ में नहीं आता है कि आप क्यों कहते हैं कि पुनर्विक्रेता को आंतरिक कार्यान्वयन को जानना होगा Image। इसके लिए आवश्यक सभी स्रोत और लक्ष्य आयाम हैं।
चोकोडेवेलपर

जबकि मुझे लगता है कि बाहरी वर्ग के होने का कोई मतलब नहीं है क्योंकि यह अप्रत्याशित होगा, इसे न तो इनकैप्सुलेशन का उल्लंघन करना होगा और न ही इसे रिसाइज करते समय स्विच () स्टेटमेंट की आवश्यकता होगी। अंततः एक छवि किसी चीज़ का 2d सरणी है, और आप निश्चित रूप से छवियों का आकार बदल सकते हैं जब तक कि इंटरफ़ेस व्यक्तिगत पिक्सेल प्राप्त करने और सेट करने की अनुमति देता है।
whatsisname

4

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

एक थंबनेल वास्तव में एक अलग छवि है। शायद आपके पास एक डेटास्ट्रेक्चर हो सकता है जो एक फोटोग्राफ के बीच संबंध रखता है और यह थंबनेल (दोनों की छवियां हैं)।

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

इसलिए, नहीं, एक छवि में तर्क नहीं होना चाहिए कि कैसे एक थंबनेल बनाने के लिए। एक ThumbnailGenerator सेवा होनी चाहिए जिसमें एक विधि हो जैसे:

Image GenerateThumbnailFrom(Image someImage);

मेरी बड़ी डेटा संरचना इस तरह दिख सकती है:

class Photograph : Image
{
    public Photograph(Image thumbnail)
    {
        if(thumbnail == null) throw new ArgumentNullException("thumbnail");
        this.Thumbnail = thumbnail;
    }

    public Image Thumbnail { get; private set; }
}

निश्चित रूप से इसका मतलब यह हो सकता है कि आप प्रयास कर रहे हैं कि आप ऑब्जेक्ट का निर्माण करते समय ऐसा नहीं करना चाहते हैं, इसलिए मैं कुछ इस तरह से भी ठीक पर विचार करूंगा:

class Photograph : Image
{
    private Image thumbnail = null;
    private readonly Func<Image,Image> generateThumbnail;

    public Photograph(Func<Image,Image> generateThumbnail)
    {
        this.generateThumbnail = generateThumbnail;
    }


    public Image Thumbnail
    {
        get
        {
            if(this.thumbnail == null)
            {
                this.thumbnail = this.generateThumbnail(this);
            }
            return this.thumbnail;
        }
    }
}

... उस मामले में जहां आप आलसी मूल्यांकन के साथ एक डेटा संरचना चाहते हैं। (क्षमा करें, मैंने अपनी अशक्त जाँचों को शामिल नहीं किया है और मैंने इसे थ्रेड-सेफ नहीं बनाया है, जो आप चाहते हैं कि यदि आप एक अपरिवर्तनीय डेटा संरचना की नकल करना चाहते हैं)।

जैसा कि आप देख सकते हैं, इनमें से किसी भी वर्ग का निर्माण किसी तरह के PhotographRepository द्वारा किया जा रहा है, जिसमें संभवतः ThumbnailGenerator का संदर्भ है जो इसे निर्भरता इंजेक्शन के माध्यम से मिला है।


मुझे बताया गया है कि मुझे कोई व्यवहार नहीं करना चाहिए। निश्चित नहीं है कि जब आप 'डेटा स्ट्रक्चर्स' कहते हैं, तो आप कक्षाओं या C ++ से कुछ का जिक्र कर रहे हैं (क्या यह है?)। केवल डेटा संरचनाएं जो मैं जानता हूं और उपयोग कर रहा हूं वह है आदिम। सेवाओं और डि भाग पर हाजिर है, मैं यह कर सकता है।
चोकोडेवेलपर

@ChocoDeveloper: कभी-कभी बिना व्यवहार वाले वर्ग उपयोगी या आवश्यक होते हैं, जो स्थिति पर निर्भर करते हैं। जिन्हें मूल्य वर्ग कहा जाता है । सामान्य ओओपी कक्षाएं कठोर-कोडित व्यवहार वाली कक्षाएं हैं। कंपोजिट ओओपी वर्गों में भी कठोर-कोडित व्यवहार होता है, लेकिन उनकी संरचना की संरचना एक सॉफ्टवेयर एप्लिकेशन द्वारा आवश्यक कई व्यवहारों को जन्म दे सकती है।
रोंगोंग

3

आपने एक एकल कार्यक्षमता की पहचान की है जिसे आप लागू करना चाहते हैं, इसलिए इसे अब तक आपके द्वारा पहचानी गई हर चीज से अलग क्यों नहीं होना चाहिए? यही कारण है कि है एकल जिम्मेदारी सिद्धांत सुझाव है कि समाधान है।

एक IImageResizerइंटरफ़ेस बनाएं जो आपको एक छवि और लक्ष्य आकार में पारित करने की अनुमति देता है, और जो एक नई छवि देता है। फिर उस इंटरफ़ेस का कार्यान्वयन बनाएं। छवियों को आकार देने के लिए वास्तव में बहुत सारे तरीके हैं, इसलिए आप एक से अधिक के साथ समाप्त हो सकते हैं!


प्रासंगिक एसआरपी के लिए +1, लेकिन मैं वास्तविक आकार परिवर्तन को लागू नहीं कर रहा हूं, यह पहले से ही तीसरे पक्ष के पुस्तकालय को कहा गया है।
चोकोडेवेलपर

3

मैं उन तथ्यों को विधि के बारे में मानता हूं, जो छवियों का आकार देते हैं:

  • उसे छवि की नई प्रति लौटानी होगी। आप स्वयं छवि को संशोधित नहीं कर सकते, क्योंकि यह अन्य कोड को तोड़ देगा जिसमें इस छवि का संदर्भ है।
  • यह छवि वर्ग के आंतरिक डेटा तक पहुँच की आवश्यकता नहीं है। छवि वर्गों को आमतौर पर उन डेटा (या कॉपी) के सार्वजनिक उपयोग की पेशकश करने की आवश्यकता होती है।
  • इमेज का आकार बदलना जटिल है और इसके लिए कई अलग-अलग मापदंडों की आवश्यकता होती है। शायद अलग-अलग आकार के एल्गोरिदम के लिए भी एक्स्टेंसिबिलिटी अंक। सब कुछ पास करने के परिणामस्वरूप बड़ी विधि हस्ताक्षर होंगे।

उन तथ्यों के आधार पर, मैं कहूंगा कि छवि के आकार बदलने की विधि का कोई कारण नहीं है छवि वर्ग का ही हिस्सा है। इसे कक्षा के स्थिर सहायक विधि के रूप में लागू करना सबसे अच्छा होगा।


अच्छी धारणाएँ। यह सुनिश्चित नहीं है कि यह एक स्थिर तरीका क्यों होना चाहिए, हालांकि, मैं परीक्षण क्षमता के लिए उनसे बचने की कोशिश करता हूं।
चोकोडेवेलपर

2

एक इमेज प्रोसेसिंग क्लास उपयुक्त हो सकती है (या इमेज मैनेजर, जैसा कि आपने इसे कहा है)। अपनी छवि को इमेज प्रोसेसर के CreateThumbnail तरीके से पास करें, उदाहरण के लिए, थंबनेल छवि को पुनः प्राप्त करने के लिए।

मेरे द्वारा इस मार्ग को सुझाने के कारणों में से एक यह है कि आप कहते हैं कि आप तृतीय पक्ष छवि प्रसंस्करण लाइब्रेरी का उपयोग कर रहे हैं। इमेज क्लास से रिसाइज़िंग फंक्शनलिटी लेना ही आपके लिए किसी भी प्लेटफ़ॉर्म विशिष्ट या 3rd पार्टी कोड को अलग करना आसान बना सकता है। इसलिए यदि आप सभी प्लेटफार्मों / ऐप्स पर अपने आधार छवि वर्ग का उपयोग कर सकते हैं, तो आपको न ही इसे प्लेटफ़ॉर्म या लाइब्रेरी विशिष्ट कोड के साथ प्रदूषित करना होगा। वह सब इमेज प्रोसेसर में स्थित हो सकता है।


अच्छी बात। यहाँ ज्यादातर लोगों को समझ नहीं आया कि मैं पहले से ही एक 3 पार्टी लाइब्रेरी के लिए सबसे जटिल हिस्सा सौंप रहा हूँ, शायद मैं पर्याप्त स्पष्ट नहीं था।
चोकोडेवेलर

2

मूल रूप से डॉक्टर ब्राउन ने पहले ही कहा था:

getAsThumbnail()छवि वर्ग के लिए एक विधि बनाएँ , लेकिन इस विधि को वास्तव में कुछ ImageUtilsवर्ग के लिए काम सौंपना चाहिए । तो यह कुछ इस तरह दिखेगा:

 class Image{
   // ...
   public Thumbnail getAsThumbnail{
     return ImageUtils.convertToThumbnail(this);
   }
   // ...
 }

तथा

 class ImageUtils{
   // ...
   public static Thumbnail convertToThumbnail(Image i){
     // ...
   }
   // ...
 }

यह आसान-से-दिखने वाले कोड की अनुमति देगा। निम्नलिखित की तुलना करें:

Image i = ...
someComponent.setThumbnail(i.getAsThumbnail());

या

Image i = ...
Thumbnail t = ImageUtils.convertToThumbnail(i);
someComponent.setThumbnail(t); 

यदि बाद वाला आपके लिए अच्छा लगता है, तो आप कहीं न कहीं इस सहायक विधि को बनाने के लिए भी चिपके रह सकते हैं।


1

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

अब छवि के थंबनेल, अवतार, आदि संस्करण पूरी तरह से एक अन्य डोमेन है, जो किसी उपयोगकर्ता को देने के लिए एक निश्चित छवि के विभिन्न संस्करणों के लिए छवि डोमेन पूछ सकता है। आमतौर पर यह डोमेन इतना विशाल या सामान्य नहीं होता है, इसलिए आप इसे संभवतः एप्लिकेशन लॉजिक में रख सकते हैं।

एक छोटे पैमाने पर ऐप में, मैं समय पर छवियों का आकार बदल दूंगा। उदाहरण के लिए, मेरे पास एक अपाचे पुनर्लेखन नियम हो सकता है जो किसी स्क्रिप्ट को php करने के लिए दर्शाता है यदि छवि 'http://my.site.com/images/thumbnails/image1.png' है, जहां फ़ाइल को नाम 1 का उपयोग करके पुनर्प्राप्त किया जाएगा। png और आकार और 'थंबनेल / image1.png' में संग्रहीत। फिर इसी छवि के अगले अनुरोध पर, अपाचे php स्क्रिप्ट को चलाने के बिना सीधे छवि की सेवा करेगा। जब तक आपको आंकड़े करने की आवश्यकता नहीं होती है, तब तक आपके प्रश्न aAllImagesWithoutThumbnails स्वचालित रूप से अपाचे द्वारा उत्तर दिया जाता है।

बड़े पैमाने पर ऐप में, मैं सभी नई छवियों को एक पृष्ठभूमि नौकरी में भेजूंगा, जो छवि के विभिन्न संस्करणों को बनाने का ध्यान रखता है और इसे उपयुक्त स्थानों में बचाता है। मैं एक संपूर्ण डोमेन या वर्ग बनाने की जहमत नहीं उठाऊंगा क्योंकि यह डोमेन स्पैगेटी और खराब सॉस की भयानक गड़बड़ी में बढ़ने की संभावना नहीं है।


0

संक्षिप्त जवाब:

मेरा पुनर्संयोजन इस पद्धति को छवि वर्ग जोड़ रहा है:

public Image getResizedVersion(int width, int height);
public Image getResizedVersion(double percentage);

छवि ऑब्जेक्ट अभी भी अप्राप्य है, ये विधियाँ एक नई छवि लौटाती हैं।


0

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

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

तो दो विकल्प हैं। पहले एक, एक विधि का निर्माण Image::createThumbnail(), पहले से ही माना जाता है। दूसरा ResizedImageवर्ग बनाना है । यह एक का डेकोरेटर हो सकता है Image(यह आपके डोमेन पर निर्भर करता है कि किसी Imageइंटरफ़ेस को संरक्षित करना है या नहीं), हालांकि इसके परिणामस्वरूप कुछ एनकैप्सुलेशन समस्याएँ होती हैं, क्योंकि ResizedImageइसका Imageस्रोत होना आवश्यक है। लेकिन Imageविवरणों को आकार देने से अलग नहीं होगा, इसे एक अलग डोमेन ऑब्जेक्ट पर छोड़ दिया जाता है, जो एसआरपी के अनुसार कार्य करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.