সি # 6.0 এর নতুন নাল-কন্ডিশনাল অপারেটর কি ডেমিটারের বিপরীতে চলে?


29

Demeter আইন মার্কিন যুক্তরাষ্ট্র নিম্নলিখিত:

  • প্রতিটি ইউনিটের অন্যান্য ইউনিট সম্পর্কে কেবল সীমিত জ্ঞান থাকা উচিত: কেবলমাত্র ইউনিট বর্তমান ইউনিটের সাথে "ঘনিষ্ঠভাবে" সম্পর্কিত।
  • প্রতিটি ইউনিট শুধুমাত্র তার বন্ধুদের সাথে কথা বলা উচিত; অপরিচিতদের সাথে কথা বলবেন না
  • কেবল আপনার নিকটবর্তী বন্ধুদের সাথে কথা বলুন।

সি # 6.0 নাল-কন্ডিশনাল অপারেটর নামে একটি নতুন অপারেটর প্রবর্তন করেছিল । আইএমএইচও, এটি কোডিং সহজ করে তোলে এবং পাঠযোগ্যতার উন্নতি করে। তবে এটি আরও সংযুক্ত কোড লেখার পক্ষে আরও সহজ করে তোলে, কারণ বর্গক্ষেত্রগুলির মধ্যে চলাচল করা সহজ, ইতোমধ্যে নালীর জন্য পরীক্ষা করা (যেমন কিছু var x = A?.B?.C?.D?.E?.F?)।

এই নতুন অপারেটরটি ডেমিটারের বিপরীতে চলেছে তা কি সঠিক?


2
আপনি কেন বিশ্বাস করেন যে A?.B?.C?.D?.E?.F?এটি লঙ্ঘন করবে - এলওডি কয়টি বিন্দু সম্পর্কে নয় এবং যদি কলিং পদ্ধতিতে কাঠামোর বিষয়ে এমন তথ্য থাকে যা এর পয়েন্টগুলির সাথে লঙ্ঘন করে না তবে এই ধরনের কলটি সম্পূর্ণ গ্রহণযোগ্য হবে। যেমন যে কোড পারে লোদ লঙ্ঘন বলতে চাই যে এটা সব ব্যবহারসমূহ যথেষ্ট নয় কি লঙ্ঘন লোদ।

14
" ডেমিটারের আইনটি কি একটি বিন্দু গণনা অনুশীলন নয় " পড়া? এটি এই সঠিক উদাহরণ নিয়ে আলোচনা করে ses
outis

@ আউটিস: অসাধারণ পড়া। আমি বলছি না যে আকারে প্রতিটি কোড X.Y.Z.W.U"আইন" লঙ্ঘন। তবে, কোডটি নিয়ে আমার অভিজ্ঞতা হিসাবে, 90% সময় এটি কেবল সাধারণ কদর্য যুগল কোড।
আর্থার রিজো

2
@ আর্থাররিজো কিন্তু নাল কন্ডিশনাল অপারেটর লোডের বিপরীতে যেতে সমস্যা নেই। এই কোডটিই দোষে রয়েছে। অপারেটর এটি কেবল মানুষের পড়া সহজ করার জন্য একটি সরঞ্জাম। .?বেশী লোদ লঙ্ঘন করে +বা -আছে।

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

উত্তর:


44

এই নতুন অপারেটরটি ডেমিটারের বিপরীতে চলেছে তা কি সঠিক?

না *


* নাল শর্তসাপেক্ষ অপারেটরটি ভাষা এবং .NET ফ্রেমওয়ার্কের মধ্যে একটি সরঞ্জাম। কোনও সরঞ্জামের এমনভাবে ব্যবহার করা যায় যা ব্যবহার করা যায় যা কোনও প্রদত্ত অ্যাপ্লিকেশনটির রক্ষণাবেক্ষণের ক্ষতি করতে পারে in

কিন্তু এটা সত্য যে একটি হাতিয়ার করতে কুট্টিত অগত্যা মানে এই নয় যে হতে হয়েছে নির্যাতিত করা, কিংবা টুল কোন বিশেষ নীতি (গুলি) অনুষ্ঠিত হতে পারে লঙ্ঘন করে।

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

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


