ডিটিওগুলির জন্য নুলযোগ্য রেফারেন্স প্রকারের জন্য সেরা অনুশীলন


20

আমার কাছে একটি ডিটিও রয়েছে যা ডায়নামোডিবি টেবিল থেকে পপুলেটেড। এটি বর্তমানে এটির মতো দেখাচ্ছে বলে দিন:

public class Item
{
    public string Id { get; set; } // PK so technically cannot be null
    public string Name { get; set; } // validation to prevent nulls but this doesn't stop database hacks
    public string Description { get; set; } // can be null
}

এটি মোকাবেলায় উন্নততর কোন অনুশীলন রয়েছে? আমি বরং একটি প্যারামিটারহীন নির্মাতাকে এড়িয়ে যাব যেহেতু ডায়নামো এসডিকে (পাশাপাশি অন্যরা) এর ওআরএমের সাথে খারাপ খেল।

লেখাটি আমার কাছে অদ্ভুত বলে মনে হচ্ছে public string Id { get; set; } = "";কারণ এটি কখনই হয় না কারণ Idএটি পিকে এবং কখনই নালু হতে পারে না। ""এটি কোনও উপায়ে করলেও কী ব্যবহার হবে ?

সুতরাং এই কোন ভাল অনুশীলন?

  • আমি কি তাদের সকলকে চিহ্নিত করে string?বলি যে তারা নালাম হতে পারে যদিও কিছু কখনও না হওয়া উচিত।
  • আমি ইনিশিয়ালাইজ করা উচিত Idএবং Nameসঙ্গে ""কারণ তারা উচিত নাল এবং এই শো হতে অভিপ্রায় যদিও ""কখনো ব্যবহার করা হবে।
  • উপরে কিছু সংমিশ্রণ

দয়া করে নোট করুন: এটি সি # 8 টি সম্পর্কিত অযোগ্য রেফারেন্স ধরণের সম্পর্কে যদি আপনি না জানেন তবে সেগুলি উত্তম best


এটি কিছুটা নোংরা, তবে আপনি কেবল #pragma warning disable CS8618ফাইলের শীর্ষে চড় মারতে পারেন ।
বিশ

7
পরিবর্তে = "", আপনি = null!এমন কোনও সম্পত্তি শুরু করতে ব্যবহার করতে পারেন যা আপনি জানেন যে কখনই কার্যকরভাবে হতে পারে না null(যখন সংকলকটির এটি জানার কোনও উপায় নেই)। তাহলে Descriptionআইনত হতে পারে null, এটি একটি ঘোষণা করা হবে string?। বিকল্পভাবে, যদি ডিটিওর জন্য অযোগ্যতা যাচাই করা সাহায্যের চেয়ে আরও উপদ্রব হয় তবে আপনি কেবল এই ধরণের জন্য এনআরটি বন্ধ করতে #nullable disable/ টাইপটি কেবল মোড়ানো করতে পারেন #nullable restore
জেরোইন মোস্টার্ট

@ জিরোয়নমাস্টার্টকে আপনার উত্তরটি দেওয়া উচিত।
ম্যাগনাস

3
@ ম্যাগনাস: আমি "সেরা অনুশীলন" জিজ্ঞাসা করে যে কোনও প্রশ্নের উত্তর দিতে নারাজ; যেমন জিনিস বিস্তৃত এবং বিষয়গত। আমি আশা করি ওপি আমার মন্তব্য তাদের নিজস্ব "সেরা অনুশীলন" বিকাশের জন্য ব্যবহার করতে পারে।
জেরোইন মোস্টার্ট

1
@ ইভানগ্র্যাকিয়া টোপেট: যদিও আমি একমত যে প্রাথমিক কীটির জন্য স্ট্রিং ব্যবহার করা অস্বাভাবিক এবং পরিস্থিতিগুলির উপর নির্ভর করে অপ্রতিরোধ্যও হতে পারে, তথ্যের ধরণের ওপির পছন্দটি প্রশ্নের সাথে বেশ অপ্রাসঙ্গিক। এটি প্রাথমিক কী নয় এমন কোনও প্রয়োজনীয়, অ-ননযোগ্য স্ট্রিং প্রোপার্টিটিতে সহজেই প্রয়োগ করা যেতে পারে, বা এমনকী একটি স্ট্রিং ফিল্ড যা সংমিশ্রিত প্রাথমিক কীটির অংশ, এবং প্রশ্নটি এখনও দাঁড়াবে।
জেরেমি কেনে

উত্তর:


12

একটি বিকল্প হিসাবে, আপনি defaultআক্ষরিক ব্যবহার করতে পারেন এর সাথে একযোগেnull forgiving operator

public class Item
{
    public string Id { get; set; } = default!;
    public string Name { get; set; } = default!;
    public string Description { get; set; } = default!;
}

