এতটুকুই কি "ক্রস কাটিং উদ্বেগ" বলা হয় এসআইএলডি / ডিআই / আইওসি ভাঙ্গার একটি বৈধ অজুহাত?


43

আমার সহকর্মীরা "লগিং / ক্যাচিং / ইত্যাদি ক্রস-কাটিং উদ্বেগ" বলতে পছন্দ করে এবং তারপরে সর্বত্র সংশ্লিষ্ট সিঙ্গলটন ব্যবহার করে এগিয়ে যান। তবুও তারা আইওসি এবং ডিআই পছন্দ করে।

SOLI D নীতিটি ভেঙে ফেলার জন্য এটি কি কোনও বৈধ অজুহাত ?


27
আমি খুঁজে পেয়েছি যে সলাইড নীতিগুলি কেবল তাদের জন্য কার্যকর যাদের ইতিমধ্যে অভিজ্ঞতা অজান্তেই যেকোনভাবে অনুসরণ করার প্রয়োজনীয় অভিজ্ঞতা রয়েছে।
এসভিডজেন

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

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

1
লগিং একটি বিশেষ ক্ষেত্রে বলে কেন আপনার কোনও উদাহরণ রয়েছে? আপনি কিছু এক্স ফ্রেমওয়ার্ক ব্যবহার করছেন এমন কিছু অংশে সাধারণত কিছু তথ্য পুনর্নির্দেশ করা এটি বেশ সরল চ্যানেল।
ksiimson

উত্তর:


42

না।

অনিবার্য পরিবর্তনের জন্য অ্যাকাউন্ট হিসাবে নির্দেশিকা হিসাবে সোলিড বিদ্যমান। আপনি কি সত্যিই কখনও আপনার লগিং লাইব্রেরি, বা লক্ষ্য, বা ফিল্টারিং, বা ফর্ম্যাটিং, বা ... পরিবর্তন করতে যাচ্ছেন না? আপনি কি সত্যিই আপনার ক্যাচিং লাইব্রেরি, বা লক্ষ্য, বা কৌশল, বা স্কোপিং, বা ... পরিবর্তন করবেন না?

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

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

SOLID নির্দেশিকা লঙ্ঘনের জন্য কি মামলা রয়েছে? একেবারে। কখনও কখনও জিনিসগুলি পরিবর্তন হবে না (যাইহোক পুরোপুরি পুনর্লিখনের প্রয়োজন ছাড়াই)। কখনও কখনও এলএসপির সামান্য লঙ্ঘন হ'ল পরিষ্কার সমাধান। কখনও কখনও বিচ্ছিন্ন ইন্টারফেস তৈরির কোনও মূল্য নেই।

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


22
আপনার তখন কী বিকল্প আছে? আপনার লেখার প্রতিটি ক্লাসে একটি আইলগার ইনজেকশন? লগার প্রয়োজন এমন প্রতিটি শ্রেণীর জন্য একটি সজ্জা রচনা লিখছেন?
রবার্ট হার্ভে

16
হ্যাঁ। কিছু যদি নির্ভরতা হয় তবে এটিকে নির্ভরতা বানাও । এবং যদি এর অর্থ যদি অনেক বেশি নির্ভরশীলতা হয় বা আপনি কোথাও কোনও লগার পাস করেন তবে এটি যাওয়া উচিত নয় - ভাল , এখন আপনি নিজের নকশাটি ঠিক করতে পারেন।
টেলাস্টিন


20
বাস্তব সমস্যা আমি মতবাদ আইওসি সঙ্গে আছে প্রায় কাছাকাছি হয় সব আধুনিক কোডের উপর নির্ভর করে কিছু যে তন্ন তন্ন ইনজেকশনের কিংবা আনমনা হয় দূরে। আপনি লিখতে সি #, উদাহরণস্বরূপ, তাই না প্রায়ই বিমূর্ত চলুন Stringবা Int32এমনকি বা Listআপনার মডিউল বাইরে। পরিবর্তনের জন্য পরিকল্পনা করা মাত্র একটি মাত্রার ক্ষেত্রে এটি যুক্তিসঙ্গত এবং বুদ্ধিমান । এবং, বেশিরভাগ সুস্পষ্ট "মূল" প্রকারের বাইরে, আপনার সম্ভবত কী কী পরিবর্তন হতে পারে তা নির্ধারণ করা সত্যই অভিজ্ঞতা এবং বিচারের বিষয়।
এসভিডজেন

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

