আমার সিস্টেম আমি ঘন ঘন বিমানবন্দর কোড (চালিত "YYZ"
, "LAX"
, "SFO"
, ইত্যাদি), তারা সঠিক একই বিন্যাস (3 অক্ষর বড় হাতের হিসাবে প্রতিনিধিত্ব) এ সবসময়। সিস্টেমটি সাধারণত এপিআই অনুরোধে এই (পৃথক) কোডগুলির 25-50 এর সাথে সম্পর্কিত হয়, মোট এক হাজারেরও বেশি বরাদ্দ সহ, তারা আমাদের অ্যাপ্লিকেশনটির অনেক স্তর দিয়ে যায় এবং প্রায়শই সাম্যের জন্য তুলনা করা হয়।
আমরা চারপাশে কেবল স্ট্রিংগুলি দিয়ে শুরু করেছি, যা কিছুক্ষণের জন্য ভাল কাজ করেছে তবে আমরা খুব শীঘ্রই কোথাও 3 ডিজিটের কোড প্রত্যাশিত একটি ভুল কোড দিয়ে পাসিং করে প্রচুর প্রোগ্রামিং ভুল লক্ষ্য করেছি noticed আমরা এমন সমস্যাগুলিতেও ছড়িয়ে পড়েছি যেখানে আমাদের কেস-সংবেদনশীল তুলনা করার কথা ছিল এবং পরিবর্তে বাগগুলি ঘটেনি।
এটি থেকে, আমি কাছাকাছি স্ট্রিংগুলি বন্ধ করা এবং একটি Airport
ক্লাস তৈরি করার সিদ্ধান্ত নিয়েছি , যার একটি একক নির্মাতা রয়েছে যা বিমানবন্দর কোডটি গ্রহণ করে এবং বৈধ করে।
public sealed class Airport
{
public Airport(string code)
{
if (code == null)
{
throw new ArgumentNullException(nameof(code));
}
if (code.Length != 3 || !char.IsLetter(code[0])
|| !char.IsLetter(code[1]) || !char.IsLetter(code[2]))
{
throw new ArgumentException(
"Must be a 3 letter airport code.",
nameof(code));
}
Code = code.ToUpperInvariant();
}
public string Code { get; }
public override string ToString()
{
return Code;
}
private bool Equals(Airport other)
{
return string.Equals(Code, other.Code);
}
public override bool Equals(object obj)
{
return obj is Airport airport && Equals(airport);
}
public override int GetHashCode()
{
return Code?.GetHashCode() ?? 0;
}
public static bool operator ==(Airport left, Airport right)
{
return Equals(left, right);
}
public static bool operator !=(Airport left, Airport right)
{
return !Equals(left, right);
}
}
এটি আমাদের কোডটিকে বোঝার পক্ষে আরও সহজ করে তুলেছে এবং আমরা আমাদের সমতা চেক, অভিধান / সেট ব্যবহারগুলি সহজ করে দিয়েছি। আমরা এখন জানি যে যদি আমাদের পদ্ধতিগুলি এমন একটি Airport
উদাহরণ গ্রহণ করে যা এটি আমাদের প্রত্যাশার সাথে আচরণ করে তবে এটি আমাদের পদ্ধতি চেককে নাল রেফারেন্স চেককে সহজতর করেছে।
আমি যে জিনিসটি লক্ষ্য করেছি, তা হ'ল আবর্জনা সংগ্রহের কাজটি প্রায়শই চলছিল যা আমি Airport
সংগ্রহ করার ঘটনাগুলিতে ট্র্যাক করেছিলাম ।
এটির আমার সমাধানটি হ'ল এটিকে রূপান্তর class
করা struct
। প্রায় এটি শুধু একটি শব্দ পরিবর্তন ছিল, ব্যতিক্রম GetHashCode
এবং ToString
:
public override string ToString()
{
return Code ?? string.Empty;
}
public override int GetHashCode()
{
return Code?.GetHashCode() ?? 0;
}
default(Airport)
ব্যবহৃত হয় যেখানে কেস পরিচালনা করতে ।
আমার প্রশ্নগুলো:
কোনও
Airport
শ্রেণি তৈরি করা বা সাধারণভাবে একটি ভাল সমাধান তৈরি করা ছিল , বা আমি ভুল সমস্যাটি সমাধান করছি / প্রকারটি তৈরি করে এটি ভুল উপায়ে সমাধান করছি? যদি এটি একটি ভাল সমাধান না হয় তবে এর চেয়ে ভাল সমাধান কী?যেখানে
default(Airport)
ব্যবহৃত হয় সেখানে আমার অ্যাপ্লিকেশনটির কীভাবে হ্যান্ডেল করা উচিত ? এক ধরণেরdefault(Airport)
আমার আবেদনের পক্ষে অযৌক্তিক, তাই আমি এমনif (airport == default(Airport) { throw ... }
জায়গাগুলিতে করছিলাম যেখানেAirport
(এবং এরCode
সম্পত্তি) উদাহরণ পাওয়া অপারেশনের জন্য গুরুত্বপূর্ণ।
দ্রষ্টব্য: আমি সি # / ভিবি কাঠামো প্রশ্নগুলি পর্যালোচনা করেছি - প্রদত্ত কাঠামোর জন্য অবৈধ বলে বিবেচিত শূন্য ডিফল্ট মানগুলির ক্ষেত্রে কীভাবে এড়ানো যায়? , এবং আমার প্রশ্ন জিজ্ঞাসার আগে স্ট্রাক্ট ব্যবহার করুন বা না করুন , তবে আমি মনে করি যে আমার প্রশ্নগুলি তার নিজের পোস্টের পরোয়ানা দেওয়ার পক্ষে যথেষ্ট আলাদা are
default(Airport)
সমস্যাটি সমাধান করার একটি উপায় হ'ল ডিফল্ট দৃষ্টান্তগুলি কেবল অস্বীকার করে। আপনি প্যারামিটারলেস কনস্ট্রাক্টর লিখে এবং নিক্ষেপ করে InvalidOperationException
বা NotImplementedException
এটিতে এটি করতে পারেন।