স্ব-রেফারেন্সিয়াল পদ্ধতিতে শৃঙ্খলাবদ্ধ হওয়ার ক্ষেত্রে কি কোনও প্রকৃত ত্রুটি রয়েছে?


14

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

যাইহোক, এটি আমাকে এই ভেবে পেয়েছিল যে সম্ভবত কোনও কিছু ফেরানোর কথা নয় (যেমন সেটার) এমন পদ্ধতিতে সর্বদা "এটি" ফিরিয়ে দিয়ে আমি কোনও খারাপ অভ্যাসে জড়িত হতে পারি।

আমার প্রশ্ন হ'ল: পূর্ববর্তী সম্মেলন প্রয়োগকে খারাপ অভ্যাস বা অপব্যবহার হিসাবে বিবেচনা করা যেতে পারে? কেন ?. আমি মনে করি না পারফরম্যান্সের কোনও ত্রুটি আছে, বা আছে ?.



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

1
এসও তে, তারা আমাকে বলেছিল যে শৃঙ্খলা সি ++ - স্ট্যাকওভারফ্লো.com / প্রশ্নস / 755605555৫৫ / এর জন্য নয় - আপনি কী ভাবেন?
কাগালি-সান

1
@ মাহাম্ব্রা দেখে মনে হচ্ছে যে পদ্ধতিটি শৃঙ্খলাবদ্ধকরণ বাস্তবায়নের সময় আপনার কেবল সতর্কতা অবলম্বন করা উচিত এবং এর জন্য পরিষ্কার মান নির্ধারণ করা উচিত।
ডিউকোফগেমিং

উত্তর:


10

না

কেন্ট বেক যেমন উল্লেখ করেছেন, কোডটি লেখার চেয়ে অনেক বেশি বার পঠিত হয়।

যদি পদ্ধতি শৃঙ্খলা আপনার কোডটিকে আরও পঠনযোগ্য করে তোলে তবে পদ্ধতি চেইন ব্যবহার করুন use


1
দুর্দান্ত বই .. +1
রেন হেনরিচস

5
কিন্তু , কি আপনার শুধুমাত্র একটি গবেষনার পদ্ধতি আরো পাঠযোগ্য chaining হয় তাহলে কি হবে? যদি এটি সিলেটিস্টিক সমস্যা হয় তবে আপনার কোডিং কনভেনশনগুলির একটি সেট আটকে থাকবে: এর অর্থ, ধারাবাহিকতার জন্য বিদ্যমান কোড হিসাবে একই ফ্যাশনে লেখা in
coredump

@ কর্ডাম্প মনে হচ্ছে এটি ওপি'র কাছে ইতিমধ্যে করার জন্য বলা হয়েছে, তবে আমি মনে করি স্টিভেন কেবল এই জন্য বলছিলেন যদি পদ্ধতিতে শৃঙ্খলাবদ্ধতা আরও পাঠযোগ্য হয়।
Panzercrisis

1
@ পানজারক্রিসিস ওপিকে সুবিধাগুলি বনাম শব্দার্থকতার কারণে পদ্ধতি শৃঙ্খলাবদ্ধতা ব্যবহার করা থেকে বিরত থাকতে বলা হয়েছে। স্টিভেনের উত্তরটি মূলত "তা যাই হোক না কেন" বলে এবং কেবলমাত্র দলটির মতামত বা ধারাবাহিকতা বিবেচনা না করে ওপির কোডের পঠনযোগ্যতা বিবেচনা করে। যদি ওপি প্রকল্পের প্রতিটি বিদ্যমান বর্গকে আবার লিখতে চায় যাতে কোড পাঠযোগ্যতার সাথে তার স্বাদের স্যুট করে? এইভাবে আমি সুবিধে / শব্দার্থবিজ্ঞানের যুক্তিটি বুঝতে পারি: পদ্ধতিতে শৃঙ্খলাবদ্ধ হওয়ার "প্রযুক্তিগত" কারণ থাকতে হবে (বিটিডব্লিউ, সেই যুক্তিটিও মনে হয় যেন অন্য ব্যক্তি তার নিজস্ব পছন্দগুলির জন্য কোনও অজুহাত তৈরি করছে)
coredump

