কোন কনস্ট্রাক্টরে [খাঁটি] কখন ব্যবহার করবেন?


19

আমি .NET এ কোড চুক্তি সম্পর্কে শিখছি, এবং আমি খাঁটি নির্মাণকারীদের ধারণাটি বোঝার চেষ্টা করছি। কোড চুক্তি ডকুমেন্টেশন পদ বলে:

চুক্তির মধ্যে ডাকা সমস্ত পদ্ধতি অবশ্যই খাঁটি হতে হবে; অর্থাৎ, তাদের অবশ্যই কোনও পূর্ববর্তী অবস্থা স্থিতি আপডেট করতে হবে না। খাঁটি পদ্ধতিতে প্রবেশের পরে তৈরি করা বস্তুগুলিকে সংশোধন করার জন্য একটি খাঁটি পদ্ধতি অনুমোদিত is

এবং PureAttributeনথিতে বলা হয়েছে:

ইঙ্গিত করে যে কোনও প্রকার বা পদ্ধতি খাঁটি, অর্থাত্ এটি কোনও দৃশ্যমান স্থিতি পরিবর্তন করে না।

পদ্ধতিগুলির ক্ষেত্রে আমি এই বিবৃতিগুলি বুঝতে পারি, তবে নির্মাণকারীদের কী হবে? ধরুন আপনার ক্লাসটি এরকম ছিল:

public class Foo
{
    public int Value { get; set; }

    public Foo(int value) {
        this.Value = value;
    }
}

এই কনস্ট্রাক্টর স্পষ্টতই নতুন Fooঅবজেক্টের অবস্থাকে প্রভাবিত করে , তবে এর কোনও অন্যান্য পার্শ্ব প্রতিক্রিয়া নেই (যেমন এটি কোনও পরামিতিগুলিকে ম্যানিপুলেট করে না বা কোনও খাঁটি পদ্ধতিতে কল করে না)। এটি প্রার্থী [Pure]নাকি না? [Pure]কোনও কনস্ট্রাক্টরের উপর কোনও বৈশিষ্ট্য রাখার তাৎপর্য কী এবং আমি নিজের কোডে কখন এটি করব?

উত্তর:


14

আপনি এর সাথে একটি পদ্ধতি সাজাবেন [Pure]:

  • পদ্ধতিটি যদি পার্শ্ব প্রতিক্রিয়া না করে। উদাহরণস্বরূপ, যদি পদ্ধতিটি কোনও ডাটাবেস অ্যাক্সেস করে এবং এটি সংশোধন করে বা এর ফলাফল ডাটাবেসের উপর নির্ভর করে, এটি খাঁটি নয়।

  • এবং যদি আপনি কোড চুক্তিতে এটি ব্যবহারের প্রত্যাশা করেন। উদাহরণস্বরূপ, যদি পদ্ধতিটি খাঁটি হয় তবে কোড চুক্তিতে এটি ব্যবহার করার আপনার কোনও ইচ্ছা নেই, যোগ করার [Pure]কোনও লাভ হবে না এবং আপনার কোডটি দ্রুত তৈরি করবে না।

যতক্ষণ না এটি নির্মাতাদের উদ্বেগ করে, দেখে মনে হচ্ছে এগুলি নেট। এনইটি খাঁটি বলে মনে করা হয় এবং তাদের কোনও স্পষ্ট বৈশিষ্ট্যের প্রয়োজন হয় না। আমি .NET ফ্রেমওয়ার্ক উত্সে বেশ কয়েকটি নির্মাণকারীর দিকে তাকিয়েছিলাম DateTime, এবং তাদের কোনও [Pure]বৈশিষ্ট্য নেই।

