আমার সহকর্মীরা "লগিং / ক্যাচিং / ইত্যাদি ক্রস-কাটিং উদ্বেগ" বলতে পছন্দ করে এবং তারপরে সর্বত্র সংশ্লিষ্ট সিঙ্গলটন ব্যবহার করে এগিয়ে যান। তবুও তারা আইওসি এবং ডিআই পছন্দ করে।
SOLI D নীতিটি ভেঙে ফেলার জন্য এটি কি কোনও বৈধ অজুহাত ?
আমার সহকর্মীরা "লগিং / ক্যাচিং / ইত্যাদি ক্রস-কাটিং উদ্বেগ" বলতে পছন্দ করে এবং তারপরে সর্বত্র সংশ্লিষ্ট সিঙ্গলটন ব্যবহার করে এগিয়ে যান। তবুও তারা আইওসি এবং ডিআই পছন্দ করে।
SOLI D নীতিটি ভেঙে ফেলার জন্য এটি কি কোনও বৈধ অজুহাত ?
উত্তর:
না।
অনিবার্য পরিবর্তনের জন্য অ্যাকাউন্ট হিসাবে নির্দেশিকা হিসাবে সোলিড বিদ্যমান। আপনি কি সত্যিই কখনও আপনার লগিং লাইব্রেরি, বা লক্ষ্য, বা ফিল্টারিং, বা ফর্ম্যাটিং, বা ... পরিবর্তন করতে যাচ্ছেন না? আপনি কি সত্যিই আপনার ক্যাচিং লাইব্রেরি, বা লক্ষ্য, বা কৌশল, বা স্কোপিং, বা ... পরিবর্তন করবেন না?
অবশ্যই তুমি. এ অন্ততপক্ষে , আপনি একটি বিবেকী ভাবে এসব ঠাট্টা করার পরীক্ষার জন্য তাদের বিছিন্ন করতে চান যাচ্ছি। এবং যদি আপনি পরীক্ষার জন্য এগুলি বিচ্ছিন্ন করতে চান, আপনি সম্ভবত এমন কোনও ব্যবসায়িক কারণে চলে যাবেন যেখানে আপনি বাস্তব জীবনের কারণে এগুলি আলাদা করতে চান।
এবং তারপরে আপনি যুক্তিটি পাবেন যে লগার নিজেই পরিবর্তনটি পরিচালনা করবে। "ওহ, যদি লক্ষ্য / ফিল্টারিং / ফর্ম্যাটিং / কৌশল পরিবর্তন হয়, তবে আমরা কেবল কনফিগারটি পরিবর্তন করব!" তা হ'ল আবর্জনা। কেবলমাত্র এখনই Godশ্বরের অবজেক্ট নেই যা এই সমস্ত জিনিস পরিচালনা করে, আপনি আপনার কোডটি এক্সএমএল (বা অনুরূপ) তে লিখছেন যেখানে আপনি স্থির বিশ্লেষণ পান না, আপনি সংকলনের সময় ত্রুটিগুলি পান না এবং আপনি ' টি সত্যই কার্যকর ইউনিট পরীক্ষা পেতে।
SOLID নির্দেশিকা লঙ্ঘনের জন্য কি মামলা রয়েছে? একেবারে। কখনও কখনও জিনিসগুলি পরিবর্তন হবে না (যাইহোক পুরোপুরি পুনর্লিখনের প্রয়োজন ছাড়াই)। কখনও কখনও এলএসপির সামান্য লঙ্ঘন হ'ল পরিষ্কার সমাধান। কখনও কখনও বিচ্ছিন্ন ইন্টারফেস তৈরির কোনও মূল্য নেই।
তবে লগিং এবং ক্যাশিং (এবং অন্যান্য সর্বব্যাপী ক্রস কাটিয়া উদ্বেগ) সেগুলি নয়। আপনি যখন গাইডলাইনগুলিকে অগ্রাহ্য করেন তখন তারা সাধারণত মিলিত হওয়া এবং ডিজাইনের সমস্যাগুলির দুর্দান্ত উদাহরণ।
String
বা Int32
এমনকি বা List
আপনার মডিউল বাইরে। পরিবর্তনের জন্য পরিকল্পনা করা মাত্র একটি মাত্রার ক্ষেত্রে এটি যুক্তিসঙ্গত এবং বুদ্ধিমান । এবং, বেশিরভাগ সুস্পষ্ট "মূল" প্রকারের বাইরে, আপনার সম্ভবত কী কী পরিবর্তন হতে পারে তা নির্ধারণ করা সত্যই অভিজ্ঞতা এবং বিচারের বিষয়।
হ্যাঁ
এটি "ক্রস কাটিং উদ্বেগ" শব্দের পুরো বিন্দু - এর অর্থ এমন কিছু যা সলাইড নীতিতে ঝরঝরে ফিট করে না।
আদর্শবাদ বাস্তবতার সাথে মিলিত হয়।
সলিডে আধা-নতুন এবং ক্রস কাটিং প্রায়শই এই মানসিক চ্যালেঞ্জের মধ্যে পড়ে। ঠিক আছে, বাইরে বেরোনো না। সলাইডের শর্তে সবকিছু রাখার চেষ্টা করুন, তবে লগিং এবং ক্যাশিংয়ের মতো কয়েকটি জায়গা রয়েছে যেখানে সলিডের কোনও অর্থ হয় না। ক্রস কাটিংটি সলিডের ভাই, তারা একসাথে চলে।
HttpContextBase
(যা ঠিক এই কারণেই চালু হয়েছিল)। আমি নিশ্চিতভাবে জানি যে এই বাস্তবতা ছাড়াই আমার বাস্তবতা সত্যই টক হবে।
লগিংয়ের জন্য আমার মনে হয় এটি। লগিং বিস্তৃত এবং সাধারণত পরিষেবা কার্যকারিতার সাথে সম্পর্কিত নয়। লগিং ফ্রেমওয়ার্ক সিঙ্গলটন নিদর্শনগুলি ব্যবহার করার জন্য এটি সাধারণ এবং ভাল বোঝা। আপনি যদি না করেন তবে আপনি সর্বত্র লগার তৈরি এবং ইনজেকশন দিচ্ছেন এবং আপনি এটি চান না।
উপরের থেকে একটি বিষয় হ'ল কেউ বলবে 'তবে আমি কীভাবে লগিং পরীক্ষা করতে পারি?' । আমার চিন্তাভাবনাগুলি হ'ল আমি সাধারণত লগিং পরীক্ষা করি না, এই দাবি করেও যে আমি লগ ফাইলগুলি আসলে পড়তে পারি এবং সেগুলি বুঝতে পারি। যখন আমি দেখা করেছি লগিং পরীক্ষিত, এটি সাধারণত কারণ কেউ জাহির করা চাহিদা এর একটি বর্গ আসলে আছে যা সম্পন্ন কিছু এবং তারা যে প্রতিক্রিয়া পেতে লগ বার্তা ব্যবহার করছেন। আমি বরং সেই শ্রেনীতে কিছু শ্রোতা / পর্যবেক্ষক নিবন্ধিত করব এবং আমার পরীক্ষাগুলিতে দৃsert়তার সাথে দাবি জানাতে চাই। তারপরে আপনি সেই ইভেন্টের মধ্যে আপনার ইভেন্টের লগিং রাখতে পারেন।
আমি মনে করি, তবে ক্যাশে একটি সম্পূর্ণ ভিন্ন দৃশ্য।
আমার 2 সেন্ট ...
হ্যা এবং না.
আপনি যে নীতিগুলি গ্রহণ করেন তা সত্যই কখনও লঙ্ঘন করা উচিত নয় ; তবে, আপনার নীতিগুলি সর্বদা সংক্ষিপ্ত হওয়া উচিত এবং উচ্চতর লক্ষ্যে পরিষেবা গ্রহণ করা উচিত। সুতরাং, সঠিকভাবে শর্তযুক্ত বোঝার সাথে কিছু আপাত লঙ্ঘন "স্পিরিট" বা "সামগ্রিকভাবে নীতিগুলির মূল উপাদান" এর লঙ্ঘন নাও হতে পারে ।
বিশেষত সলিড নীতিগুলি প্রচুর উপদ্রব প্রয়োজনের সাথে সাথে "কার্যনির্বাহী, রক্ষণাবেক্ষণযোগ্য সফ্টওয়্যার সরবরাহ করা" লক্ষ্যটির চূড়ান্তভাবে অধীনতাযুক্ত। সুতরাং, সলাইডের লক্ষ্যগুলির সাথে দ্বন্দ্ব করার সময় কোনও নির্দিষ্ট সলাইড নীতিটি মেনে চলা আত্ম-পরাজিত এবং স্ব-বিরোধী। এবং এখানে, আমি প্রায়শই নোট করি যে সরবরাহকারী ট্রাম্প রক্ষণাবেক্ষণযোগ্যতা ।
সুতরাং, সম্পর্কে কি ডি এ কঠিন ? ঠিক আছে, এটি আপনার পুনরায় ব্যবহারযোগ্য মডিউলটিকে তার প্রসঙ্গে তুলনামূলকভাবে অজ্ঞেয়াদি তৈরি করে রক্ষণাবেক্ষণ বৃদ্ধিতে অবদান রাখে। এবং আমরা "পুনরায় ব্যবহারযোগ্য মডিউল "টিকে" অন্য একটি স্বতন্ত্র প্রসঙ্গে ব্যবহার করার জন্য আপনার পরিকল্পনা করা কোডের সংকলন "হিসাবে সংজ্ঞায়িত করতে পারি। এবং এটি একক ফাংশন, ক্লাস, শ্রেণীর সেট এবং প্রোগ্রামগুলিতে প্রযোজ্য।
এবং হ্যাঁ, লগার প্রয়োগগুলি পরিবর্তন করা আপনার মডিউলটিকে সম্ভবত "একটি অন্য স্বতন্ত্র প্রসঙ্গ" হিসাবে রাখে।
সুতরাং, আমাকে আমার দুটি বড় ক্যাভ্যাট অফার করুন :
প্রথমত: "একটি পুনরায় ব্যবহারযোগ্য মডিউল" গঠনের কোডগুলির ব্লকগুলির চারপাশে লাইনগুলি আঁকানো পেশাদার বিচারের বিষয়। এবং আপনার রায় অগত্যা আপনার অভিজ্ঞতার মধ্যে সীমাবদ্ধ।
আপনি যদি বর্তমানে অন্য কোনও প্রসঙ্গে মডিউলটি ব্যবহারের পরিকল্পনা না করেন তবে এটির উপর অসহায়ভাবে নির্ভর করা সম্ভবত এটি ঠিক। সাবধানবাণীকে সতর্ক করা: আপনার পরিকল্পনা সম্ভবত ভুল are তবে এটিও ঠিক। আপনি মডিউলের পরে মডিউলটি যত বেশি লিখবেন, "আরও কোনও দিন আমার আবার এটির দরকার হবে" কিনা আপনার ধারণাটি আরও ততোধিক এবং নির্ভুল হবে। তবে, আপনি সম্ভবত পূর্ববর্তী সময়ে বলতে সক্ষম হবেন না , "আমি যতটা সম্ভব সর্বাধিক পরিমাণে, কিন্তু অতিরিক্ত ছাড়াই সবকিছুকে মড্যুলারাইজড এবং ডিকোপল করেছি " "
বিচারের ক্ষেত্রে নিজের ত্রুটি সম্পর্কে যদি নিজেকে দোষী মনে হয় তবে স্বীকারোক্তিতে যান এবং এগিয়ে যান ...
দ্বিতীয়ত: ইনভার্টিং কন্ট্রোল ইনজেকশন নির্ভরতার সমান হয় না ।
এটি বিশেষত সত্য যখন আপনি নির্ভরশীলতা বিজ্ঞাপন বমি বমিভাব ইনজেকশন শুরু করেন । ডিপেন্ডেন্সি ইনজেকশন ওভাররচারিং আইওসি কৌশলটির জন্য একটি কার্যকর কৌশল। তবে, আমি যুক্তি দিয়েছি যে ডিআই কিছু অন্যান্য কৌশলগুলির চেয়ে কম কার্যকারিতা - যেমন ইন্টারফেস এবং অ্যাডাপ্টারগুলি ব্যবহার করে - মডিউলটির মধ্যে থেকে প্রসঙ্গের এক্সপোজারের একক পয়েন্ট।
এবং আসুন সত্যই এটি এক সেকেন্ডের জন্য ফোকাস করা যাক। কারণ, এমনকি যদি আপনি কোনও Logger
বিজ্ঞাপন বমিভাব ইনজেকশন করেন তবে আপনাকে Logger
ইন্টারফেসের বিরুদ্ধে কোড লিখতে হবে । আপনি অন্য কোনও Logger
বিক্রেতার কাছ থেকে কোনও নতুন ব্যবহার শুরু করতে পারেননি যা বিভিন্ন ক্রমে প্যারামিটার নেয়। এই ক্ষমতাটি কোডিং থেকে আসে, মডিউলটির মধ্যে, একটি ইন্টারফেসের বিপরীতে যা মডিউলটির মধ্যে বিদ্যমান এবং যার মধ্যে নির্ভরতা পরিচালনার জন্য এতে একটি একক সাবমডিউল (অ্যাডাপ্টার) থাকে।
এবং যদি আপনি কোনও অ্যাডাপ্টারের বিরুদ্ধে কোডিং করে থাকেন তবে Logger
সেই অ্যাডাপ্টারে ইনজেকশন দেওয়া আছে বা অ্যাডাপ্টারের দ্বারা আবিষ্কার করা হয়েছে কিনা তা পুরোপুরি রক্ষণাবেক্ষণের লক্ষ্যটির পক্ষে খুব সুন্দর নয়। এবং আরও গুরুত্বপূর্ণ, আপনার যদি মডিউল-স্তরের অ্যাডাপ্টার থাকে তবে এটি কোনও কিছুর মধ্যে ইনজেকশন করা কেবল অযৌক্তিক। এটি মডিউলটির জন্য লেখা ।
tl; dr - আপনি কেন নীতিগুলি ব্যবহার করছেন সে জন্য বিবেচনা না করে নীতিগুলি নিয়ে ফাটানো বন্ধ করুন। এবং আরও ব্যবহারিকভাবে, প্রতিটি মডিউলের জন্য কেবল একটি তৈরি করুন Adapter
। আপনি কোথায় "মডিউল" সীমানা আঁকবেন তা সিদ্ধান্ত নেওয়ার সময় আপনার রায় ব্যবহার করুন। প্রতিটি মডিউল মধ্যে থেকে, এগিয়ে যান এবং সরাসরি দেখুন Adapter
। এবং নিশ্চিত, উদ্বুদ্ধ বাস্তব মধ্যে এটির Adapter
কিন্তু - না প্রতি সামান্য জিনিস এটি প্রয়োজন হতে পারে মধ্যে।
লগিং সর্বদা সিঙ্গেলটন হিসাবে প্রয়োগ করা উচিত এই ধারণাটি প্রায়শই বলা হয়ে থাকে যে এটি মিথ্যা প্রমাণ পেয়েছে।
যতক্ষণ না আধুনিক অপারেটিং সিস্টেমগুলি রয়েছে এটি স্বীকৃত হয়েছে যে আপনি আউটপুটটির প্রকৃতির উপর নির্ভর করে একাধিক জায়গায় লগইন করতে পারেন ।
সিস্টেম ডিজাইনারদের অনাদায়ীভাবে নতুনগুলিতে অন্তর্ভুক্ত করার আগে অতীতের সমাধানগুলির কার্যকারিতা নিয়ে প্রশ্ন করা উচিত। যদি তারা এইরকম অধ্যবসায় না চালায় তবে তারা তাদের কাজটি করছে না।
সত্যিকারের লগইন করা একটি বিশেষ ক্ষেত্রে।
@ টেলাস্টিন লিখেছেন:
আপনি কি সত্যিই কখনও আপনার লগিং লাইব্রেরি, বা লক্ষ্য, বা ফিল্টারিং, বা ফর্ম্যাটিং, বা ... পরিবর্তন করতে যাচ্ছেন না?
যদি আপনি অনুমান করেন যে আপনার লগিং লাইব্রেরিটি পরিবর্তন করার প্রয়োজন হতে পারে, তবে আপনার উচিত একটি মুখোমুখি ব্যবহার করা; অর্থাৎ আপনি জাভা বিশ্বে থাকলে এসএলএফ 4 জে।
বাকী হিসাবে, একটি শালীন লগিং লাইব্রেরি লগিংটি কোথায় চলে যায়, কোন ইভেন্টগুলি ফিল্টার করা হয়, লগ কনফিগারেশন ফাইলগুলি ব্যবহার করে কীভাবে লগ ইভেন্টগুলি ফর্ম্যাট করা হয় এবং (যদি প্রয়োজন হয়) কাস্টম প্লাগইন ক্লাসের যত্ন নেয়। অফ-দ্য শেল্ফ বিকল্প রয়েছে।
সংক্ষেপে, এগুলি সমস্যাগুলি সমাধান করা হয় ... লগ করার জন্য ... এবং সেগুলি সমাধান করার জন্য নির্ভরতা ইনজেকশন ব্যবহার করার প্রয়োজন নেই।
আপনি যদি আবেদনের লগিং ইউনিট পরীক্ষার জন্য সাবজেক্ট করতে চান তবে কেবলমাত্র ডিআইই কার্যকর হতে পারে (স্ট্যান্ডার্ড লগিং পদ্ধতির উপরে)) সবচেয়ে ডেভেলপারদের যাইহোক, আমি সন্দেহ যে বলতে হবে লগিং একটি শ্রেণীর কার্যকারিতা অংশ, এবং না কিছু নয় চাহিদা পরীক্ষা করবে।
@ টেলাস্টিন লিখেছেন:
এবং তারপরে আপনি যুক্তিটি পাবেন যে লগার নিজেই পরিবর্তনটি পরিচালনা করবে। "ওহ, যদি লক্ষ্য / ফিল্টারিং / ফর্ম্যাটিং / কৌশল পরিবর্তন হয়, তবে আমরা কেবল কনফিগারটি পরিবর্তন করব!" তা হ'ল আবর্জনা। কেবলমাত্র এখনই Godশ্বরের অবজেক্ট নেই যা এই সমস্ত জিনিস পরিচালনা করে, আপনি আপনার কোডটি এক্সএমএল (বা অনুরূপ) তে লিখছেন যেখানে আপনি স্থির বিশ্লেষণ পান না, আপনি সংকলনের সময় ত্রুটিগুলি পান না এবং আপনি ' টি সত্যই কার্যকর ইউনিট পরীক্ষা পেতে।
আমি ভীত এটি খুব তাত্ত্বিক রিপোস্ট। অনুশীলনে, বেশিরভাগ বিকাশকারী এবং সিস্টেম ইন্টিগ্রেটাররা লগিংকে কোনও কনফিগার ফাইলের মাধ্যমে কনফিগার করতে পারেন তা পছন্দ করে। এবং তারা সত্যটি পছন্দ করে যে তারা কোনও মডিউলটির লগিং পরীক্ষা করার আশা করে না।
অবশ্যই, আপনি যদি লগিং কনফিগারগুলি পূরণ করেন তবে আপনি সমস্যা পেতে পারেন তবে সেগুলি অ্যাপ্লিকেশনটি প্রারম্ভকালে ব্যর্থ বা খুব বেশি / খুব কম লগিং হিসাবে প্রকাশ পাবে। 1) এই সমস্যাগুলি কনফিগার ফাইলে ভুল সংশোধন করে খুব সহজেই সংশোধন করা হয়। 2) বিকল্প হ'ল প্রতিটি সময় আপনি লগিং স্তরে পরিবর্তন আনলে একটি সম্পূর্ণ বিল্ড / বিশ্লেষণ / পরীক্ষা / নিযুক্ত চক্র। এটা গ্রহণযোগ্য নয়।
হ্যাঁ এবং না !
হ্যাঁ: আমি মনে করি এটা যুক্তিসঙ্গত যে পৃথক সাবসিস্টেমগুলি (বা শব্দার্থক স্তরগুলি বা লাইব্রেরিগুলি বা মডিউলার বান্ডিলিংয়ের অন্যান্য ধারণা) প্রত্যেকে একই সাধারণ অংশীদারি সিঙ্গলটনের উপর নির্ভর করে সমস্ত সাবসিস্টেমগুলির পরিবর্তে তাদের প্রারম্ভকালীন সময়ে একই (একই বা) সম্ভাব্য ভিন্ন লগার গ্রহণ করে ।
যাহোক,
না: প্রতিটি ছোট্ট অবজেক্টে (কনস্ট্রাক্টর বা উদাহরণ পদ্ধতি দ্বারা) লগিংকে প্যারামিটারাইজ করা একই সময়ে অযৌক্তিক। অপ্রয়োজনীয় এবং অর্থহীন ব্লাট এড়াতে, ছোট সংস্থাগুলি তাদের সংযুক্ত প্রসঙ্গে সিঙ্গলটন লগার ব্যবহার করা উচিত।
অনেকের মধ্যে স্তরের পরিমিতি সম্পর্কে চিন্তাভাবনা করার এটি একটি কারণ: পদ্ধতিগুলি ক্লাসগুলিতে বান্ডিল করা হয়, অন্যদিকে ক্লাসগুলি সাবসিস্টেম এবং / অথবা শব্দার্থ স্তরগুলিতে বান্ডিল হয়। এই বৃহত্তর বান্ডিলগুলি বিমূর্ত করার মূল্যবান সরঞ্জাম; এগুলি পেরিয়ে যাওয়ার চেয়ে আমাদের মডিউলারের সীমানার মধ্যে বিভিন্ন বিবেচনা দেওয়া উচিত।
প্রথমে এটি শক্তিশালী সিঙ্গলটন ক্যাশে শুরু হয়, পরবর্তী জিনিসগুলি আপনি বিশ্বব্যাপী রাষ্ট্র, class
এসএস এবং অকেস্টেবল কোডের অ-বর্ণনামূলক এপিআই প্রবর্তনকারী ডাটাবেস স্তরটির জন্য শক্তিশালী সিলেটলেটন।
আপনি যদি কোনও ডাটাবেসের জন্য সিঙ্গেলটন না রাখার সিদ্ধান্ত নেন তবে সম্ভবত ক্যাশের জন্য সিঙ্গলটন রাখা ভাল ধারণা নয়, সর্বোপরি, তারা কেবল একটি ভিন্ন প্রক্রিয়া ব্যবহার করে একটি খুব অনুরূপ ধারণা, ডেটা স্টোরেজ উপস্থাপন করে।
একটি ক্লাসে একটি সিঙ্গলটন ব্যবহার করে এমন একটি শ্রেণীর সুনির্দিষ্ট পরিমাণ নির্ভরশীলতা থাকে যা একটি তাত্ত্বিকভাবে , তাদের মধ্যে একটি অসীম সংখ্যার, কারণ আপনি কখনই জানেন না যে স্থির পদ্ধতির পিছনে কী লুকিয়ে আছে।
বিগত দশকে আমি প্রোগ্রামিংয়ে ব্যয় করেছি, কেবলমাত্র একটি ক্ষেত্রে আমি লগিংয়ের যুক্তি (যা তখন সিঙ্গলটন হিসাবে লেখা হয়েছিল) পরিবর্তন করার চেষ্টা প্রত্যক্ষ করেছি। সুতরাং যদিও আমি নির্ভরতা ইনজেকশনগুলিকে পছন্দ করি, লগিং সত্যিই এত বড় উদ্বেগ নয়। অন্যদিকে ক্যাশে, আমি অবশ্যই সর্বদা নির্ভরতা হিসাবে তৈরি করব।
হ্যাঁ এবং না, তবে বেশিরভাগই না
আমি ধরে নিই যে বেশিরভাগ কথোপকথন স্থির বনাম ইনজেকশনের উদাহরণের ভিত্তিতে। আমি অনুমান করি যে লগিংটি এসআরপি ভাঙ্গবে তা আমি ভাবি না? আমরা মূলত "নির্ভরতা বিপরীত নীতি" সম্পর্কে কথা বলছি। টিবিএইচ আমি বেশিরভাগই টেলাস্টিনের কোনও উত্তরের সাথে একমত নই।
কখন স্ট্যাটিক্স ব্যবহার করা ঠিক আছে? কারণ পরিষ্কারভাবে এটি কখনও কখনও ঠিক আছে। হ্যাঁ উত্তরগুলি অ্যাবস্ট্রাকশন এর benifits এবং "না" উত্তরগুলি নির্দেশ করে যে তারা আপনার জন্য অর্থ প্রদান করে। আপনার কাজ কঠিন হওয়ার কারণগুলির একটির একটি উত্তর নেই যা আপনি লিখে এবং সব পরিস্থিতিতে প্রয়োগ করতে পারেন।
গ্রহণ করা:
Convert.ToInt32("1")
আমি এটিকে পছন্দ করি:
private readonly IConverter _converter;
public MyClass(IConverter converter)
{
Guard.NotNull(converter)
_converter = conveter
}
....
var foo = _converter.ToInt32("1");
কেন? আমি স্বীকার করছি যে রূপান্তর কোডটি অদলবদলের জন্য আমার নমনীয়তার প্রয়োজন হলে আমার কোডটি রিফ্যাক্টর করতে হবে। আমি স্বীকার করছি যে আমি এটি উপহাস করতে সক্ষম হব না। আমি বিশ্বাস করি যে সরলতা এবং নিষ্ঠুরতা এই বাণিজ্যের জন্য মূল্যবান।
স্পেকট্রামের অন্য প্রান্তের দিকে তাকানো, যদি IConverter
এটি হয় তবে SqlConnection
আমি স্থির কল হিসাবে এটি দেখতে মোটামুটি ভীত হই। কারণগুলি স্পষ্টতই সুস্পষ্ট। আমি উল্লেখ করেছি যে একটি SQLConnection
প্রশংসনীয়ভাবে মোটামুটি "ক্রস কাটিং" হতে পারে, তাই আমি এই সঠিক শব্দ ব্যবহার না করতাম।
লগিং আরও SQLConnection
বা একটি মত Convert.ToInt32
? আমি আরও 'এসকিউএল সংযোগ'-এর মতো বলতে চাই `
আপনি লগিং উপহাস করা উচিত । এটি বাইরের বিশ্বের সাথে কথা বলে। ব্যবহার করে কোনও পদ্ধতি লেখার সময় Convert.ToIn32
, আমি ক্লাসের কিছু অন্য পৃথকভাবে পরীক্ষামূলক আউটপুট গণনা করার জন্য এটি একটি সরঞ্জাম হিসাবে ব্যবহার করছি। Convert
"1" + "2" == "3" যাচাই করার সময় আমাকে চেক করার দরকার নেই । লগিং আলাদা, এটি শ্রেণীর সম্পূর্ণরূপে অনিবার্য আউটপুট। আমি ধরে নিচ্ছি এটি একটি আউটপুট যা আপনার, সমর্থন দল এবং ব্যবসায়ের জন্য মূল্যবান। লগিং ঠিক না থাকলে আপনার শ্রেণিটি কাজ করছে না, তাই ইউনিট পরীক্ষা পাস করা উচিত নয়। আপনার ক্লাসটি কী লগ করে তা পরীক্ষা করা উচিত। আমি মনে করি এটি হত্যাকারী যুক্তি, আমি সত্যিই এখানে থামাতে পারতাম।
আমি এটিও মনে করি এটি এমন কিছু যা সম্ভবত পরিবর্তিত হতে পারে। ভাল লগিং কেবল স্ট্রিং মুদ্রণ করে না, এটি আপনার অ্যাপ্লিকেশনটি কী করছে তার একটি দৃষ্টিভঙ্গি (আমি ইভেন্ট ভিত্তিক লগিংয়ের একটি বড় অনুরাগী)। আমি বেশ বিস্তৃত রিপোর্টিং ইউআইগুলিতে বেসিক লগিংয়ের পালা দেখেছি। আপনার লগিং যদি _logger.Log(new ApplicationStartingEvent())
কম দেখায় এবং কম পছন্দ হয় তবে স্পষ্টতই এই দিকে এগিয়ে যাওয়া আরও সহজ Logger.Log("Application has started")
। কেউ তর্ক করতে পারে যে এটি এমন ভবিষ্যতের জন্য জায় তৈরি করছে যা কখনও ঘটতে পারে না, এটি একটি রায় আহ্বান এবং আমি এটির মূল্যবান বলে মনে করি।
আসলে আমার একটি ব্যক্তিগত প্রকল্পে, আমি _logger
অ্যাপ্লিকেশনটি কী করছে তা নির্ধারণের জন্য খালি ব্যবহার করে একটি অ লগিং ইউআই তৈরি করেছি। এর অর্থ হ'ল অ্যাপ্লিকেশনটি কী করছে তা নির্ধারণ করার জন্য আমাকে কোড লিখতে হবে না এবং আমি রক সলিড লগিংয়ের সাথে শেষ করেছি। আমার মনে হয় যদি লগিংয়ের বিষয়ে আমার মনোভাবটি এটি সহজ এবং অপরিবর্তনীয় ছিল তবে এই ধারণাটি আমার কাছে ঘটত না।
তাই আমি লগিংয়ের ক্ষেত্রে টেলাস্টিনের সাথে একমত হই।
Semantic Logging Application Block
। এটি ব্যবহার করবেন না, এমএস "প্যাটার্নস এবং প্র্যাটিস" টিম দ্বারা তৈরি বেশিরভাগ কোডের মতো, বিদ্রূপজনকভাবে, এটি একটি অ্যান্টিপ্যাটার্ন।
প্রথম ক্রস কাটা উদ্বেগগুলি প্রধান বিল্ডিং ব্লক নয় এবং কোনও সিস্টেমে নির্ভরতা হিসাবে বিবেচনা করা উচিত নয়। একটি সিস্টেমের কাজ করা উচিত যদি উদাঃ লগার শুরু না হয় বা ক্যাশে কাজ না করে। কীভাবে আপনি সিস্টেমকে কম সংযুক্ত এবং সমন্বিত করবেন? সোলিড ওও সিস্টেম ডিজাইনে ছবিতে আসে।
একক হিসাবে বস্তু রাখার সলিডের সাথে কোনও সম্পর্ক নেই। এটি আপনার অবজেক্টের লাইফ চক্রটি কতক্ষণ আপনি সেই বস্তুকে স্মৃতিতে বাঁচতে চান।
যে শ্রেণীর সূচনা করার জন্য নির্ভরতা দরকার সেগুলি অবশ্যই জানতে হবে না যে সরবরাহ করা শ্রেণীর উদাহরণটি সিঙ্গলটন বা ক্ষণস্থায়ী। কিন্তু tldr; আপনি যদি প্রতিটি পদ্ধতি বা ক্লাসে লগার লিখেন।ইনস্টান্স.লগ () লিখছেন তবে এটি সমস্যাযুক্ত কোড (কোড গন্ধ / হার্ড কাপলিং) সত্যিই অগোছালো। এই মুহুর্তে যখন লোকেরা এসআইএলআইডিকে আপত্তিজনক ব্যবহার শুরু করে। এবং ওপির মতো সহযোগী বিকাশকারীরা এই জাতীয় সত্য জিজ্ঞাসা করা শুরু করে।
উত্তরাধিকার এবং বৈশিষ্ট্যের সংমিশ্রণ (কিছু ভাষায় মিক্সিনও বলা হয়) ব্যবহার করে আমি এই সমস্যার সমাধান করেছি। এই ধরণের ক্রস কাটিয়া উদ্বেগ সমাধান করার জন্য বৈশিষ্ট্যগুলি অত্যন্ত কার্যকর। এটি সাধারণত একটি ভাষা বৈশিষ্ট্য যদিও আমি মনে করি আসল উত্তরটি এটি ভাষা বৈশিষ্ট্যের উপর নির্ভর করে।