একক দায়িত্বের নীতি নিয়ে লড়াই করা


11

এই উদাহরণ বিবেচনা করুন:

আমার একটা ওয়েবসাইট আছে এটি ব্যবহারকারীদের পোস্ট করতে (কিছু হতে পারে) করতে এবং ট্যাগগুলিকে পোস্টের বিবরণ যুক্ত করার অনুমতি দেয়। কোডটিতে আমার দুটি ক্লাস রয়েছে যা পোস্ট এবং ট্যাগগুলি উপস্থাপন করে। আসুন এই ক্লাসগুলিতে কল করুন Postএবং Tag

PostTagট্যাগ তৈরি , পোস্ট মুছে ফেলা, পোস্ট আপডেট করা ইত্যাদির যত্ন নেয় ইত্যাদি ট্যাগ তৈরি, ট্যাগ মোছা, ট্যাগ আপডেট করা ইত্যাদির যত্ন নেয়

একটি অপারেশন রয়েছে যা অনুপস্থিত। পোস্টগুলিতে ট্যাগগুলির লিঙ্কিং। কার এই অপারেশন করা উচিত তা নিয়ে আমি লড়াই করছি। এটি উভয় শ্রেণিতে সমানভাবে ফিট করতে পারে।

একদিকে Postক্লাসে একটি ফাংশন থাকতে পারে যা Tagপ্যারামিটার হিসাবে নেয় এবং তারপরে ট্যাগগুলির তালিকায় এটি সঞ্চয় করে। অন্যদিকে, Tagক্লাসে একটি ফাংশন থাকতে পারে যা Postএকটি প্যারামিটার হিসাবে নেয় এবং এর সাথে লিঙ্ক Tagকরে Post

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

এটি উভয় শ্রেণিতে স্থাপন করা সঠিক উত্তর?

উত্তর:


11

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

এটি একটি ভাল, কঠিন (শ্লেষকে ক্ষমা করার জন্য) গাইডলাইন, তবে এটি এড়িয়ে যাওয়া যতটা বিপজ্জনক, ততটা এটিকে উপেক্ষা করার মতোই dangerous

আপনি যদি কোনও পোস্টে কোনও পোস্ট যোগ করতে পারেন এবং তদ্বিপরীতভাবে, আপনি একক-দায়িত্ব নীতিটি ভঙ্গ করেন নি। উভয়ের এখনও পরিবর্তনের কেবল একটি কারণ রয়েছে - যদি সেই বস্তুর কাঠামো পরিবর্তন হয় changes একটির কাঠামো পরিবর্তন করা অন্যটির সাথে যুক্ত হওয়ার পদ্ধতি পরিবর্তন করে না, সুতরাং আপনি এটিতে একটি নতুন "দায়িত্ব" যুক্ত করছেন না।

আপনার চূড়ান্ত সিদ্ধান্তটি সামনের প্রান্তে প্রয়োজনীয় কার্যকারিতা দ্বারা সত্যই নির্ধারণ করা উচিত। কোনও পর্যায়ে কোনও পোস্টে ট্যাগ যুক্ত করার প্রয়োজন হতে পারে, সুতরাং নীচের মতো কিছু করুন:

// C-style-language pseudo-code
class Post {
    string _title;
    string _content;
    Date _date;
    List<Tag> _tags;

    Post(string title, string content) {
        _title = title;
        _content = content;
        _date = Now;
        _tags = new List<Tag>();
    }

    Tag[] getTags() {
        return _tags.toArray();
    }

    void addTag(Tag tag) {
        if (_tags.contains(tag)) {
            throw "Cannot add tag twice";
        }

        _tags.Add(tag);
        tag.referencePost(this);
    }

    // more stuff here, obviously
}

class Tag {
    string _name;
    List<Post> _posts;

    Tag(string name) {
        _name = name;
    }

    Post[] getPosts() {
        return _posts.toArray();
    }

    void referencePost(Post post) {
        if (!post.getTags().contains(this) || _posts.contains(post)) {
            throw "Only reference a post by calling Post.addTag()";
        }

        _posts.Add(post);
    }

    // more stuff here too
}

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


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

@ অ্যান্ড্রেসএফ: আমি আপনার সাথে একমত, সুতরাং আমি পরিষ্কারভাবে আমার উত্তর খুব ভাল লিখিনি। আমি উল্লেখযোগ্যভাবে সম্পাদনা করেছি। (পূর্ববর্তী উগ্রপন্থীর কাছে ক্ষমাপ্রার্থী যদি এটি আপনি যেমন দেখেছেন তেমন অর্থ পরিবর্তন করে))
পিডিআর

6

না, দুজনেই নয়! এটি এক জায়গায় হওয়া উচিত।

আপনার প্রশ্নে যা আমি বিরক্তিকর মনে করি তা হ'ল আপনি যা বলেছেন " Postপোস্ট তৈরি করা, পোস্ট মুছে ফেলার, পোস্টগুলি আপডেট করার ক্ষেত্রে" এবং এটির জন্য একই বিষয় Tag। ঠিক আছে, এটা ঠিক নয়। Postশুধুমাত্র আপডেট করার ক্ষেত্রে যত্ন নিতে পারে Tag। তৈরি করা এবং মোছা অন্য কারও কাজ, বাহ্যিক Postএবং Tag(আসুন আমরা এটি কল করি Store)।