যেহেতু আপনার ডিটিও ডায়নামোডিবি থেকে জনবহুল, আপনি ননিবিলিটি নিয়ন্ত্রণ করতে পোস্টকন্ডিশন MaybeNull/NotNull বৈশিষ্ট্যগুলি ব্যবহার করতে পারেন

  • MaybeNull একটি অপ্রয়োজনীয় রিটার্ন মান শূন্য হতে পারে।
  • NotNull একটি পিছনে ফেরতের মান কখনই শূন্য হবে না।

তবে এই বৈশিষ্ট্যগুলি কেবলমাত্র সদস্যদের কলকারীদের সাথে নোটযুক্ত বিশ্লেষণকে প্রভাবিত করে যা তাদের সাথে মন্তব্য করা হয়। সাধারণত, আপনি এই বৈশিষ্ট্যগুলি পদ্ধতি রিটার্ন, বৈশিষ্ট্য এবং সূচক প্রাপ্তকারীদের প্রয়োগ করেন।

সুতরাং, আপনি আপনার সমস্ত সম্পত্তি অ-শনীয়যোগ্য বিবেচনা করতে পারেন এবং এটিকে MaybeNullবৈশিষ্ট্য সহ সজ্জিত করতে পারেন যাতে তাদের সম্ভাব্য nullমান প্রত্যাবর্তন হয় indic

public class Item
{
    public string Id { get; set; } = "";
    [MaybeNull] public string Name { get; set; } = default!;
    [MaybeNull] public string Description { get; set; } = default!;
}

নিম্নলিখিত উদাহরণটি আপডেট Itemক্লাসের ব্যবহার দেখায় । আপনি দেখতে পাচ্ছেন, দ্বিতীয় লাইনটি সতর্কতা প্রদর্শন করে না, তবে তৃতীয়টি করে

var item = new Item();
string id = item.Id;
string name = item.Name; //warning CS8600: Converting null literal or possible null value to non-nullable type.

অথবা আপনি সমস্ত বৈশিষ্ট্যকে বাতিলযোগ্য হিসাবে তৈরি করতে পারেন এবং NoNullফেরতের মানটি হতে পারে না তা বোঝাতে ব্যবহার করতে পারেন null( Idউদাহরণস্বরূপ)

public class Item
{
    [NotNull] public string? Id { get; set; }
    public string? Name { get; set; }
    public string? Description { get; set; }
}

পূর্ববর্তী উদাহরণ সহ সতর্কতা একই হবে।

রয়েছে AllowNull/DisallowNull পূর্বশর্ত বৈশিষ্ট্যাবলী ইনপুট প্যারামিটার, বৈশিষ্ট্য এবং indexers setters জন্য, একই ভাবে কাজ।

  • AllowNull একটি অপ্রয়োজনীয় ইনপুট যুক্তি নাল হতে পারে।
  • DisallowNull একটি nullaable ইনপুট আর্গুমেন্ট কখনও নাল হওয়া উচিত নয়।

আমি মনে করি না যে এটি আপনাকে সাহায্য করবে, যেহেতু আপনার ক্লাসটি ডেটাবেস থেকে পপুলেটেড, তবে আপনি প্রথম বিকল্প হিসাবে এটির মতো বৈশিষ্ট্য নির্ধারকগুলির শূন্যতা নিয়ন্ত্রণ করতে তাদের ব্যবহার করতে পারেন

[MaybeNull, AllowNull] public string Description { get; set; }

এবং দ্বিতীয় এক জন্য

[NotNull, DisallowNull] public string? Id { get; set; }

পোস্ট / পূর্বশর্তগুলির কিছু সহায়ক বিশদ এবং উদাহরণ এই ডেবলব্লগ নিবন্ধে পাওয়া যাবে


6

এই দৃশ্যকল্প মধ্যে পাঠ্যপুস্তক উত্তর একটি ব্যবহার করা string?আপনার জন্য Idসম্পত্তি, কিন্তু এছাড়াও সঙ্গে এটি সাজাইয়া রাখা [NotNull]অ্যাট্রিবিউট:

public class Item
{
  [NotNull] public string? Id { get; set; }
  public string Name { get; set; }
  public string? Description { get; set; }
}

তথ্যসূত্র: ডকুমেন্টেশন অনুসারে , [NotNull]বৈশিষ্ট্যটি "নির্দিষ্ট করে যে কোনও আউটপুট নাল নয় যদিও সংশ্লিষ্ট প্রকারটি এটির অনুমতি দেয়।"

তো, এখানে ঠিক কী চলছে?

  1. প্রথমত, string?রিটার্ন টাইপ সংকলকটি আপনাকে সতর্ক করতে বাধা দেয় যে সম্পত্তিটি নির্মাণের সময় অবিচ্ছিন্ন করা হয়েছে এবং এভাবে ডিফল্ট হবে null
  2. তারপর, [NotNull]অ্যাট্রিবিউট প্রতিরোধ একটি সতর্কবার্তা যখন একটি অ-nullable পরিবর্তনশীল সম্পত্তি বরাদ্দ বা যেহেতু আপনি, কম্পাইলার এর স্ট্যাটিক প্রবাহ বিশ্লেষণ করে পরিচায়ক হয় তাহলে সেটিকে ডি-রেফারেন্স করার চেষ্টা বাস্তবে , এই সম্পত্তি কখনোই হতে হবে null

