প্রোগ্রামিং কনভেনশন সম্পর্কে কি ধারাবাহিকতা গ্রহণ করা উচিত?


14

কোনও ক্লাস ডিজাইনের সময় আচরণে ধারাবাহিকতা থাকা উচিত সাধারণ প্রোগ্রামিং অনুশীলনের চেয়ে? একটি নির্দিষ্ট উদাহরণ দিতে:

একটি সাধারণ কনভেনশনটি হ'ল: কোনও শ্রেণি যদি কোনও জিনিসের মালিক হয় (উদাহরণস্বরূপ এটি এটি তৈরি করেছে) এটি সম্পন্ন হওয়ার পরে এটি পরিষ্কার করার দায়বদ্ধ। একটি নির্দিষ্ট উদাহরণ। নেট এ থাকবে যে আপনার শ্রেণি যদি কোনও IDisposableবস্তুর মালিক হয় তবে এটি জীবনের শেষদিকে এটিকে নিষ্পত্তি করা উচিত। এবং আপনি যদি এটির মালিক না হন তবে এটি স্পর্শ করবেন না।

এখন আমরা StreamWriterNET এর ক্লাসটি যদি দেখি তবে ডকুমেন্টেশনে আমরা জানতে পারি যে এটি বন্ধ / নিষ্পত্তি হওয়ার সময় অন্তর্নিহিত স্ট্রিমটি বন্ধ করে দেয়। StreamWriterলেখক অন্তর্নিহিত ফাইল স্ট্রিম তৈরি করে এবং সেইজন্য এটি বন্ধ করতে হবে এমন ক্ষেত্রে ফাইলের নাম দিয়ে তা ইনস্ট্যান্ট করা হয় এমন ক্ষেত্রে এটি প্রয়োজনীয়। তবে একজন বাহ্যিক প্রবাহেও যেতে পারে যা লেখকও বন্ধ করে দেয়।

এটি আমাকে প্রচুর বিরক্ত করেছে (হ্যাঁ আমি জানি আপনি একটি নন-ক্লোজিং মোড়ক তৈরি করতে পারেন তবে এটি কোনও মুল বিষয় নয়) তবে স্পষ্টতই মাইক্রোসফ্ট সিদ্ধান্ত নিয়েছে যে সে যেদিকেই আসে না কেন প্রবাহটি সর্বদা বন্ধ করা আরও সুসংগত।

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

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

স্পষ্টতার জন্য সম্পাদনা করুন

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

উদাহরণস্বরূপ যেখানে এটি বিরক্তিকর:

ধরুন আপনার কাছে দুটি প্রদত্ত শ্রেণি রয়েছে (কিছু তৃতীয় পক্ষের গ্রন্থাগার থেকে) যা কিছু স্ট্রিমকে কিছু করার জন্য গ্রহণ করে যেমন কিছু ডেটা তৈরি এবং প্রক্রিয়াজাতকরণ:

 public class DataProcessor
 {
     public Result ProcessData(Stream input)
     {
          using (var reader = new StreamReader(input))
          {
              ...
          }
     }
 }

 public class DataSource
 {
     public void GetData(Stream output)
     {
          using (var writer = new StreamWriter(output))
          {
               ....
          }
     }
 }

এখন আমি এটি এর মতো ব্যবহার করতে চাই:

 Result ProcessSomething(DataSource source)
 {
      var processor = new DataProcessor();
      ...
      var ms = new MemoryStream();
      source.GetData(ms);
      return processor.ProcessData(ms);
 }

এটি Cannot access a closed streamডেটা প্রসেসরের ব্যতিক্রম সহ ব্যর্থ হবে । এটি কিছুটা নির্মান করা হয়েছে তবে পয়েন্টটি ব্যাখ্যা করা উচিত। এটি ঠিক করার বিভিন্ন উপায় রয়েছে তবে তবুও আমি অনুভব করি যে আমার এমন কিছু করা উচিত নয় যা আমার করা উচিত নয় work


স্ট্রাইমাইটার এর সচিত্র বর্ণন আপনার ব্যথার কারণ কেন তা বিশদে আলোচনা করতে আপত্তি করবেন? আপনি কি একই প্রবাহটি অন্য কোথাও গ্রাস করতে চান? কেন?
চাকরি

@ জোব: আমি আমার প্রশ্নটি পরিষ্কার করে দিয়েছি
ক্রিসউইউ

উত্তর:


9