foo = new FiveDMatrix(); foo.get(0).get(0).get(0).get(0).set(0,1);ভাল হবে (এবং এর চেয়ে খারাপ কোনও নয় foo[0][0][0][0][0] = 1) ... এবং এমন অনেকগুলি পরিস্থিতি যেখানে লোড লঙ্ঘন করে না।

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

(এবং, অবশ্যই, এই ধরণের অনুশীলনটি বহুমাত্রিক কাটনি কাটাকে বাস্তবায়ন করা সহজ করে তোলে এবং এর মধ্যে কিছু শক্তিশালী ম্যাট্রিক্স সরঞ্জাম রয়েছে))
জ্যাব

1
@ জ্যাব আমি কেবল একটি উদাহরণ নিয়ে আসার চেষ্টা করছিলাম। আরও ভাল একটি সম্ভবত এটি হবে Dom file = prase("some.xml"); file.get(tag1).getChild().get(tag2).getChild() ...- এটি কিছু বোবা কোডের গঠন প্রক্রিয়াজাতকরণের একটি বিষয়। এটি অপরিচিত নয় ... এটি কেবল বোবা। এই ধরনের কাঠামোর মধ্যে খুব দরকারী .?হয়ে ওঠে ।

10

প্রকার, রকম.

আপনি যদি কেবল একটি অ্যাক্সেস ( a?.Foo) করেন তবে তা সমান:

a == null ? null : a.Foo

যা বেশিরভাগ লোকেরা সম্মতি জানায় তা লেনদেনের আইন লঙ্ঘন নয়। সেই সময়ে, এটি পঠনযোগ্যতা উন্নত করার জন্য কেবল সিনট্যাকটিক চিনি।

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

এটি বলেছিল, এটি মনে রাখা দরকার যে ডেমিটারের আইনটি সে অনুযায়ী আইন নয়, তবে আরও একটি গাইডলাইন। প্রচুর কোড এটি লঙ্ঘন করে এবং ভালভাবে কাজ করে। কখনও কখনও ডিজাইনের সরলতা বা কোডের পরিমিতি লিমিটারের ল লঙ্ঘন করে যে ঝুঁকি নিয়ে আসে তার চেয়ে বেশি মূল্যবান।


যে এর চেয়ে আরো কিছু অগত্যা লোদ যেমন রচয়িতা প্যাটার্ন ভাঙে না
জে।

@ টেলাস্টিন: আমরা যে নতুন ভাষার বাক্য সিনট্যাক্সের কথা বলছি তা সমর্থন পদ্ধতির কলগুলিকে সমর্থন করে: a?.Func1(x)?.Func2(y) নাল কোয়েলসিং অপারেটরটি অন্য কিছু।
বেন ভয়েগট

@ বেনভয়েগ - আহ, আমি নিবন্ধটি বন্ধ করে দিচ্ছি, যা ইঙ্গিত করেছে যে এটি কেবল ক্ষেত্র, সম্পত্তি এবং সূচকগুলির সাথে কাজ করে। আমার কাছে MSVS2015 পরীক্ষা করার মতো কাজে লাগেনি। তুমি ঠিক.
টেলাস্টিন

1
a? .ফু একধরণের সমান নয় == নাল? নাল: a.Foo। প্রাক্তন একবার মাত্র মূল্যায়ন করে, পরবর্তীকালে এটি দুটিবার মূল্যায়ন করে। এটি যদি কোনও পুনরাবৃত্তিকারী হয় তবে তা বিবেচনা করতে পারে।
লরেন পেচটেল

9

না। আসুন উভয়কেই নিজস্ব হিসাবে বিবেচনা করুন এবং এর জন্য আপনার কাছে প্রচুর শিকলযুক্ত ব্যবহার রয়েছে।

বর্গমূল্যের .?Aবাম-মান এবং পদ্ধতিটি যেমন পদ্ধতিতে ফিরে আসে ঠিক তেমন শ্রেণীর জ্ঞানের পরিমাণের উপর তার নিজস্ব নির্ভর করে .A != null। প্রায় যে জানা প্রয়োজন Aসম্পত্তি বিদ্যমান এবং একটি মান যে সঙ্গে তুলনা করা যেতে পারে ফেরৎ null

আমরা কেবল যুক্তি করতে পারি যে টাইপ করা বৈশিষ্ট্যগুলি করলে এটি ডেমিটারের আইন লঙ্ঘন করে। এমনকি Aকংক্রিটের ধরণের হিসাবেও আমাদের বাধ্য করা হয় না (এর মান একটি উদ্ভূত ধরণের হতে পারে)। এখানে সংযুক্তি ন্যূনতম।

