मैं आमतौर पर वर्ग को जानता हूं कि कुछ कारणों से, खुद को कैसे क्रमबद्ध करना है। सबसे पहले, यदि आप (डी) एक अलग प्रारूप से / से अनुक्रमित करना चाहते हैं, तो आपको अब उस अतिरिक्त तर्क के साथ मॉडल को प्रदूषित करने की आवश्यकता है। यदि मॉडल को इंटरफ़ेस के माध्यम से एक्सेस किया जाता है, तो आप अनुबंध को भी प्रदूषित करते हैं।
public class Image
{
public void toJPG(String filePath) { ... }
public Image fromJPG(String filePath) { ... }
}
लेकिन क्या होगा यदि आप इसे / पीएनजी से, और जीआईएफ से क्रमबद्ध करना चाहते हैं? अब क्लास बन गया
public class Image
{
public void toJPG(String filePath) { ... }
public Image fromJPG(String filePath) { ... }
public void toPNG(String filePath) { ... }
public Image fromPNG(String filePath) { ... }
public void toGIF(String filePath) { ... }
public Image fromGIF(String filePath) { ... }
}
इसके बजाय, मैं आमतौर पर निम्नलिखित के समान एक पैटर्न का उपयोग करना पसंद करता हूं:
public interface ImageSerializer
{
void serialize(Image src, Stream outputStream);
Image deserialize(Stream inputStream);
}
public class JPGImageSerializer : ImageSerializer
{
public void serialize(Image src, Stream outputStream) { ... }
public Image deserialize(Stream inputStream) { ... }
}
public class PNGImageSerializer : ImageSerializer
{
public void serialize(Image src, Stream outputStream) { ... }
public Image deserialize(Stream inputStream) { ... }
}
public class GIFImageSerializer : ImageSerializer
{
public void serialize(Image src, Stream outputStream) { ... }
public Image deserialize(Stream inputStream) { ... }
}
अब, इस बिंदु पर, इस डिजाइन के साथ एक चेतावनी यह है कि धारावाहिकों identity
को उस वस्तु के बारे में जानना होगा जो इसे क्रमबद्ध कर रही है। कुछ कहेंगे कि यह खराब डिजाइन है, क्योंकि कार्यान्वयन कक्षा के बाहर लीक हो गया है। इसका जोखिम / इनाम वास्तव में आपके ऊपर है, लेकिन आप कुछ ऐसा करने के लिए कक्षाओं को थोड़ा मोड़ सकते हैं
public class Image
{
public void serializeTo(ImageSerializer serializer, Stream outputStream)
{
serializer.serialize(this.pixelData, outputStream);
}
public void deserializeFrom(ImageSerializer serializer, Stream inputStream)
{
this.pixelData = serializer.deserialize(inputStream);
}
}
यह एक सामान्य उदाहरण से अधिक है, क्योंकि आमतौर पर छवियों में मेटाडेटा होता है जो इसके साथ जाता है; सम्पीडन स्तर, रंग स्थान आदि जैसी चीजें जो प्रक्रिया को जटिल बना सकती हैं।