আমি মনে করি এটি বেশ কয়েকটি কারণে সম্পন্ন হয়েছে:

  • [Pure]কেবল চুক্তিতে ক্লাস / স্ট্রাক্ট ব্যবহার করতে সক্ষম হওয়ার জন্য অ্যাট্রিবিউটের সাথে প্যারামিটারলেস কন্সট্রাক্টর লিখতে পারা খুব অবাস্তব হতে পারে ।

  • কিছু, যেমন String, স্পষ্টত নির্মাণকারী নেই।

  • নির্মাতারা এমনকি কোড চুক্তির বাইরেও বিশেষ চিকিত্সা পান; উদাহরণস্বরূপ, আপনি তাদের মধ্যে ব্যতিক্রম ছুঁড়ে ফেলার আশা করছেন না

  • [Pure]আপনার জীবনকে সরল করার জন্য এখানে একটি কনভেনশন রয়েছে তবে এই বৈশিষ্ট্যের সাথে সজ্জিত পদ্ধতিটি খাঁটি কিনা তা নিশ্চিত করার জন্য কোনও আসল স্ট্যাটিক চেকিং নেই। void DestroyDatabase()খাঁটি হিসাবে সজ্জিত হতে পারে, এবং কোড চুক্তিগুলি কোনও ভুল লক্ষ্য করবে না।

    বর্তমানে কোড চুক্তির কোনও উপাদান নেই যা খাঁটি হিসাবে ঘোষণা করা পদ্ধতিগুলি খাঁটি কিনা তা পরীক্ষা করে। সুতরাং যদি কোনও প্রোগ্রামার [খাঁটি] দিয়ে কোনও পদ্ধতি সজ্জিত করে তবে এটি কেবল বিশ্বাস করা।

    থেকে কোড # 5 কনট্র্যাক্টসঃ পদ্ধতি বিশুদ্ধতা

  • । নেট ফ্রেমওয়ার্কে নিজেই এমন কনস্ট্রাক্টর থাকে যা খাঁটি নয়। উদাহরণস্বরূপ, সংগ্রহের মাধ্যমে লুপিংয়ের পার্শ্ব প্রতিক্রিয়া List<T>(IEnumerable<T> collection)থাকলে প্রকৃতপক্ষে অপরিষ্কার ।

  • চুক্তি চিৎকার সহজ রাখা। আমি সহজেই একটি চুক্তি যেমন কল্পনা করতে পারি Contract.Requires(!string.IsNullOrEmpty(name)), সুতরাং স্থির string.IsNullOrEmptyবিশুদ্ধ ঘোষণার জন্য ভাল কারণ রয়েছে ।

    অন্যদিকে, StringBuilderস্ট্রিংটি তৈরির জন্য যদি আপনার প্রয়োজন হয় তবে আপনি আপনার ব্যবসায়িক শ্রেণীর উদাহরণ পদ্ধতি কল করে কোনও কিছুর জন্য পরীক্ষা করে দেখছেন, আপনি সম্ভবত চুক্তির অপব্যবহার করছেন। এ কারণেই কেন StringBuilder.ToStringএটি খাঁটি হিসাবে চিহ্নিত করা হয়নি, যদিও তা হতে পারে (তাই না?)


সিস্টেমের ধরণের অনেকগুলি কোড চুক্তি কনট্রাক্ট চেকার দ্বারা ধরে নেওয়া হয়, "এমন কোনও পদ্ধতি যার সাথে সম্পূর্ণরূপে যোগ্যতাসম্পন্ন নাম" সিস্টেম.ডায়াগনস্টিকস.কন্ট্র্যাক্টস "," সিস্টেম.স্ট্রিং "," সিস্টেম.আইও.প্যাথ ", বা" সিস্টেমের সাথে শুরু হয় .Type " "। দুর্ভাগ্যক্রমে, আমি নিশ্চিত নই যে কোড চুক্তিগুলির ক্ষেত্রে .NET প্রকারগুলি অনুসন্ধান করা খুব কার্যকর।
PSWg

3
বিশুদ্ধতা সেগুলির মধ্যে একটি যেখানে সমস্ত কলকৃত কোডও বিশুদ্ধ হতে হয়, বা কলার "খাঁটি" নয়। আমার বিশ্বাস করা কঠিন যে সমস্ত কনস্ট্রাক্টর ডিফল্টরূপে খাঁটি হিসাবে বিবেচিত হয়।
ফ্রাঙ্ক হিলিমান