এখন বিবেচনা করা যাক var x = A?.B?.C?.D?.E?.F

যার অর্থ এটি Aঅবশ্যই এমন এক ধরণের হতে হবে যা নালাগুলি হতে পারে, বা কোনও Bসম্পত্তি থাকতে পারে, যা অবশ্যই এমন ধরণের হতে হবে যা শূন্য হতে পারে বা একটি Cসম্পত্তি থাকতে পারে , এবং যতক্ষণ না Eসম্পত্তি ধরণটি এমন কিছু হতে পারে যা শূন্য হতে পারে বা একটি Fসম্পত্তি থাকতে পারে ।

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

আমাদের যদি তা থাকে তবে নিম্নলিখিত কোডগুলিও আইন লঙ্ঘন করে:

ExplicitType x;
var b = A.B;
if (b == null)
  x = null;
else
{
  var c = b.C;
  if (c == null)
    x = null;
  else
  {
    var d = c.D;
    if (d == null)
      x = null;
    else
    {
      var e = d.E;
      if (e == null)
        x = null;
      else
        x = e.F;
    }
  }
}

যা হুবহু একই রকম । এই কোডটি বিভিন্ন উপাদানগুলির সংযোজন ব্যবহার করছে, কাপলিংয়ের সম্পূর্ণ শৃঙ্খলা সম্পর্কে "জেনে রাখা" দরকার, তবে এটি এমন কোড ব্যবহার করছে যা এটি করার জন্য ডেমিটারের আইন লঙ্ঘন করে না, প্রতিটি ইউনিটের সাথে একটি সুসংজ্ঞায়িত সংযুক্তি রয়েছে পরবর্তী.


3
+1 নতুন অপারেটর আপনার বর্ণিত তিক্ত রেসিপিটির জন্য কেবল সিনট্যাকটিক চিনি।
রস প্যাটারসন

1
ঠিক আছে, কোনও দেব যদি এমন একটি কোড লিখেন যা দেখে মনে হয় যে আমি মনে করি যে কিছু ঠিক আছে না সেদিকে লক্ষ্য করা আরও সহজ। আমি জানি যে অপারেটরটি 100% সিনট্যাটিক চিনি, তবে তবুও, আমি মনে করি যে লোকেরা var x = A?.B?.C?.D?.E?.Fশেষ পর্যন্ত একই থাকলেও / এলেসগুলি যদি সেগুলির চেয়ে অনেক বেশি লেখার মতো লেখার প্রবণতা অর্জন করে।
আর্থার রিজো

2
কোনও কিছু সঠিক না হওয়া লক্ষ্য করা সহজ, A?.B?.C?.D?.E?.Fকারণ এর চেয়ে কম কিছু ভুল হতে পারে; হয় আমাদের Fসেই পথটি পাড়ি দেওয়ার চেষ্টা করা উচিত , বা আমাদের হওয়া উচিত নয়, যদিও দীর্ঘতর ফর্মটির মধ্যে ত্রুটি থাকতে পারে পাশাপাশি এটি করার সঠিক জিনিস না হওয়ার ত্রুটিও থাকতে পারে।
জন হানা

@ আর্থাররিজো তবে আপনি যদি লোড লঙ্ঘনের সাথে উপরের ধরণের কোডটি সংযুক্ত করেন, তবে নাল চেকিংয়ের কোনও প্রয়োজন নেই এমন ক্ষেত্রে এগুলি মিস করা আপনার পক্ষে সহজ এবং আপনি কেবল এটি করতে পারেন A.B.C.D। একটি খুব অপ্রাসঙ্গিক বিশদ (নাল চেকিং) এর উপর নির্ভর করে দুটি পৃথক জিনিসের চেয়ে (জড়িত সম্পত্তি অ্যাক্সেস) সন্ধান করার জন্য একটি জিনিস খুঁজে পাওয়া অনেক সহজ
বেন অ্যারোনসন

5

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

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

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


ডেটা ধারণকারী অবজেক্টের ক্ষেত্রে কেন ডেমিটারের আইন প্রয়োগ হয় না?
টেলাস্টিন

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

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

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

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