සී # - අතිරික්තය වැනි kill ාතනයක් නැත
පළමුවෙන්ම, ආදරණීය GiMmEtHaCoDeZ, ඔබගේ කාර්යය බිඳ දැමීමට උත්සාහ කරමු:
- අංක කියවන්න
- ඒවා වර්ග කරන්න
- වර්ග කළ සංඛ්යා ප්රතිදානය කරන්න.
මෘදුකාංග ගැටලු සමඟ වැඩ කිරීමේදී "බෙදීම සහ ජය ගැනීම" ඉතා වැදගත් උපාය මාර්ගයක් බැවින්, ඒවා එකවර විසඳා ගැනීමට ඉඩ දෙන්න
1. කියවීම
මෘදුකාංගයේ තවත් වැදගත් කාරණයක් වන්නේ බහුකාර්යතාවයි. පරිශීලකයා සංඛ්යා ආදානය කරන්නේ කෙසේද යන්න නිශ්චිතව දක්වා නොමැති හෙයින්, එය කොන්සෝලය හරහා, ගොනුවක් හරහා, වෙබ් සේවාවක් හරහා සිදුවිය හැකිය. සමහර විට අපට මේ මොහොතේ සිතිය නොහැකි යම් ක්රමයක් පවා විය හැකිය. එබැවින්, අපගේ විසඳුමට විවිධ ආකාරයේ ආදාන සඳහා ඉඩ සැලසීම වැදගත් වේ. එය සාක්ෂාත් කර ගැනීම සඳහා ඇති පහසුම ක්රමය වනුයේ වැදගත් කොටස අතුරු මුහුණතකට උකහා ගැනීමයි, අපි කියමු
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];
}
}
සියලු ක්රියාකාරී පා readers කයින් පැටවීම සඳහා අපි පරාවර්තනය භාවිතා කරන බව සලකන්න, එබැවින් අනාගත ඕනෑම දිගු ස්වයංක්රීයව ලබා ගත හැක. දැන්, අපි දැන් කරන ප්රධාන කේතයේ ප්රධාන කේතයේ:
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];
}
}
3. ප්රතිදානය ලිවීම
මෙහි වැඩි යමක් කීමට කිසිවක් නැත, මෙය ආදානය පිළිබිඹු කරන ක්රියාවලියක් බැවින්. ඇත්ත වශයෙන්ම, අපට කියවීමේ හා ලිවීමේ කර්මාන්තශාලා එකකට ඒකාබද්ධ කළ හැකිය 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);