আমি এই সিদ্ধান্তে পৌঁছেছি যে CreateDataFile
একটি তাত্ক্ষণিক পরিমাপ করে একটি কাজ করছে এবং তারপরে ডেটা সংরক্ষণ করে এবং একই কোড দুটি ব্যবহার করে অন্য কেউ এই কোডটি ব্যবহার করে তারপরে একটি পরিমাপ করে একটি ফাইলকে লিখতে হবে তার জন্য আরও স্বজ্ঞাত পৃথক পদ্ধতি কল হিসাবে।
আমি মনে করি এটি আসলে আপনার সমস্যা। পদ্ধতিটি একটি জিনিস করছে না । এটি দুটি, স্বতন্ত্র অপারেশন সম্পাদন করছে যা বিভিন্ন ডিভাইসে আই / ও জড়িত , উভয়ই এটি অন্য বস্তুর জন্য লোড হচ্ছে:
- একটি পরিমাপ আনুন
- ফলাফলটি কোথাও কোনও ফাইলে সংরক্ষণ করুন
এগুলি দুটি পৃথক আই / ও অপারেশন। উল্লেখযোগ্যভাবে, প্রথমটি কোনওভাবেই ফাইল সিস্টেমকে রূপান্তরিত করে না।
আসলে, আমাদের লক্ষ করা উচিত যে একটি অন্তর্নিহিত মাঝারি পদক্ষেপ রয়েছে:
- একটি পরিমাপ আনুন
- পরিমাপটিকে একটি পরিচিত বিন্যাসে সিরিয়াল করুন
- সিরিয়ালযুক্ত পরিমাপ একটি ফাইলে সংরক্ষণ করুন
আপনার এপিআই এর প্রতিটি আলাদা আলাদাভাবে কোনও না কোনও রূপে সরবরাহ করা উচিত। আপনি কীভাবে জানেন যে একজন কলকারী এটি অন্য কোথাও না সঞ্চয় করে কোনও পরিমাপ নিতে চাইবে না? আপনি কীভাবে জানবেন যে তারা অন্য উত্স থেকে কোনও পরিমাপ পেতে চাইবে না? আপনি কীভাবে জানবেন যে তারা এটি ডিভাইস বাদে অন্য কোথাও সঞ্চয় করতে চাইবে না? অপারেশনগুলি ডিকুয়াল করার যথেষ্ট কারণ রয়েছে। একটি এ বেয়ার সর্বনিম্ন, প্রতিটি পৃথক টুকরা হওয়া উচিত প্রাপ্তিসাধ্য কোন কলারের কাছে। আমার ব্যবহারের ক্ষেত্রে যদি এটির জন্য আবেদন না করা হয় তবে আমাকে কোনও ফাইলটিতে পরিমাপটি লিখতে বাধ্য করা উচিত নয়।
উদাহরণ হিসাবে, আপনি সম্ভবত অপারেশনগুলি পৃথক করতে পারেন।
IMeasurer
পরিমাপ আনার একটি উপায় আছে:
public interface IMeasurer
{
IMeasurement Measure(int someInput);
}
আপনার পরিমাপের ধরণটি সহজ string
বা সাধারণ কোনও কিছু হতে পারে decimal
। আমি এটির জন্য আপনাকে একটি ইন্টারফেস বা ক্লাসের প্রয়োজন বলে জোর দিচ্ছি না, তবে এটি উদাহরণটিকে আরও সাধারণ করে তুলেছে।
IFileAccess
ফাইল সংরক্ষণের জন্য কিছু পদ্ধতি রয়েছে:
interface IFileAccess
{
void SaveFile(string fileContents);
}
তারপরে আপনার একটি পরিমাপকে সিরিয়ালাইজ করার একটি উপায় প্রয়োজন। শ্রেণি বা ইন্টারফেসে কোনও পরিমাপের প্রতিনিধিত্ব করে বা ইউটিলিটি পদ্ধতিতে এটি তৈরি করুন:
interface IMeasurement
{
// As part of the type
string Serialize();
}
// Utility method. Makes more sense if the measurement is not a custom type.
public static string SerializeMeasurement(IMeasurement m)
{
return ...
}
আপনার এই সিরিয়ালাইজেশন অপারেশনটি আলাদা হয়ে গেছে কিনা তা এখনও পরিষ্কার নয়।
এই ধরণের বিচ্ছেদ আপনার এপিআই উন্নত করে। এটা তোলে দেয় আহ্বানকারী সিদ্ধান্ত নেন তারা যা প্রয়োজন এবং যখন, বরং আমি যা ইনপুট / আউটপুট সম্পাদন করতে সম্পর্কে আপনার পূর্বকল্পিত ধারণা অত্যাচার করে। কলকারীদের যেকোন বৈধ অপারেশন করার নিয়ন্ত্রণ থাকা উচিত, আপনি এটি কার্যকর মনে করেন বা না করুক।
আপনার প্রতিটি ক্রিয়াকলাপের জন্য পৃথক বাস্তবায়ন CreateDataFile
হয়ে গেলে , আপনার পদ্ধতিটি কেবল একটি সংক্ষিপ্তরূপে পরিণত হয়
fileAccess.SaveFile(SerializeMeasurement(measurer.Measure()));
উল্লেখযোগ্যভাবে, আপনি একবার এই সমস্ত কাজ করার পরে আপনার পদ্ধতিতে খুব কম মান যুক্ত হয়। উপরোক্ত কোডের লাইনটি আপনার কলকারীদের সরাসরি ব্যবহার করা কঠিন নয় এবং আপনার পদ্ধতিটি বেশিরভাগ ক্ষেত্রে সুবিধার্থে is এটি হওয়া উচিত এবং something চ্ছিক কিছু । এবং এপিআই আচরণ করার সঠিক উপায়।
সমস্ত প্রাসঙ্গিক অংশগুলি একবার প্রমাণিত হয়ে গেলে এবং আমরা স্বীকার করে নিয়েছি যে পদ্ধতিটি কেবল একটি সুবিধার জন্য, আমাদের আপনার প্রশ্নটি পুনরায় মন্তব্য করা দরকার:
আপনার কলকারীদের জন্য সর্বাধিক সাধারণ ব্যবহারের ক্ষেত্রে কী হবে?
যদি পুরো পয়েন্টটি একই বোর্ড থেকে মাপার এবং লেখার জন্য সাধারণ ব্যবহারের ক্ষেত্রে কিছুটা সুবিধাজনক করে তোলা হয় তবে Board
ক্লাসে এটি সরাসরি উপলব্ধ করার জন্য এটি সঠিক ধারণা দেয় :
public class Board : IMeasurer, IFileAccess
{
// Interface methods...
/// <summary>
/// Convenience method to measure and immediate record measurement in
/// default location.
/// </summary>
public void ReadAndSaveMeasurement()
{
this.SaveFile(SerializeMeasurement(this.Measure()));
}
}
এটি যদি সুবিধার উন্নতি না করে তবে আমি পদ্ধতিটি মোটেই বিরক্ত করব না।
এটি একটি সুবিধার পদ্ধতি হ'ল অন্য একটি প্রশ্ন উত্থাপন।
করা উচিত IFileAccess
ইন্টারফেস পরিমাপ প্রকার এবং কিভাবে এটা ধারাবাহিকভাবে সম্পর্কে জানেন? যদি তা হয় তবে আপনি এতে একটি পদ্ধতি যুক্ত করতে পারেন IFileAccess
:
interface IFileAccess
{
void SaveFile(string fileContents);
void SaveMeasurement(IMeasurement m);
}
কলকারীরা এখন এটি করেন:
fileAccess.SaveFile(measurer.Measure());
যা আপনার সুবিধার পদ্ধতির তুলনায় ঠিক যেমন সংক্ষিপ্ত এবং সম্ভবত আরও স্পষ্ট প্রশ্ন হিসাবে ধারণা করা হয়েছে।