38

হ্যাঁ

এটি "ক্রস কাটিং উদ্বেগ" শব্দের পুরো বিন্দু - এর অর্থ এমন কিছু যা সলাইড নীতিতে ঝরঝরে ফিট করে না।

আদর্শবাদ বাস্তবতার সাথে মিলিত হয়।

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


9
একটি যুক্তিযুক্ত, ব্যবহারিক, অ-গোপনীয় উত্তর।
ব্যবহারকারী 1936

11
আপনি কি দয়া করে আমাদের বলতে পারেন যে পাঁচটি নল নীতি ক্রস কাটানোর উদ্বেগের কারণে কেন ভেঙে যায়? এটা বুঝতে আমার সমস্যা আছে।
ডক ব্রাউন

4
হ্যাঁ। আমি প্রতিটি নীতি স্বতন্ত্রভাবে "ব্রেক" করার একটি ভাল কারণের সম্ভাবনা নিয়ে ভাবতে পারি; তবে 5 টি ভাঙার একক কারণ নয়!
এসভিডজেন

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

2
@ দেবনুল হয়তো তখনই ইস্যুটি হবে, ক্রস কাটানোর বিষয়ে তাদের নিজেদের চিন্তার চেয়ে ...
বরিস স্পাইডার

25

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

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

আমি মনে করি, তবে ক্যাশে একটি সম্পূর্ণ ভিন্ন দৃশ্য।


3
এতক্ষণে আমি এফপিতে কিছুটা ডাবলড হয়ে আসার পরে আমি লগিং, ত্রুটি পরিচালনা ইত্যাদির মতো জিনিসগুলিকে আপনার ব্যবহারের ক্ষেত্রে এম্বেড করার জন্য ফাংশন রচনা (সম্ভবত মোনাডিক) ব্যবহারের বৃহত আগ্রহ বাড়াতে পেরেছি, এটি কোনও ব্যবসায়িক যুক্তিতে না রেখে ( দেখুন fsharpforfunandprofit.com/rop )
সারা

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

12
@ রাবারডাক - আমাকে বলুন যে যখন আমি ক্ষেত্র থেকে বাগ রিপোর্ট পেয়েছি এবং "কী ঘটেছিল তা কেবলমাত্র আমি বুঝতে পেরেছিলাম যে লগিংটি আমি বিস্তৃত করতে চাইনি। পাঠ শিখেছি, লগিং "বিস্তৃত" হওয়া উচিত, খুব বিস্তৃত।
ডঙ্ক