@ ফ্র্যাঙ্কহিল্যান: আমিও। আমার এখনই সি # সংকলক নেই, তবে কনস্ট্রাক্টর এবং কোনও [Pure]বৈশিষ্ট্যযুক্ত কোনও ক্লাস লিখতে যথেষ্ট হবে এবং একটি যথাযথ উত্তর পাওয়ার জন্য এটি চুক্তিতে অন্য কোথাও ব্যবহার করা উচিত।
আর্সেনী মোরজেনকো

1

এই ক্ষেত্রে এটি নির্মাণ না করা অবধি অবধি ব্যবহার করা যাবে না। সুতরাং নির্মাণকারী খাঁটি। যদি কনস্ট্রাক্টর অন্যান্য কোড কল করে, বা কোনও প্রতিনিধি আহ্বান করে এবং অন্য কোডটি পরিবর্তনীয় সম্পত্তি পরিবর্তন করে তবে তা খাঁটি হবে না। আরও নিরাপদ হওয়ার জন্য, সম্পত্তিটি অপরিবর্তনীয় করা আরও ভাল।


খাঁটি নির্মাতা একটি খাঁটি পদ্ধতি যা খাঁটি হওয়ার অন্যান্য শর্তগুলি ততক্ষণ সন্তুষ্ট না করে ততক্ষণ বর্তমান বর্গের অবস্থার পরিবর্তন করার অনুমতি দেওয়া হয়? বিটিডাব্লু, সম্পত্তিটি পরিবর্তনযোগ্য কারণ আমি জোর দিয়ে বলতে চাইছিলাম যে এই শ্রেণিটি নিজে খাঁটি নয়।
PSWg

@pswg: আপনি একটি আকর্ষণীয় প্রশ্ন তৈরি করেছেন যার সম্ভবত মাইক্রোসফ্ট উত্তর দিতে হবে। ধরুন কনস্ট্রাক্টর এমন কোনও পদ্ধতিতে সাহায্য করেছেন যা পরিবর্তিত সম্পত্তিকে পরিবর্তন করে; কনস্ট্রাক্টর কি এখনও খাঁটি হতে পারে? আমি মনে করি প্রযুক্তিগতভাবে এটি বাহ্যিক দর্শকদের কাছে "অদৃশ্য" হওয়া সত্ত্বেও তা হবে না। যেহেতু আপনার আসল উদাহরণে অন্য কোনও কোড চাওয়া হয়নি, তাই আমি যে কোনও সংজ্ঞা দিয়ে ভাবতে পারি তা অবশ্যই খাঁটি হতে হবে।
ফ্রাঙ্ক হিলিমান

@pswg: সম্পত্তি সেটটিও একটি পদ্ধতি কল ছাড়া .. আমার মনে হয় আপনার এমএসডিএন ফোরামে জিজ্ঞাসা করা উচিত।
ফ্রাঙ্ক হিলিমান

আমার ধারণা, যদি শুদ্ধির কেন্দ্রীয় ধারণাটি হয় যে পদ্ধতিটি কোনও পর্যবেক্ষণযোগ্য পরিবর্তন করে কিনা , তবে সেই অর্থে, যতক্ষণ না কোনও কলার দ্বারা পরিবর্তনগুলি পর্যবেক্ষণ করা যায় না, ততক্ষণ এটিকে খাঁটি পদ্ধতিগুলি বলা হোক না কেন নির্বিশেষে , এটি এখনও একটি বিশুদ্ধ পদ্ধতি হবে।
PSWg

@pswg: এটি বিমূর্ত সংজ্ঞা। তবে আমি যদি এই বিষয়গুলির জন্য কোনও বিশ্লেষক লিখছিলাম, সম্ভবত কলকারীকে খাঁটি করার জন্য একটি খাঁটি-বিশুদ্ধ পদ্ধতি কলও বিবেচিত হবে। কেবল বাস্তবায়নের সরলতার জন্য। তারপরে প্রশ্নটি হল, একজন নির্মাতা কী একটি সাধারণ পদ্ধতি কল বা বিশ্লেষণ কত গভীর হয়।
ফ্র্যাঙ্ক হিলিমান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.