কোনও ক্লাস ডিজাইনের সময় আচরণে ধারাবাহিকতা থাকা উচিত সাধারণ প্রোগ্রামিং অনুশীলনের চেয়ে? একটি নির্দিষ্ট উদাহরণ দিতে:
একটি সাধারণ কনভেনশনটি হ'ল: কোনও শ্রেণি যদি কোনও জিনিসের মালিক হয় (উদাহরণস্বরূপ এটি এটি তৈরি করেছে) এটি সম্পন্ন হওয়ার পরে এটি পরিষ্কার করার দায়বদ্ধ। একটি নির্দিষ্ট উদাহরণ। নেট এ থাকবে যে আপনার শ্রেণি যদি কোনও IDisposable
বস্তুর মালিক হয় তবে এটি জীবনের শেষদিকে এটিকে নিষ্পত্তি করা উচিত। এবং আপনি যদি এটির মালিক না হন তবে এটি স্পর্শ করবেন না।
এখন আমরা StreamWriter
NET এর ক্লাসটি যদি দেখি তবে ডকুমেন্টেশনে আমরা জানতে পারি যে এটি বন্ধ / নিষ্পত্তি হওয়ার সময় অন্তর্নিহিত স্ট্রিমটি বন্ধ করে দেয়। StreamWriter
লেখক অন্তর্নিহিত ফাইল স্ট্রিম তৈরি করে এবং সেইজন্য এটি বন্ধ করতে হবে এমন ক্ষেত্রে ফাইলের নাম দিয়ে তা ইনস্ট্যান্ট করা হয় এমন ক্ষেত্রে এটি প্রয়োজনীয়। তবে একজন বাহ্যিক প্রবাহেও যেতে পারে যা লেখকও বন্ধ করে দেয়।
এটি আমাকে প্রচুর বিরক্ত করেছে (হ্যাঁ আমি জানি আপনি একটি নন-ক্লোজিং মোড়ক তৈরি করতে পারেন তবে এটি কোনও মুল বিষয় নয়) তবে স্পষ্টতই মাইক্রোসফ্ট সিদ্ধান্ত নিয়েছে যে সে যেদিকেই আসে না কেন প্রবাহটি সর্বদা বন্ধ করা আরও সুসংগত।
আমি যখন আমার ক্লাসের কোনওটিতে এই জাতীয় প্যাটার্নটি পাই তখন আমি সাধারণত একটি ownsFooBar
পতাকা তৈরি করি যা FooBar
কনস্ট্রাক্টরের মাধ্যমে ইনজেকশনের ক্ষেত্রে ক্ষেত্রে মিথ্যাতে সেট হয়ে যায় এবং অন্যথায় সত্য হয়। এইভাবে পরিষ্কার করার দায়িত্ব কলারের কাছে অর্পণ করা হয় যখন তিনি স্পষ্টভাবে উদাহরণটি পাস করেন।
এখন আমি ভাবছি যে সম্ভবত ধারাবাহিকতা সেরা অনুশীলনের পক্ষে হওয়া উচিত (অথবা আমার সেরা অনুশীলনটি কি ভাল নয়)? এর পক্ষে / বিরুদ্ধে কোন যুক্তি?
স্পষ্টতার জন্য সম্পাদনা করুন
"ধারাবাহিকতা" দিয়ে আমি বলতে চাইছি: শ্রেণীর ধারাবাহিক আচরণ সর্বদা মালিকানা গ্রহণ করে (এবং স্ট্রিম বন্ধ করে) বনাম "সেরা অনুশীলন" কেবল কোনও বস্তুর মালিকানা নিতে যদি আপনি এটি তৈরি করেন বা স্পষ্টভাবে মালিকানা হস্তান্তর করেন।
উদাহরণস্বরূপ যেখানে এটি বিরক্তিকর:
ধরুন আপনার কাছে দুটি প্রদত্ত শ্রেণি রয়েছে (কিছু তৃতীয় পক্ষের গ্রন্থাগার থেকে) যা কিছু স্ট্রিমকে কিছু করার জন্য গ্রহণ করে যেমন কিছু ডেটা তৈরি এবং প্রক্রিয়াজাতকরণ:
public class DataProcessor
{
public Result ProcessData(Stream input)
{
using (var reader = new StreamReader(input))
{
...
}
}
}
public class DataSource
{
public void GetData(Stream output)
{
using (var writer = new StreamWriter(output))
{
....
}
}
}
এখন আমি এটি এর মতো ব্যবহার করতে চাই:
Result ProcessSomething(DataSource source)
{
var processor = new DataProcessor();
...
var ms = new MemoryStream();
source.GetData(ms);
return processor.ProcessData(ms);
}
এটি Cannot access a closed stream
ডেটা প্রসেসরের ব্যতিক্রম সহ ব্যর্থ হবে । এটি কিছুটা নির্মান করা হয়েছে তবে পয়েন্টটি ব্যাখ্যা করা উচিত। এটি ঠিক করার বিভিন্ন উপায় রয়েছে তবে তবুও আমি অনুভব করি যে আমার এমন কিছু করা উচিত নয় যা আমার করা উচিত নয় work