সি # তে সাবলীল কখন যাবেন?


78

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

উপসংহার:

এখনও পর্যন্ত উত্তরগুলি থেকে থাম্বের কয়েকটি ভাল নিয়ম:

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

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

Employees.CreateNew().WithFirstName("Peter")
                     .WithLastName("Gibbons")
                     .WithManager()
                          .WithFirstName("Bill")
                          .WithLastName("Lumbergh")
                          .WithTitle("Manager")
                          .WithDepartment("Y2K");

ইনিশিয়ালাইজার সহ সহজেই লেখা যেতে পারে:

Employees.Add(new Employee()
              {
                  FirstName = "Peter",
                  LastName = "Gibbons",
                  Manager = new Employee()
                            {
                                 FirstName = "Bill",
                                 LastName = "Lumbergh",
                                 Title = "Manager",
                                 Department = "Y2K"
                            }
              });

আমি এই উদাহরণে কনস্ট্রাক্টরগুলিতে নামের পরামিতিগুলিও ব্যবহার করতে পারি।


1
ভাল প্রশ্ন, তবে আমি মনে করি এটি আরও উইকি প্রশ্ন
আইভো

আপনার প্রশ্নটি "সাবলীল-নিবার্ণ" ট্যাগ করা আছে। সুতরাং আপনি কি সিদ্ধান্ত নেওয়ার চেষ্টা করছেন যে কোনও সাবলীল ইন্টারফেস তৈরি করবেন , বা সাবলীল নিবারনেট বনাম এক্সএমএল কনফিগারেশন ব্যবহার করবেন কিনা ?
ইলিয়া কোগান

1
প্রোগ্রামার্স.এসই-তে স্থানান্তরিত হওয়ার পক্ষে ভোট দিয়েছেন
ম্যাট এলেন

ইলিয়া কোগান, আমি মনে করি এটি আসলে "সাবলীল ইন্টারফেস" ট্যাগ করা যা সাবলীল ইন্টারফেস প্যাটার্নের জন্য জেনেরিক ট্যাগ। এই প্রশ্নটি হাইপারনেট সম্পর্কিত নয়, তবে আপনি যেমন বলেছেন যে একটি সাবলীল ইন্টারফেস তৈরি করতে হবে কিনা। ধন্যবাদ।

1
এই পোস্টটি আমাকে সিটিতে এই প্যাটার্নটি ব্যবহার করার উপায় সম্পর্কে ভাবতে অনুপ্রাণিত করেছিল আমার প্রচেষ্টা কোড রিভিউ বোনের সাইটে পাওয়া যাবে ।
অটো

উত্তর:


28

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