15
@ রাবারডাক: সার্ভার সফ্টওয়্যার দ্বারা লগইন করা বেঁচে থাকার একমাত্র উপায়। আপনার নিজের ল্যাপটপে এখনই পরিবর্তে 12 ঘন্টা আগে ঘটে যাওয়া বাগটি খুঁজে বের করার একমাত্র উপায়। গোলমাল নিয়ে চিন্তা করবেন না। লগ ম্যানেজমেন্ট সফ্টওয়্যার ব্যবহার করুন যাতে আপনি আপনার লগটি জিজ্ঞাসা করতে পারেন (আদর্শভাবে আপনার অবশ্যই
বিপদগুলির

6
আমাদের সমর্থন কর্মীরা আমাকে কল করে আমাকে জানান "গ্রাহক কিছু পৃষ্ঠাগুলি ক্লিক করছে এবং একটি ত্রুটি পপ আপ হয়েছে।" আমি তাদের জিজ্ঞাসা করি ত্রুটিটি কী বলেছিল, তারা জানে না। আমি জিজ্ঞাসা করেছি গ্রাহক বিশেষত কী ক্লিক করেছেন, তারা জানেন না। আমি জিজ্ঞাসা করি তারা পুনরুত্পাদন করতে পারে কিনা, তারা পারে না। আমি সম্মত হ'ল লগিং বেশিরভাগ মূল হিনেজ পয়েন্টগুলিতে ভাল মোতায়েন করা লগারের সাথে অর্জন করা যেতে পারে তবে এখানে অদ্ভুত বার্তা খুব ভাল এবং অমূল্যও রয়েছে। লগিংয়ের ভয় নিম্ন মানের সফ্টওয়্যারকে নিয়ে যায়। যদি আপনি খুব বেশি ডেটা শেষ করেন তবে পিছনে ছাঁটাই করুন। অকালে অপ্টিমাইটিস করবেন না।
পেস

12

আমার 2 সেন্ট ...

হ্যা এবং না.

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

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

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

এবং হ্যাঁ, লগার প্রয়োগগুলি পরিবর্তন করা আপনার মডিউলটিকে সম্ভবত "একটি অন্য স্বতন্ত্র প্রসঙ্গ" হিসাবে রাখে।

সুতরাং, আমাকে আমার দুটি বড় ক্যাভ্যাট অফার করুন :

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

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

বিচারের ক্ষেত্রে নিজের ত্রুটি সম্পর্কে যদি নিজেকে দোষী মনে হয় তবে স্বীকারোক্তিতে যান এবং এগিয়ে যান ...

দ্বিতীয়ত: ইনভার্টিং কন্ট্রোল ইনজেকশন নির্ভরতার সমান হয় না ।

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

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

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

tl; dr - আপনি কেন নীতিগুলি ব্যবহার করছেন সে জন্য বিবেচনা না করে নীতিগুলি নিয়ে ফাটানো বন্ধ করুন। এবং আরও ব্যবহারিকভাবে, প্রতিটি মডিউলের জন্য কেবল একটি তৈরি করুন Adapterআপনি কোথায় "মডিউল" সীমানা আঁকবেন তা সিদ্ধান্ত নেওয়ার সময় আপনার রায় ব্যবহার করুন। প্রতিটি মডিউল মধ্যে থেকে, এগিয়ে যান এবং সরাসরি দেখুন Adapter। এবং নিশ্চিত, উদ্বুদ্ধ বাস্তব মধ্যে এটির Adapterকিন্তু - না প্রতি সামান্য জিনিস এটি প্রয়োজন হতে পারে মধ্যে।


4
মানুষ ... আমি একটি ছোট উত্তর দিতে হবে, কিন্তু আমার সময় ছিল না।
এসভিডজেন

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

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

আমি যখনই কোনও পুরানো উত্তরের জন্য +1 বা মন্তব্য দেখি, আমি আমার উত্তরটি আবার পড়ি এবং আবারও আবিষ্কার করে দেখি যে আমি একটি ভয়াবহভাবে বিশৃঙ্খলাবদ্ধ এবং অস্পষ্ট লেখক ... যদিও আমি এই মন্তব্যটির প্রশংসা করি, @ ডিভিকে।
এসভিডজেন

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

8

লগিং সর্বদা সিঙ্গেলটন হিসাবে প্রয়োগ করা উচিত এই ধারণাটি প্রায়শই বলা হয়ে থাকে যে এটি মিথ্যা প্রমাণ পেয়েছে।

যতক্ষণ না আধুনিক অপারেটিং সিস্টেমগুলি রয়েছে এটি স্বীকৃত হয়েছে যে আপনি আউটপুটটির প্রকৃতির উপর নির্ভর করে একাধিক জায়গায় লগইন করতে পারেন ।

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


2
তাহলে আপনার প্রস্তাবিত সমাধান কী? আপনি লেখার প্রতিটি ক্লাসে এটি কি আইলোগার ইনজেকশন দিচ্ছে? ডেকোরেটার প্যাটার্ন ব্যবহার সম্পর্কে কী?
রবার্ট হার্ভে

4
সত্যিই এখন আমার প্রশ্নের উত্তর দিচ্ছে না, তাই না? আমি নিদর্শনগুলিকে নিছক উদাহরণ হিসাবে বর্ণনা করেছি ... আপনার মনে আরও ভাল কিছু থাকলে এটি হওয়া উচিত নয়।
রবার্ট হার্ভে

8
আমি এই উত্তরটি সত্যিই বুঝতে পারি না, কোনও কংক্রিট প্রস্তাবের শর্তে
ব্রায়ান অ্যাগনিউ

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

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

4

সত্যিকারের লগইন করা একটি বিশেষ ক্ষেত্রে।

@ টেলাস্টিন লিখেছেন:

আপনি কি সত্যিই কখনও আপনার লগিং লাইব্রেরি, বা লক্ষ্য, বা ফিল্টারিং, বা ফর্ম্যাটিং, বা ... পরিবর্তন করতে যাচ্ছেন না?

যদি আপনি অনুমান করেন যে আপনার লগিং লাইব্রেরিটি পরিবর্তন করার প্রয়োজন হতে পারে, তবে আপনার উচিত একটি মুখোমুখি ব্যবহার করা; অর্থাৎ আপনি জাভা বিশ্বে থাকলে এসএলএফ 4 জে।

বাকী হিসাবে, একটি শালীন লগিং লাইব্রেরি লগিংটি কোথায় চলে যায়, কোন ইভেন্টগুলি ফিল্টার করা হয়, লগ কনফিগারেশন ফাইলগুলি ব্যবহার করে কীভাবে লগ ইভেন্টগুলি ফর্ম্যাট করা হয় এবং (যদি প্রয়োজন হয়) কাস্টম প্লাগইন ক্লাসের যত্ন নেয়। অফ-দ্য শেল্ফ বিকল্প রয়েছে।

সংক্ষেপে, এগুলি সমস্যাগুলি সমাধান করা হয় ... লগ করার জন্য ... এবং সেগুলি সমাধান করার জন্য নির্ভরতা ইনজেকশন ব্যবহার করার প্রয়োজন নেই।

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

@ টেলাস্টিন লিখেছেন:

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

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

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


3

হ্যাঁ এবং না !

হ্যাঁ: আমি মনে করি এটা যুক্তিসঙ্গত যে পৃথক সাবসিস্টেমগুলি (বা শব্দার্থক স্তরগুলি বা লাইব্রেরিগুলি বা মডিউলার বান্ডিলিংয়ের অন্যান্য ধারণা) প্রত্যেকে একই সাধারণ অংশীদারি সিঙ্গলটনের উপর নির্ভর করে সমস্ত সাবসিস্টেমগুলির পরিবর্তে তাদের প্রারম্ভকালীন সময়ে একই (একই বা) সম্ভাব্য ভিন্ন লগার গ্রহণ করে ।

যাহোক,

না: প্রতিটি ছোট্ট অবজেক্টে (কনস্ট্রাক্টর বা উদাহরণ পদ্ধতি দ্বারা) লগিংকে প্যারামিটারাইজ করা একই সময়ে অযৌক্তিক। অপ্রয়োজনীয় এবং অর্থহীন ব্লাট এড়াতে, ছোট সংস্থাগুলি তাদের সংযুক্ত প্রসঙ্গে সিঙ্গলটন লগার ব্যবহার করা উচিত।


অনেকের মধ্যে স্তরের পরিমিতি সম্পর্কে চিন্তাভাবনা করার এটি একটি কারণ: পদ্ধতিগুলি ক্লাসগুলিতে বান্ডিল করা হয়, অন্যদিকে ক্লাসগুলি সাবসিস্টেম এবং / অথবা শব্দার্থ স্তরগুলিতে বান্ডিল হয়। এই বৃহত্তর বান্ডিলগুলি বিমূর্ত করার মূল্যবান সরঞ্জাম; এগুলি পেরিয়ে যাওয়ার চেয়ে আমাদের মডিউলারের সীমানার মধ্যে বিভিন্ন বিবেচনা দেওয়া উচিত।


3

প্রথমে এটি শক্তিশালী সিঙ্গলটন ক্যাশে শুরু হয়, পরবর্তী জিনিসগুলি আপনি বিশ্বব্যাপী রাষ্ট্র, classএসএস এবং অকেস্টেবল কোডের অ-বর্ণনামূলক এপিআই প্রবর্তনকারী ডাটাবেস স্তরটির জন্য শক্তিশালী সিলেটলেটন।

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

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

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


হ্যাঁ, লগিং খুব কমই পরিবর্তিত হয় এবং সাধারণত একটি অদলবদল মডিউল হতে হবে না। যাইহোক, আমি একবার লগিং সহায়তা সহায়ক শ্রেণীর ইউনিট-টেস্ট করার চেষ্টা করেছি, যার লগিং সিস্টেমের উপর স্থির নির্ভরতা ছিল। আমি এটি টেস্টেবল করার সহজতম প্রক্রিয়াটি হ'ল এটি হবে একটি পৃথক প্রক্রিয়াতে পরীক্ষার অধীনে ক্লাস পরিচালনা করা, এটির লগারটি STDOUT এ লেখার জন্য কনফিগার করা এবং সেই পরীক্ষার ক্ষেত্রে সেই আউটপুটটি পার্স করা ಠ_ಠ আপনি যে ঘড়ির সাথে একই রকম অভিজ্ঞতা পেয়েছি সেখানে আপনি ' ডি স্পষ্টতই আসল সময় ছাড়া কিছুই চান না, তাই না? যখন সময় অঞ্চল / ডিএসটি প্রান্ত মামলা পরীক্ষা অবশ্যই ব্যতীত ...
আমন

@ এমন: ঘড়িগুলি লগ ইন করার মতো যে ইতিমধ্যে অন্য একটি প্রক্রিয়া রয়েছে যা ডিআই হিসাবে একই উদ্দেশ্যে কাজ করে, যথা জোদা-সময় এবং এর অনেকগুলি বন্দর। (পরিবর্তে ডিআই ব্যবহারে কোনও সমস্যা নেই তা নয়; তবে কাস্টম ইনজেকশনাল অ্যাডাপ্টার লেখার চেষ্টা করার চেয়ে জোদা-টাইম সরাসরি ব্যবহার করা সহজ, এবং আমি এরকম কাউকে কখনও আফসোস করতে দেখিনি))
রুখ