আমিও এই কৌশলটি ব্যবহার করি, আমি এটিকে 'হ্যান্ডঅফ' বলি এবং আমি বিশ্বাস করি এটি কোনও প্যাটার্নের মর্যাদার দাবি রাখে। যখন কোনও বস্তু এ কোনও ডিসপোজেবল অবজেক্ট বি কে কনস্ট্রাকশন সময় প্যারামিটার হিসাবে গ্রহণ করে, তখন এটি 'হ্যান্ডঅফ' নামে একটি বুলিয়ানও গ্রহণ করে (যা মিথ্যাতে ডিফল্ট হয়), এবং যদি এটি সত্য হয়, তবে বি এর নিষ্পত্তি করার জন্য এ ক্যাসকেডগুলি নিষ্পত্তি করে disposal

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


দ্রষ্টব্য: আমি আমার ব্লগের একটি পোস্টে এই প্যাটার্নটির একটি আনুষ্ঠানিক সংজ্ঞা লিখেছি: michael.gr: "হ্যান্ডঅফ" প্যাটার্ন
মাইক নাকিস

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

@ সুপের্যাট আমি সম্মতি জানাই, তবে আমার শেষ বাক্যটির সাথে একটি সমস্যা রয়েছে: যদি হ্যান্ডঅফটি বর্তমানে-অধিষ্ঠিত আইটেমটির জন্য সত্য হয় তবে সদ্য সরবরাহকৃত আইটেমটি বর্তমান-অধিষ্ঠিত আইটেমটির সাথে সমান হয়, তারপরে বর্তমানের আইটেমটি নিষ্পত্তি করে সদ্য সরবরাহিত আইটেমটি নিষ্পত্তি কার্যকর হয়। আমি মনে করি একই জিনিস পুনরায় সরবরাহ করা অবৈধ হওয়া উচিত।
মাইক নকিস

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

3

আমি মনে করি আপনি ঠিক বলেছেন, সত্যি বলতে। আমি মনে করি যে মাইক্রোসফ্ট আপনার বিবরণী কারণগুলির জন্য, বিশেষত স্ট্রিম রাইটার শ্রেণীর সাথে গণ্ডগোল করেছে।

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


2

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

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

আপনি স্ট্রিমগুলিকে একটি সামঞ্জস্যপূর্ণ প্যাটার্ন হিসাবে বিবেচনা করতে পারেন যেখানে নকশার দৃষ্টিকোণ থেকে অবজেক্ট করা অবজেক্টটি অ-শেরেবল এবং অতএব কোনও অতিরিক্ত পতাকা ছাড়াই পাঠক / লেখক কেবল তার মালিকানা গ্রহণ করবেন।


আমি আমার প্রশ্নটি পরিষ্কার করে দিয়েছি - ধারাবাহিকতার সাথে আমি সর্বদা মালিকানা নেওয়ার আচরণটি বুঝি।
ক্রিসউইউ 12'12

2

সতর্ক হোন. আপনি "ধারাবাহিকতা" হিসাবে যা ভাবেন তা কেবল অভ্যাসের এলোমেলো সংগ্রহ হতে পারে।

"ধারাবাহিকতার জন্য ইউজার ইন্টারফেস সমন্বয়", সিগচি বুলেটিন 20, (1989), 63-65। দুঃখিত, কোনও লিঙ্ক নেই, এটি একটি পুরানো নিবন্ধ। "... 15 বিশেষজ্ঞের একটি দ্বি-কর্মশালা একটি ধারাবাহিকতার সংজ্ঞা তৈরি করতে অক্ষম ছিল।" হ্যাঁ, এটি "ইন্টারফেস" সম্পর্কে, তবে আমি বিশ্বাস করি যে আপনি যদি কিছু সময়ের জন্য "ধারাবাহিকতা" সম্পর্কে চিন্তা করেন, তবে আপনি এটির সংজ্ঞা দিতে পারবেন না find


আপনি ঠিক বলেছেন, বিশেষজ্ঞরা যদি বিভিন্ন চেনাশোনা থেকে একত্রিত হন তবে কোডটি বিকাশ করার সময়, আমি আমার টিমটি সম্পর্কে ইতিমধ্যে পরিচিত এমন কিছু বিদ্যমান প্যাটার্ন (বা অভ্যাসটি যদি আপনি চান তবে) অনুসরণ করা সহজ করে পেয়েছি। উদাহরণস্বরূপ, অন্য দিন আমাদের এক ছেলে আমাদের কিছু অযৌক্তিক ক্রিয়াকলাপ সম্পর্কে অনুসন্ধান করছিল এবং যখন আমি তাকে বললাম তারা উইন 32 ওভারল্যাপড আই / ও এর মতোই আচরণ করে, 30 সেকেন্ডে তিনি পুরো ইন্টারফেসটি বুঝতে পেরে ... এই ক্ষেত্রে উভয়ই আমি এবং তাকে একই সার্ভার থেকে উইন 32 পটভূমি ফিরে এসেছি। ধারাবাহিকতায় এফটিডব্লিউ! :)
ডিএক্সএম

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