সদস্যদের সাথে শ্রেণি যা তৈরির সময় পরিবর্তনীয় তবে পরে পরিবর্তনযোগ্য


22

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

অ্যালগরিদম সমাপ্ত হওয়ার পরে, বস্তুগুলি কখনই পরিবর্তন করা উচিত নয় - তবে সেগুলি সফ্টওয়্যারটির অন্যান্য অংশে গ্রাস করা হয়।

এই পরিস্থিতিতে, নীচের বর্ণিত হিসাবে ক্লাসের দুটি সংস্করণ রাখা ভাল অনুশীলন হিসাবে বিবেচনা করা হয়?

  • পরিবর্তনীয় একটি অ্যালগরিদম দ্বারা তৈরি করা হয়, তারপর
  • অ্যালগরিদমের সমাপ্তির পরে, ডেটা অনিবার্য বস্তুতে অনুলিপি করা হয় যা ফিরে আসে।

3
আপনার সমস্যা / প্রশ্ন কী তা পরিষ্কার করতে আপনি নিজের প্রশ্নটি সম্পাদনা করতে পারেন?
সাইমন বার্গোট

আপনি এই
প্রশ্নেও

উত্তর:


46

আপনি সম্ভবত নির্মাতা প্যাটার্নটি ব্যবহার করতে পারেন । এটি প্রয়োজনীয় ডেটা সংগ্রহ করার উদ্দেশ্যে একটি পৃথক 'বিল্ডার' অবজেক্ট ব্যবহার করে এবং যখন সমস্ত ডেটা সংগ্রহ করা হয় তখন এটি প্রকৃত অবজেক্ট তৈরি করে। তৈরি বস্তু অপরিবর্তনীয় হতে পারে।


আপনার সমাধানটি আমার প্রয়োজনীয়তার জন্য সঠিক ছিল (সমস্তটি বর্ণিত নয়)। তদন্তের পরে ফিরে আসা বস্তুর সমস্তের একই বৈশিষ্ট্য থাকে না। বিল্ডার বর্গের অনেকগুলি অবিচল ক্ষেত্র রয়েছে এবং যখন ডেটা তৈরি করা হয়, তখন 3 টি পৃথক শ্রেণীর মধ্যে কোনটি উত্পন্ন করতে হবে তা বেছে নেয়: এগুলি পরম্পরাগতভাবে একে অপরের সাথে সম্পর্কিত।
পল রিচার্ডস

2
@ পল সেই ক্ষেত্রে, যদি এই উত্তরটি আপনার সমস্যার সমাধান করে, আপনার এটি গ্রহণযোগ্য হিসাবে চিহ্নিত করা উচিত।
Riking

24

এটি অর্জনের একটি সহজ উপায় হ'ল একটি ইন্টারফেস রয়েছে যা একজনকে কেবল বৈশিষ্ট্যগুলি পড়ার অনুমতি দেয় এবং কেবলমাত্র পড়ার পদ্ধতিগুলি কল করতে পারে এবং এমন একটি ক্লাস যা সেই ইন্টারফেসকে কার্যকর করে যা আপনাকে সেই শ্রেণিটি লিখতে দেয়।

আপনার পদ্ধতি যা এটি তৈরি করে, প্রাক্তনটির সাথে ডিল করে এবং তারপরে ইন্টারেস্ট করার জন্য কেবল কেবল একটি পঠনযোগ্য ইন্টারফেস সরবরাহ করে returns এটির জন্য কোনও অনুলিপি লাগবে না এবং এটি আপনাকে স্রষ্টার বিরোধী হিসাবে কলারের কাছে সহজেই সূক্ষ্ম সুর-আচরণের সুযোগ দেয়।

এই উদাহরণটি ধরুন:

public interface IPerson 
{
    public String FirstName 
    {
        get;
    }

    public String LastName 
    {
        get;
    }
} 

public class PersonImpl : IPerson 
{
    private String firstName, lastName;

    public String FirstName 
    {
        get { return firstName; }
        set { firstName = value; }
    }

    public String LastName 
    {
        get { return lastName; }
        set { lastName = value; }
    }
}

class Factory 
{
    public IPerson MakePerson() 
    {
        PersonImpl person = new PersonImpl();
        person.FirstName = 'Joe';
        person.LastName = 'Schmoe';
        return person;
    }
}

এই পদ্ধতির একমাত্র অসুবিধা হ'ল যে কেউ এটিকে কেবল প্রয়োগকারী শ্রেণিতে ফেলে দিতে পারে। এটি যদি সুরক্ষার বিষয় হয়ে থাকে তবে কেবল এই পদ্ধতির ব্যবহার অপর্যাপ্ত। এটির জন্য একটি কার্যপ্রণালী হ'ল আপনি একটি মুখোমুখি তৈরি করতে পারেন কর্মসংস্থান মিউটেবল ক্লাসটি মোড়ানোর ক্লাস , যা কেবল একটি ইন্টারফেস উপস্থাপন করে যা কলার সাথে কাজ করে এবং অভ্যন্তরীণ বস্তুর অ্যাক্সেস রাখতে পারে না।