অন্য কথায়, যদি আপনার কোডটি লিখিত (এবং কোন কোড নয়?) এর চেয়ে অনেক বেশি পড়তে হয় তবে আপনার সাবলীল ইন্টারফেস তৈরি করার বিষয়টি বিবেচনা করা উচিত।

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

  1. প্রসঙ্গ (সুতরাং যখন আপনি সাধারণত একই জিনিসটির সাথে ক্রমে অনেকগুলি ক্রিয়া করেন, আপনি আপনার প্রসঙ্গটি বারবার প্রকাশ না করেই ক্রিয়াগুলি শৃঙ্খলাবদ্ধ করতে পারেন)।
  2. আবিষ্কারযোগ্যতা (যখন আপনি objectA.তখন ইন্টেলিজেন্স আপনাকে প্রচুর ইঙ্গিত plm.Led.দেয় above উপরের আমার ক্ষেত্রে, আপনাকে বিল্ট-ইন এলইডি নিয়ন্ত্রণের জন্য সমস্ত বিকল্প plm.Network.দেয় এবং নেটওয়ার্ক ইন্টারফেসের সাথে আপনি যা করতে পারেন তা plm.Network.X10.আপনাকে দেয় gives আপনাকে সাবসেট দেয় এক্স 10 ডিভাইসের জন্য নেটওয়ার্ক ক্রিয়া। আপনি এটি কনস্ট্রাক্টর ইনিশিয়েলাইজারগুলির সাথে পাবেন না (যদি না আপনি প্রতিটি বিভিন্ন ধরণের ক্রিয়াকলাপের জন্য কোনও অবজেক্ট তৈরি করতে চান না, যা মূর্তিযুক্ত নয়)।
  3. প্রতিবিম্ব (উপরের উদাহরণে ব্যবহৃত হয়নি) - লিনকিউ এক্সপ্রেশনটিতে উত্তীর্ণ হওয়ার এবং এটির ব্যবহারের কৌশলটি একটি খুব শক্তিশালী সরঞ্জাম, বিশেষত কিছু সহায়ক এপিআই-র আমি ইউনিট পরীক্ষার জন্য তৈরি করেছি। আমি একটি সম্পত্তি গিটার এক্সপ্রেশন দিয়ে যেতে পারি, দরকারী এক্সপ্রেশনগুলির পুরো গোছাটি তৈরি করতে পারি, এটি সংকলন এবং পরিচালনা করতে পারি, বা এমনকি আমার প্রসঙ্গ সেটআপ করার জন্য সম্পত্তি গেটর ব্যবহার করতে পারি।

একটি জিনিস আমি সাধারণত করি:

test.Property(t => t.SomeProperty)
    .InitializedTo(string.Empty)
    .CantBeNull() // tries to set to null and Asserts ArgumentNullException
    .YaddaYadda();

সাবলীল ইন্টারফেস ছাড়া আপনি কীভাবে এমন কিছু করতে পারেন তা আমি দেখতে পাচ্ছি না।

সম্পাদনা 2 : আপনি পঠনযোগ্য পাঠযোগ্যতার আরও উন্নতি করতে পারেন, যেমন:

test.ListProperty(t => t.MyList)
    .ShouldHave(18).Items()
    .AndThenAfter(t => testAddingItemToList(t))
    .ShouldHave(19).Items();

উত্তরের জন্য আপনাকে ধন্যবাদ, তবে আমি সাবলীল ব্যবহারের কারণ সম্পর্কে সচেতন, তবে উপরের আমার নতুন উদাহরণের মতো এটির জন্য এটি ব্যবহার করার জন্য আরও দৃ concrete় কারণ খুঁজছি।
অ্যান্ড্রু হ্যানলন

বর্ধিত উত্তরের জন্য ধন্যবাদ। আমি মনে করি আপনি থাম্বের দুটি ভাল নিয়মটির রূপরেখা দিয়েছেন: 1) আপনার অনেকগুলি কল আসে যখন প্রসঙ্গে 'পাস-থ্রো' থেকে উপকৃত হন Fl 2) আপনার যখন সেটটারের চেয়ে বেশি কল আসে তখন ফ্লাইট সম্পর্কে ভাবুন।
অ্যান্ড্রু হ্যানলন

2
@ach, আমি "সেটটারের চেয়ে বেশি কল" সম্পর্কে এই জবাবটিতে কিছুই দেখতে পাচ্ছি না। "কোড [যা] এটি লেখা থেকে অনেক বেশি পড়া হয়" সম্পর্কে তাঁর বক্তব্য সম্পর্কে আপনি কি বিভ্রান্ত? এটি সম্পত্তি প্রাপ্তি / সেটারদের সম্পর্কে নয়, এটি কোড বনাম মানব পাঠানো মানুষের সম্পর্কে humans কোডটি মানুষের পক্ষে পড়া সহজ করার বিষয়ে - কারণ আমরা সাধারণত কোনও প্রদত্ত কোডের লাইনটি প্রায়শই পড়ি যতক্ষণ না আমরা এটি পরিবর্তন করি।
জো হোয়াইট

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

পরীক্ষার প্রতিফলন মন্দ!
অ্যাড্রোনিয়াস

24