এর জন্য ভাল দায়িত্ব Postহ'ল "এর লেখক, সামগ্রী এবং শেষ আপডেটের তারিখ জানেন" knows এর জন্য ভাল দায়িত্ব Tagহ'ল "এর নাম এবং উদ্দেশ্য জানেন (পড়ুন: বিবরণ)"। এর জন্য ভাল দায়িত্ব Storeহ'ল "সমস্ত পোস্ট এবং সমস্ত ট্যাগ জানে এবং সেগুলি যুক্ত করতে, সরিয়ে এবং অনুসন্ধান করতে পারে"।

আপনি যদি এই তিনজন অংশগ্রহণকারীকে লক্ষ্য করেন তবে সবচেয়ে স্বাভাবিকভাবেই কে যিনি পোস্ট-ট্যাগ সম্পর্কের জ্ঞান রাখবেন?

(আমার জন্য এটি পোস্ট, এটি "এটির ট্যাগগুলি জানেন" এটি স্বাভাবিক বলে মনে হয়; বিপরীত অনুসন্ধান (কোনও ট্যাগের জন্য সমস্ত পোস্ট) মনে হয় স্টোরের কাজ বলে মনে হচ্ছে; যদিও আমার ভুল হতে পারে))


যদি প্রতিটি পোস্টে ট্যাগগুলির একটি তালিকা থাকে এবং / অথবা প্রতিটি ট্যাগের মধ্যে এমন পোস্টগুলির একটি তালিকা থাকে যা এতে অন্তর্ভুক্ত থাকে তবে যে কোনও একটি "পোস্ট পোস্টে ট্যাগ ওয় অন্তর্ভুক্ত করে" এই প্রশ্নের উত্তর সহজেই দিতে পারে। ক্লাসকেই দায়িত্ব না নিয়ে দক্ষতার সাথে এ জাতীয় প্রশ্নের উত্তর দেওয়ার কোনও উপায় আছে কি না ConditionalWeakTable(যেমন ধরে নেওয়া যে এমন কোনও কাঠামো আছে যেখানে এমন একটি কাঠামো রয়েছে তার পক্ষে যথেষ্ট ভাগ্যবান)?
সুপারক্যাট

3

সমীকরণটি থেকে অনুপস্থিত একটি গুরুত্বপূর্ণ বিবরণ রয়েছে। কেন ট্যাগ পোস্ট এবং ভিসার বিপরীতে থাকে? এই প্রশ্নের উত্তর প্রতিটি প্রদত্ত সেটের সমাধান নির্ধারণ করে।

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

ট্যাগগুলির পোস্টও থাকতে পারে তবে আমার কাছে এটি কোনও স্থির সম্পর্ক নয়। বরং এটি পোস্টে থাকা সমস্ত পোস্টের একটি প্রতিবেদন হতে পারে। এক্ষেত্রে এটির একটি নতুন সত্তা নেই has


2

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

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


1

ব্যক্তিগতভাবে, আমি তাদের কারওর সাথে সেই কার্যকারিতা যুক্ত করব না।

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

পরিবর্তে, আমার কাছে আরও একটি শ্রেণি থাকবে যা আপনার ব্যবসায়িক যুক্তি এবং আপনার ওয়েব পৃষ্ঠার সাথে সম্পর্কিত ডেটার জন্য দায়ী। যদি আপনার পৃষ্ঠাটি কোনও পোস্ট প্রদর্শন করছে এবং ব্যবহারকারীদের ট্যাগ যুক্ত করার অনুমতি দিচ্ছে, তবে শ্রেণিতে একটি Postবিষয় থাকবে এবং এতে যুক্ত Tagsকরার জন্য কার্যকারিতা থাকবে Post। যদি আপনার পৃষ্ঠাটি ট্যাগ প্রদর্শন করছে এবং ব্যবহারকারীদের সেই ট্যাগগুলিতে পোস্টগুলি যুক্ত করতে দিচ্ছে, তবে এতে কোনও Tagঅবজেক্ট থাকবে এবং এতে যুক্ত Postsকরার জন্য কার্যকারিতা থাকবে Tag

এটা যদিও আমি ঠিক। আপনি যদি মনে করেন যে আপনাকে অবশ্যই আপনার ডেটা অবজেক্টগুলিতে ডাটাবেস কার্যকারিতা পরিচালনা করতে হবে তবে আমি পিডিআরের উত্তরটি সুপারিশ করব


0

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

পোস্ট দৃষ্টিকোণ থেকে ...
আপনার সম্পাদনা বা কোনও পোস্ট তৈরি করা যদি একটি গৌণ ক্রিয়াকলাপ ট্যাগ সম্পর্ক পরিচালনা করে ।

  1. পোস্টে বিদ্যমান ট্যাগ যুক্ত করুন
  2. পোস্ট থেকে ট্যাগ পুনরুদ্ধার করুন

আইএমও, সম্পূর্ণ নতুন ট্যাগ তৈরি এখানে অন্তর্ভুক্ত নয়।

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

এটি কেবল তখনই কাজ করবে যদি কোনও ডাটাবেস লিঙ্কিং টেবিল থাকে যা অনেকের সাথে বহু সম্পর্কের সমাধান করে

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