এইভাবে, castালাই এমনকি আপনাকে সহায়তা করবে না। উভয়ই কেবল একই পঠনযোগ্য ইন্টারফেস থেকে উদ্ভূত হতে পারে তবে প্রত্যাবর্তিত অবজেক্টটি ingালাই কেবল আপনাকে ফ্যাসাদ শ্রেণি দেবে, যা অপরিবর্তনীয় কারণ এটি মোড়ানো পরিবর্তনীয় শ্রেণীর অন্তর্নিহিত অবস্থা পরিবর্তন করে না।

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


1
"কেবল পঠনযোগ্য" অবজেক্টটি ফিরিয়ে দিয়ে সুরক্ষা আরও ভাল নয়, কারণ কোডটি যা বস্তুটি পায়, এখনও প্রতিচ্ছবিটি ব্যবহার করে অবজেক্টটি সংশোধন করতে পারে। এমনকি একটি স্ট্রিংও প্রতিবিম্বটি ব্যবহার করে (অনুলিপি করা হয়নি, জায়গায় জায়গায় সংশোধিত করা যেতে পারে) পরিবর্তন করা যেতে পারে।
এমটিল্টেড

সুরক্ষা সমস্যাটি একটি প্রাইভেট ক্লাসের সাথে খুব সুন্দরভাবে সমাধান করা যেতে পারে
এসবেভন স্কভ পেদারসেন

@ ইসবেন: আপনাকে এখনও এমএস07-052 এর সাথে লড়াই করতে হবে : কোড প্রয়োগের ফলাফল কোড কার্যকর করে । আপনার কোডটি তাদের কোডের মতোই সুরক্ষা প্রসঙ্গে চলছে, তাই তারা কেবল একটি ডিবাগার সংযুক্ত করতে পারে এবং যা খুশি করতে পারে।
কেভিন

কেভিন 1 আপনি সমস্ত এনক্যাপসুলেশন সম্পর্কে এটি বলতে পারেন। আমি প্রতিবিম্ব থেকে রক্ষা করার চেষ্টা করছি না।
এসবেন স্কোভ পেদারসেন

1
"সুরক্ষা" শব্দটি ব্যবহার করার ক্ষেত্রে সমস্যাটি হ'ল তাত্ক্ষণিকভাবে কেউ ধরে নিয়েছে যে আমি যা বলি তাকে আরও সুরক্ষিত বিকল্প সর্বাধিক সুরক্ষা এবং সর্বোত্তম অনুশীলনের সমতুল্য। আমি কখনও বলিনি। যদি আপনি কাউকে ব্যবহারের জন্য লাইব্রেরি হস্তান্তর করেন তবে অবহেলা না করা (এবং কখনও কখনও অবলম্বন করা হলেও) আপনি সুরক্ষার নিশ্চয়তা দিতে ভুলে যেতে পারেন। তবে আমি মনে করি আমরা সকলেই এই বিষয়ে একমত হতে পারি যে আপনি যদি কোনও লাইব্রেরিটি ব্যবহার করতে চান ঠিক তেমন ব্যবহার করছেন না এমন অভ্যন্তরীণ বস্তুটি পুনরুদ্ধার করার জন্য প্রতিফলন ব্যবহার করে যদি আপনি কোনও ফিরড ফেকড অবজেক্টের সাথে छेলাবাজি করে থাকেন।
নীল

8

আপনি অন্যথায় নির্মাতা প্যাটার্ন ব্যবহার করতে পারেন যেমন @JacquesB বলছেন, তা চিন্তা করি তার কেন এটা আসলে যে তোমার এই বস্তু হল আছে তৈরির সময় চপল হতে?

অন্য কথায়, এগুলি তৈরির প্রক্রিয়াটি কেন সময় মতো ছড়িয়ে দিতে হবে, কারণ প্রয়োজনীয় সমস্ত মানগুলি কনস্ট্রাক্টারে প্রবেশ করে এবং একসাথে দৃষ্টান্ত তৈরি করার বিপরীতে?

কারণ নির্মাতা ভুল সমস্যার জন্য ভাল সমাধান হতে পারে।

যদি সমস্যাটি হ'ল আপনি যদি এমন কোনও কনস্ট্রাক্টরের সাথে সমাপ্ত হন যা 10 প্যারামিটার দীর্ঘ, এবং আপনি কিছুটা অল্প করে অবজেক্টটি তৈরি করে তা কমিয়ে দিতে চান তবে এটি ইঙ্গিত করতে পারে যে নকশাটি গণ্ডগোল হয়েছে এবং এই 10 টি মান হওয়া উচিত " ব্যাগযুক্ত "/ কয়েকটি বস্তুকে বিভক্ত করা হয়েছে ... বা মূল অবজেক্টকে কয়েকটি ছোট ছোট করে ভাগ করা হয়েছে ...

কোন ক্ষেত্রে - অপরিবর্তনীয়তা সমস্ত পথে আটকে থাকুন, কেবল নকশাটি উন্নত করুন।


কোডটি একাধিক ডাটাবেস কোয়েরি করে ডেটা পাওয়ার জন্য এটি একবারে তৈরি করা শক্ত হবে; এটি বিভিন্ন টেবিল এবং বিভিন্ন ডাটাবেসে ডেটা তুলনা করে।
পল রিচার্ডস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.