9

হ্যাঁ, ত্রুটি আছে

যে কোডটি পড়তে সহজ তা ভাল, তবে কোডটি কীভাবে যোগাযোগ করে তা থেকেও সাবধান থাকুন । যখন কোনও বস্তুর পদ্ধতি সর্বদা বস্তুটিকে ফেরত দেয়, তখন এটি কয়েকটি জিনিস যোগাযোগ করে:

  1. আমার কাছে উন্নত কনফিগারেশন প্রয়োজন যা প্রয়োজনীয় জিনিসগুলিতে অর্ডার করা উচিত বা কনফিগার করা উচিত obvious
  2. প্রতিটি পরবর্তী পদ্ধতি কল শেষটি তৈরি করে

বৈধ ব্যবহারের কেস: অ্যাডহক ডেটাবেস কোয়েরি

ক্লাস লাইব্রেরিগুলি বেশিরভাগ প্রতিটি ভাষায় বিদ্যমান থাকে যা আপনাকে হার্ড কোডড এসকিউএলকে অবলম্বন না করে কোনও ডাটাবেসের অনুসন্ধানের অনুমতি দেয় allow উদাহরণ হিসাবে NET- এর সত্তা ফ্রেমওয়ার্কটি নিন:

DBContext db = new DBContext();
List<Post> posts = db.Posts
    .Where(post => post.Title.Contains("Test"))
    .OrderBy(post => post.DateCreated)
    .ToList();

এটি একটি সাবলীল ইন্টারফেস যেখানে প্রতিটি পরবর্তী পদ্ধতি কলটি পূর্ববর্তীটিতে তৈরি করে। এই কলগুলি যৌক্তিকভাবে পড়া কোনও ডাটাবেস অনুসন্ধানের প্রসঙ্গে উপলব্ধি করে।

অবৈধ ব্যবহারের কেস: বৈশিষ্ট্য নির্ধারণের জন্য সিনট্যাকটিক্যাল সুগার

এবার Postক্লাসের সাথে একই প্যাটার্নটি ব্যবহার করা যাক :

public class Post
{
    public string Title { get; set; }
    public DateTime DateCreated { get; set; }
    public string Body { get; set; }

    public Post SetTitle(string title)
    {
        Title = title;

        return this;
    }

    public Post SetDateCreated(DateTime created)
    {
        DateCreated = created;

        return this;
    }

    public Post SetBody(string body)
    {
        Body = body;

        return this;
    }
}

আপনি এখন এই শ্রেণিটি কীভাবে ব্যবহার করবেন তা এখন দেখুন:

Post post = new Post()
    .SetTitle("Test")
    .SetDateCreated(DateTime.Now)
    .SetBody("Just a test");

যখন আমি এই কোডটি দেখি, আমি তাত্ক্ষণিকভাবে এই প্রশ্নটি জিজ্ঞাসা করি: "কল করার পরে SetBody, এটি কি ডেটাবেসকে কোয়েরি করে? 'আমি হয়ে গিয়েছি?' বলার জন্য কি আমাকে অন্য পদ্ধতি কল করার দরকার আছে?"

শৃঙ্খলিত পদ্ধতি কলগুলি ক্লাসটি ব্যবহার করে কোডটির সাথে কী যোগাযোগ করে Post?

  1. আমার একটা জটিল সেটআপ আছে
  2. প্রতিটি মেথড কল পূর্ববর্তীটিতে তৈরি করে

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

স্ব-রেফারেন্সিয়াল পদ্ধতিতে শৃঙ্খলাবদ্ধ হওয়ার অসুবিধাটি হ'ল আপনি যোগাযোগ করেন যে একাধিক পদ্ধতি কলগুলি কিছু করার জন্য প্রয়োজন এবং প্রতিটি কল শেষটি তৈরি করে। যদি এটি সত্য না হয়, তবে পদ্ধতি শৃঙ্খলাবদ্ধতা অন্য প্রোগ্রামারগুলিতে ভুল জিনিসটি যোগাযোগ করে।

যখন আপনার সহকর্মীরা বলেছেন:

সাবলীল ইন্টারফেসগুলি কেবল সুবিধার জন্য প্রয়োগ করা উচিত নয়, শব্দার্থবিজ্ঞানের জন্য

তারা একেবারে সঠিক ছিল। একটি সাবলীল ইন্টারফেস বা পদ্ধতিতে শৃঙ্খলাবদ্ধ হয়ে নিজের মধ্যে এবং এমন কিছু যোগাযোগ করে যা সম্ভবত সত্য নাও হতে পারে।


এটি ধরে নিয়েছে যে পদ্ধতিটি শৃঙ্খলাবদ্ধকরণ এবং জটিল কনফিগারেশন সর্বদা হাতে চলে। এগুলি স্বতন্ত্র সত্তা এবং একজনের উপস্থিতি আপনাকে অন্যটিকে ধরে নেবে না।
জ্যাক 14

এটি কেবল "জটিল কনফিগারেশন নয়, এটিও" পরবর্তী পদ্ধতিগুলির কলগুলি পূর্ববর্তীটি বন্ধ করে দেয় "। পদ্ধতি শৃঙ্খলাবদ্ধতা সম্পর্কে এটি সম্পর্কে একটি মেটা যোগাযোগ রয়েছে যা বর্গের উদ্দেশ্যে সর্বদা সত্য হয় না।
গ্রেগ বার্গার্ট

1
পরবর্তী পদ্ধতিগুলি পূর্বেরগুলির সাথে বিল্ডিং কলও পদ্ধতি চেইনের থেকে পৃথক, এবং আমি মনে করি না যে পদ্ধতির শৃঙ্খলার সিনট্যাক্সকে সাইড-এফেক্টিং ক্রিয়াকলাপের অর্ডার-নির্ভর সিরিজের শব্দার্থবিজ্ঞানের দৃ strong় যোগাযোগ হিসাবে চিকিত্সা করা নির্ভরযোগ্য বা দরকারী। এটি একটি সিনট্যাক্টিক শর্টহ্যান্ড, এর চেয়ে বেশি কিছুই নয়। এটি ব্যবহার করুন যেখানে এটি জিনিসকে আরও খাটো এবং আরও পাঠযোগ্য।
জ্যাক

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

1
When an object's methods always return the object, it communicates a couple of things- আমি মনে করি এটি একটি ব্যক্তিগত মতামত; দাবী করা শক্ত যে দাবি করা শৃঙ্খলিত পদ্ধতিগুলি প্রত্যেকে একই জিনিস গ্রহণ করবে।
স্যাম ডুফেল

1

প্রধান ত্রুটি হ'ল স্বচ্ছতার ক্ষতি। এই ক্ষেত্রে:

x.foo();
x.bar();
x.baz();

যেহেতু এই বিবৃতিগুলির কোনওটিই কোনও মান ফেরত দেয় না (বা যদি তারা তা করে থাকে তবে তা উপেক্ষা করা হয়েছে), তবে তারা কেবলমাত্র তখনই কার্যকর হতে পারে যদি তারা পার্শ্ব প্রতিক্রিয়া তৈরি করে। এর সাথে বিপরীতে:

x.foo()
 .bar()
 .baz();

প্রথমত, এটি স্পষ্ট নয় barএবং bazএকই ধরণের অবজেক্টগুলিতে চালিত হয় x, যদি না আপনি এই সত্যটির জন্য জানেন না যে xএই পদ্ধতিগুলির সাথে ক্লাসই একমাত্র শ্রেণি class এমনকি যদি এটি হয় তবে এটি পদ্ধতিগুলি xবা নতুন অবজেক্টগুলি পরিচালনা করে তা পরিষ্কার নয় ।

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


0

প্রোগ্রামিং ভাষার সমস্ত স্টাইলিস্টিক উপাদান বিবেচনা করুন (হ্যান্ড-কোডিং মেশিন ভাষার বিপরীতে) এবং এটি "শব্দার্থবিজ্ঞানের সুবিধার্থে নয়" যুক্তিটিকে দুর্বল করে।

প্রকৌশলী হিসাবে আমরা যা করি তার পুরোপুরি শব্দার্থবিজ্ঞানের আশেপাশে সুবিধা সরবরাহ করা হয়।

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