স্কট হ্যানসেলম্যান জনাথন কার্টারের সাথে তাঁর পডকাস্ট হ্যানসেলিমিনেটের 260 পর্বে এ সম্পর্কে কথা বলেছেন । তারা ব্যাখ্যা করে যে অনর্গল ইন্টারফেসটি কোনও এপিআইতে ইউআই এর মতো। আপনার একমাত্র অ্যাক্সেস পয়েন্ট হিসাবে সাবলীল ইন্টারফেস সরবরাহ করা উচিত নয়, বরং এটি "নিয়মিত API ইন্টারফেস" এর শীর্ষে কোনও ধরণের কোড-ইউআই হিসাবে সরবরাহ করুন।

জোনাথন কার্টার তার ব্লগে এপিআই ডিজাইন সম্পর্কেও কিছুটা কথা বলেছেন ।


তথ্যের লিঙ্কগুলির জন্য অনেক ধন্যবাদ এবং এপিআই এর শীর্ষে ইউআই এটি দেখার একটি দুর্দান্ত উপায়।
অ্যান্ড্রু হ্যানলন

14

"ডান" যুক্তি সহকারে যখন ডন করা হয় তখন আপনার কোডের প্রেক্ষাপটে সরবরাহ করার জন্য প্রবাহিত ইন্টারফেসগুলি খুব শক্তিশালী বৈশিষ্ট্য।

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

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

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


উত্তরের জন্য ধন্যবাদ, একটি সুচিন্তিত প্রতিক্রিয়া জানাতে দেরি কখনও হয় নি।
অ্যান্ড্রু হ্যানলন 17

পদ্ধতিগুলির জন্য 'সহ' উপসর্গটি আমি আপত্তি করি না। এটি তাদের অন্যান্য পদ্ধতি থেকে আলাদা করে দেয় যা শৃঙ্খলার জন্য কোনও বস্তু ফেরায় না। যেমন position.withX(5)বনামposition.getDistanceToOrigin()
লেজেন্ডলেন্থ

5

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

Employees.CreateNew().WithFirstName("Peter")…

ইনিশিয়ালাইজার সহ সহজেই লেখা যেতে পারে:

Employees.Add(new Employee() { FirstName = "Peter",  });

আমার দৃষ্টিতে, এই দুটি সংস্করণটির অর্থ হওয়া উচিত এবং বিভিন্ন জিনিস করা উচিত।

  • অ অনর্গল সংস্করণটার মতো অনর্গল সংস্করণ সত্য যে নতুন লুকায় Employeeহয় Addসংগ্রহে ed Employees- এটি শুধুমাত্র দাড়ায় যে একটি নতুন অবজেক্ট Createঘ।

  • অর্থ ….WithX(…), দ্ব্যর্থক বিশেষত এফ #, যা একটি হয়েছে থেকে আসছে মানুষের জন্য withবস্তু এক্সপ্রেশন জন্য শব্দ : সেগুলিকে ব্যাখ্যা হতে পারে obj.WithX(x)হিসাবে একটি নতুন বস্তু উদ্ভূত হওয়া থেকে objযে অভিন্ন objতার জন্য ছাড়া Xসম্পত্তি, যার মান x। অন্যদিকে, দ্বিতীয় সংস্করণ সহ, এটি স্পষ্ট যে কোনও উদ্ভূত বস্তু তৈরি হয়নি, এবং সমস্ত বৈশিষ্ট্য মূল বস্তুর জন্য নির্দিষ্ট করা আছে।

….WithManager().With
  • এর ….With…আরও একটি অর্থ রয়েছে: সম্পত্তি শুরুর "ফোকাস" একটি ভিন্ন অবজেক্টে স্যুইচ করা। আপনার সাবলীল এপিআই এর দু'টি পৃথক অর্থ Withরয়েছে তা যা ঘটছে তা সঠিকভাবে ব্যাখ্যা করা কঠিন করে তোলে ... যার কারণ আপনি সম্ভবত এই কোডটির উদ্দেশ্যযুক্ত অর্থ প্রদর্শন করতে আপনার উদাহরণে ইনডেন্টেশন ব্যবহার করেছেন। এটি এর মতো আরও পরিষ্কার হবে:

    (employee).WithManager(Managers.CreateNew().WithFirstName("Bill").…)
    //                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    //                     value of the `Manager` property appears inside the parentheses,
    //                     like with `WithName`, where the `Name` is also inside the parentheses 