সতর্কতা: সি # এর অযোগ্যতা প্রসঙ্গে জড়িত সমস্ত মামলার মতো, প্রযুক্তিগতভাবে nullএখানে এখনও কোনও মান ফেরানো থেকে বিরত নেই এবং এইভাবে, সম্ভাব্যভাবে কিছু স্ট্রিম ব্যতিক্রম প্রবর্তন করা; অর্থাত্, বক্স-র-রাইটটাইম বৈধতা নেই। সমস্ত সি # সর্বদা সরবরাহকারী একটি সংকলক সতর্কতা। আপনি যখন পরিচয় করিয়ে দিচ্ছেন [NotNull]আপনি কার্যকরভাবে সেই সতর্কতাটিকে আপনার ব্যবসায়িক যুক্তি সম্পর্কে ইঙ্গিত দিয়ে কার্যকরভাবে ওভাররাইড করছেন। যেমন, আপনি যখন কোনও সম্পত্তি দিয়ে এ্যানোটেট করেন [NotNull], আপনি আপনার প্রতিশ্রুতিটির জন্য দায়িত্ব নিচ্ছেন যে "এটি কখনই হবে না যেহেতু Idপিকে হয় এবং কখনই বাতিল হয় না"।

আপনাকে সেই প্রতিশ্রুতি বজায় রাখতে সহায়তা করার জন্য, আপনি অতিরিক্তটি[DisallowNull] বৈশিষ্ট্যের সাহায্যে সম্পত্তিটি বয়ান করতে চাইতে পারেন :

public class Item
{
  [NotNull, DisallowNull] public string? Id { get; set; }
  public string Name { get; set; }
  public string? Description { get; set; }
}

তথ্যসূত্র: ডকুমেন্টেশন অনুসারে , [DisallowNull]বৈশিষ্ট্যটি "নির্দিষ্ট করে যা nullপ্রাসঙ্গিক প্রকারটি এটির অনুমতি দেয় এমনকি যদি একটি ইনপুট হিসাবে অনুমোদিত না হয়।"

এটি আপনার ক্ষেত্রে প্রাসঙ্গিক নাও হতে পারে যেহেতু ডাটাবেসের মাধ্যমে মানগুলি নির্ধারিত করা হচ্ছে [DisallowNull]তবে আপনি যদি কোনও ক্ষেত্রে null(সক্ষম) মান নির্ধারণের চেষ্টা করেন তবে বৈশিষ্ট্যটি আপনাকে একটি সতর্কতা দেবে Id, যদিও রিটার্নের ধরণটি অন্যথায় এটির অনুমতি দেয় যদিও নাল । যে বিষয়ে Idকাজ করবে ঠিক একটি মত string, যতটা সি # 'গুলি স্ট্যাটিক প্রবাহ বিশ্লেষণ আসল ব্যাপারটি হচ্ছে, যখন এছাড়াও যার ফলে মূল্য বস্তুর নির্মাণ ও সম্পত্তির জনসংখ্যা মধ্যে uninitialized থাকতে।

দ্রষ্টব্য: অন্যরা যেমন উল্লেখ করেছে, আপনি বা Idএর একটি ডিফল্ট মান নির্ধারণ করে কার্যত অভিন্ন ফলাফল অর্জন করতে পারেন । এটি স্বীকৃতভাবেই কিছুটা স্টাইলিস্টিক পছন্দ। আমি অযোগ্যতা টীকাগুলি আরও বেশি স্পষ্ট হওয়ার কারণে এবং দানাদার নিয়ন্ত্রণ সরবরাহ করতে পছন্দ করি, তবে সংকলকটি বন্ধ করার উপায় হিসাবে অপব্যবহার করা সহজ । স্পষ্টরূপে একটি মান দিয়ে কোনও সম্পত্তি শুরু করাও আমার কাছে কটাক্ষ করে যদি আমি জানি যে আমি কখনই সেই মানটি ব্যবহার করব না - এমনকি এটি ডিফল্ট হলেও।default!null!!


-2

স্ট্রিং একটি রেফারেন্স টাইপ এবং সর্বদা nullaable, আপনার বিশেষ কিছু করার দরকার নেই। আপনি যদি পরে এই সমস্যাটি অন্য কোনওটিতে ম্যাপ করতে চান তবে আপনার পরে সমস্যা হতে পারে তবে আপনি পরে এটি পরিচালনা করতে পারেন।


8
তিনি সি # 8
ম্যাগনাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.