সি # - ওভারকিলের মতো কোনও হত্যা নেই
সবার আগে, প্রিয় GiMmEtHaCoDeZ, আসুন আপনার কাজটি ভেঙে ফেলার চেষ্টা করুন:
- নম্বর পড়ুন
- তাদের বাছাই করুন
- বাছাই করা সংখ্যাগুলিকে আউটপুট দিন।
সফ্টওয়্যার সমস্যার সাথে কাজ করার সময় "ডিভাইড অ্যান্ড বিজয়" যেমনটি খুব গুরুত্বপূর্ণ কৌশল, তাই একবারে তাদের সাথে সামলাতে দাও
1. পড়া
সফ্টওয়্যারটির আরেকটি গুরুত্বপূর্ণ বিষয় হ'ল বহুমুখিতা। যেহেতু এটি নির্দিষ্ট করা হয়নি যে ব্যবহারকারী কীভাবে সংখ্যাগুলি ইনপুট করবেন, এটি কনসোলের মাধ্যমে, কোনও ফাইলের মাধ্যমে, কোনও ওয়েব পরিষেবা ইত্যাদির মাধ্যমে ঘটতে পারে Maybe সুতরাং, এটি গুরুত্বপূর্ণ যে আমাদের সমাধানটি বিভিন্ন ধরণের ইনপুট সমন্বিত করতে সক্ষম হবে। এটি অর্জনের সবচেয়ে সহজ উপায় হ'ল গুরুত্বপূর্ণ অংশটি একটি ইন্টারফেসে বের করা, আসুন বলি
public interface IDoubleArrayReader
{
IEnumerable<double> GetDoubles();
DoubleArrayReaderType Type {get;}
}
যেখানে DoubleArrayReaderType
একটি গণনা দেওয়া হয়
public enum DoubleArrayReaderType
{
Console,
File,
Database,
Internet,
Cloud,
MockService
}
সফ্টওয়্যারটিকে গ্রাউন্ড আপ থেকে টেস্টযোগ্য করে তোলাও গুরুত্বপূর্ণ, সুতরাং ইন্টারফেসের একটি বাস্তবায়ন হবে
public class MockServiceDoubleArrayReader : IDoubleArrayReader
{
IEnumerable<double> IDoubleArrayReader.GetDoubles()
{
Random r = new Random();
for(int i =0; i<=10; i++)
{
yield return r.NextDouble();
}
}
DoubleArrayReaderType IDoubleArrayReader.Type
{
get
{
return DoubleArrayReaderType.MockService;
}
}
}
এর পরে, যৌক্তিক প্রশ্ন হ'ল আমরা কীভাবে উপযুক্ত কোডটিতে লোড করতে জানব IDoubleArrayReader
। যতক্ষণ আমরা একটি সাধারণ কারখানা ব্যবহার করি ততক্ষণ তা সহজ:
public static class DoubleArrayInputOutputFactory
{
private static Dictionary<DoubleArrayReaderType, IDoubleArrayReader> readers;
static DoubleArrayInputOutputFactory()
{
readers = new Dictionary<DoubleArrayReaderType, IDoubleArrayReader>();
foreach (Type type in Assembly.GetExecutingAssembly().GetTypes())
{
try
{
var instance = Activator.CreateInstance(type);
if (instance is IDoubleArrayReader)
{
readers.Add((instance as IDoubleArrayReader).Type,
(instance as IDoubleArrayReader));
}
}
catch
{
continue;
}
}
}
public static IDoubleArrayReader CreateDoubleArrayReader(DoubleArrayReaderType type)
{
return readers[type];
}
}
মনে রাখবেন যে, আমরা সমস্ত সক্রিয় পাঠকদের লোড করতে প্রতিবিম্বটি ব্যবহার করি, সুতরাং ভবিষ্যতের যে কোনও এক্সটেনশান এখন স্বয়ংক্রিয়ভাবে পাওয়া যাবে, এখন কেবলমাত্র আউট কোডের মূল অংশে:
IDoubleArrayReader reader = DoubleArrayInputOutputFactory
.CreateDoubleArrayReader(DoubleArrayReaderType.MockService);
var doubles = reader.GetDoubles();
2. প্রক্রিয়াজাতকরণ (বাছাই করা)
এখন আমাদের প্রক্রিয়া করা দরকার, অর্থাৎ আমরা যে সংখ্যা অর্জন করেছি তা বাছাই করা উচিত। নোট করুন যে পদক্ষেপগুলি একে অপরের থেকে সম্পূর্ণ স্বতন্ত্র, সুতরাং বাছাই করা সাবসিস্টেমের ক্ষেত্রে, সংখ্যাগুলি কীভাবে ইনপুট করা হয়েছিল তা বিবেচ্য নয়। অতিরিক্তভাবে, বাছাইয়ের আচরণটিও এমন কিছু যা পরিবর্তনের সাপেক্ষে, উদাহরণস্বরূপ আমাদের জায়গায় আরও দক্ষ দক্ষ বাছাইকরণ অ্যালগরিদমকে ইনপুট দেওয়ার প্রয়োজন হতে পারে। সুতরাং, স্বাভাবিকভাবেই, আমরা একটি ইন্টারফেসে অনুরোধ প্রক্রিয়াকরণ আচরণটি বের করব:
public interface IDoubleArrayProcessor
{
IEnumerable<double> ProcessDoubles(IEnumerable<double> input);
DoubleArrayProcessorType Type {get;}
}
public enum DoubleArrayProcessorType
{
Sorter,
Doubler,
Tripler,
Quadrupler,
Squarer
}
এবং বাছাইয়ের আচরণটি কেবল ইন্টারফেসটি প্রয়োগ করবে:
public class SorterDoubleArrayProcessor : IDoubleArrayProcessor
{
IEnumerable<double> IDoubleArrayProcessor.ProcessDoubles(IEnumerable<double> input)
{
var output = input.ToArray();
Array.Sort(output);
return output;
}
DoubleArrayProcessorType IDoubleArrayProcessor.Type
{
get
{
return DoubleArrayProcessorType.Sorter;
}
}
}
অবশ্যই, প্রসেসিংয়ের উদাহরণগুলি লোড এবং পরিচালনা করার জন্য আমাদের একটি কারখানার প্রয়োজন হবে।
public static class DoubleArrayProcessorFactory
{
private static Dictionary<DoubleArrayProcessorType, IDoubleArrayProcessor> processors;
static DoubleArrayProcessorFactory()
{
processors = new Dictionary<DoubleArrayProcessorType, IDoubleArrayProcessor>();
foreach (Type type in Assembly.GetExecutingAssembly().GetTypes())
{
try
{
var instance = Activator.CreateInstance(type);
if (instance is IDoubleArrayProcessor)
{
processors.Add((instance as IDoubleArrayProcessor).Type, (instance as IDoubleArrayProcessor));
}
}
catch
{
continue;
}
}
}
public static IDoubleArrayProcessor CreateDoubleArrayProcessor(DoubleArrayProcessorType type)
{
return processors[type];
}
}
৩. আউটপুট লেখা
এখানে বেশি কিছু বলার নেই, কারণ এটি এমন একটি প্রক্রিয়া যা ইনপুটটিকে আয়না দেয়। প্রকৃতপক্ষে, আমরা এইভাবে পড়া এবং লেখার কারখানাকে এককভাবে একত্রিত করতে পারি DoubleArrayInputOutputFactory
:
public interface IDoubleArrayWriter
{
void WriteDoublesArray(IEnumerable<double> doubles);
DoubleArrayWriterType Type {get;}
}
public enum DoubleArrayWriterType
{
Console,
File,
Internet,
Cloud,
MockService,
Database
}
public class ConsoleDoubleArrayWriter : IDoubleArrayWriter
{
void IDoubleArrayWriter.WriteDoublesArray(IEnumerable<double> doubles)
{
foreach(double @double in doubles)
{
Console.WriteLine(@double);
}
}
DoubleArrayWriterType IDoubleArrayWriter.Type
{
get
{
return DoubleArrayWriterType.Console;
}
}
}
public static class DoubleArrayInputOutputFactory
{
private static Dictionary<DoubleArrayReaderType, IDoubleArrayReader> readers;
private static Dictionary<DoubleArrayWriterType, IDoubleArrayWriter> writers;
static DoubleArrayInputOutputFactory()
{
readers = new Dictionary<DoubleArrayReaderType, IDoubleArrayReader>();
writers = new Dictionary<DoubleArrayWriterType, IDoubleArrayWriter>();
foreach (Type type in Assembly.GetExecutingAssembly().GetTypes())
{
try
{
var instance = Activator.CreateInstance(type);
if (instance is IDoubleArrayReader)
{
readers.Add((instance as IDoubleArrayReader).Type, (instance as IDoubleArrayReader));
}
}
catch
{
continue;
}
}
foreach (Type type in Assembly.GetExecutingAssembly().GetTypes())
{
try
{
var instance = Activator.CreateInstance(type);
if (instance is IDoubleArrayWriter)
{
writers.Add((instance as IDoubleArrayWriter).Type, (instance as IDoubleArrayWriter));
}
}
catch
{
continue;
}
}
}
public static IDoubleArrayReader CreateDoubleArrayReader(DoubleArrayReaderType type)
{
return readers[type];
}
public static IDoubleArrayWriter CreateDoubleArrayWriter(DoubleArrayWriterType type)
{
return writers[type];
}
}
সবগুলোকে একত্রে রাখ
অবশেষে, আমাদের মূল প্রোগ্রামটি ইতিমধ্যে আমরা ইতিমধ্যে নির্মিত এই সমস্ত চমকপ্রদ ব্যবহার করবে, তাই কোডটি কেবল এইভাবে হবে:
var doubles = reader.GetDoubles();
doubles = processor.ProcessDoubles(doubles);
writer.WriteDoublesArray(doubles);
যেখানে যেমন আমরা সংজ্ঞায়িত করতে পারে reader
, writer
এবং processor
ব্যবহার
IDoubleArrayReader reader = DoubleArrayInputOutputFactory.CreateDoubleArrayReader(DoubleArrayReaderType.MockService);
IDoubleArrayProcessor processor = DoubleArrayProcessorFactory.CreateDoubleArrayProcessor(DoubleArrayProcessorType.Sorter);
IDoubleArrayWriter writer = DoubleArrayInputOutputFactory.CreateDoubleArrayWriter(DoubleArrayWriterType.Console);