উপসংহার:new T { X = x } একটি সাবলীল এপিআই ( Ts.CreateNew().WithX(x)) সহ একটি সহজ-পর্যাপ্ত ভাষা বৈশিষ্ট্য "লুকিয়ে রাখা" অবশ্যই করা যেতে পারে তবে:

  1. ফলস্বরূপ সাবলীল কোডের পাঠকরা এখনও ঠিক বুঝতে পারে যে এটি কী করে তা অবশ্যই যত্ন নেওয়া উচিত। অর্থাত, সাবলীল এপিআই অর্থ স্বচ্ছ এবং স্বচ্ছ হওয়া উচিত। যেমন একটি এপিআই নকশা করা প্রত্যাশিত চেয়ে বেশি কাজ হতে পারে (এটি ব্যবহারের সহজলভ্যতা এবং গ্রহণযোগ্যতার জন্য পরীক্ষা করতে হতে পারে), এবং / অথবা…

  2. এটির নকশা করা প্রয়োজনের তুলনায় আরও বেশি কাজ হতে পারে: এই উদাহরণে, সাবলীল এপিআই অন্তর্নিহিত এপিআই (একটি ভাষার বৈশিষ্ট্য) এর তুলনায় খুব কম "ব্যবহারকারী স্বাচ্ছন্দ্য" যুক্ত করে। যে কেউ বলতে পারে যে একটি অনর্গল এপিআইয়ের অন্তর্নিহিত এপিআই / ভাষা বৈশিষ্ট্যটিকে "ব্যবহার করা সহজ" করা উচিত; এটি হ'ল প্রোগ্রামারের যথেষ্ট পরিমাণে প্রচেষ্টা বাঁচানো উচিত। যদি এটি একই জিনিস লেখার অন্য একটি উপায় হয় তবে এটি সম্ভবত এটির পক্ষে উপযুক্ত নয়, কারণ এটি প্রোগ্রামারের জীবনকে সহজ করে না, তবে কেবল ডিজাইনারের কাজকে আরও কঠিন করে তোলে (উপসংহার # 1 ডানদিকের উপরে দেখুন)।

  3. উপরের উভয় পয়েন্ট নিঃশব্দে ধরে নিই যে সাবলীল এপিআই একটি বিদ্যমান এপিআই বা ভাষা বৈশিষ্ট্যের উপরে একটি স্তর। এই অনুমানটি আরেকটি ভাল গাইডলাইন হতে পারে: একটি সাবলীল এপিআই একমাত্র উপায় নয়, কিছু করার অতিরিক্ত উপায় হতে পারে। এটি হ'ল "অপ্ট-ইন" পছন্দ হিসাবে একটি সাবলীল এপিআই সরবরাহ করা ভাল ধারণা হতে পারে।


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

2

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

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


আপনার জবাবের জন্য ধন্যবাদ, আমি মনে করি আপনি থাম্বের একটি ভাল নিয়ম প্রকাশ করেছেন: অনেক সেটারের মাধ্যমে অনেক কল দিয়ে সাবলীল ভাল better
অ্যান্ড্রু হ্যানলন

1

আমি সাবলীল ইন্টারফেস শব্দের সাথে পরিচিত ছিলাম না তবে এটি আমাকে লিনকু সহ বেশ কয়েকটি এপিআইয়ের স্মরণ করিয়ে দেয় ।

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

আপনার উল্লিখিত আধুনিক বৈশিষ্ট্যগুলির একটি ব্যবহার করে কীভাবে সাবলীল ইন্টারফেস প্রতিস্থাপন করা যায় তার একটি নিখুঁত উদাহরণ সহ আপনার উত্তরটি স্পষ্ট করে দিন।


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