@amon "আমার ঘড়ির সাথে একই রকম অভিজ্ঞতা হয়েছে যেখানে আপনি সম্ভবত আসল সময় ছাড়া আর কিছু চান না, তাই না? সময় অঞ্চল / ডিএসটি প্রান্তের ক্ষেত্রে অবশ্যই পরীক্ষা করার সময় বাদে অবশ্যই…" - অথবা আপনি যখন বুঝতে পারেন যে কোনও বাগ রয়েছে আপনার ডাটাবেসটিকে দূষিত করেছে এবং এটি ফিরে আসার একমাত্র আশা হ'ল আপনার ইভেন্ট লগটি পার্স করা এবং এটি শেষ ব্যাকআপ থেকে শুরু করে পুনরায় খেলুন ... তবে হঠাৎ আপনার বর্তমান কোডের পরিবর্তে বর্তমান লগ এন্ট্রির টাইমস্ট্যাম্পের ভিত্তিতে আপনার সমস্ত কোডের প্রয়োজন সময়।
জুলাই

3

হ্যাঁ এবং না, তবে বেশিরভাগই না

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

কখন স্ট্যাটিক্স ব্যবহার করা ঠিক আছে? কারণ পরিষ্কারভাবে এটি কখনও কখনও ঠিক আছে। হ্যাঁ উত্তরগুলি অ্যাবস্ট্রাকশন এর 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। এটি ব্যবহার করবেন না, এমএস "প্যাটার্নস এবং প্র্যাটিস" টিম দ্বারা তৈরি বেশিরভাগ কোডের মতো, বিদ্রূপজনকভাবে, এটি একটি অ্যান্টিপ্যাটার্ন।
নাথান কুপার

3

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

একক হিসাবে বস্তু রাখার সলিডের সাথে কোনও সম্পর্ক নেই। এটি আপনার অবজেক্টের লাইফ চক্রটি কতক্ষণ আপনি সেই বস্তুকে স্মৃতিতে বাঁচতে চান।

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


2

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


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