মার্টিনের ক্লিন কোড অনুসারে আউটপুট আর্গুমেন্ট কী?


14

রবার্ট সি মার্টিনের ক্লিন কোড: এন্ডবিল অফ অ্যাগ্রিল সফ্টওয়্যার ক্র্যাফটসম্যানশিপের 45 পৃষ্ঠায় মার্টিন লিখেছেন যে আউটপুট আর্গুমেন্টগুলি এড়ানো উচিত। "আউটপুট আর্গুমেন্ট" এর অর্থ বুঝতে এবং সেগুলি কেন এড়ানো উচিত সে বিষয়ে আমার সমস্যা হচ্ছে।

আউটপুট আর্গুমেন্টের জন্য মার্টিনের উদাহরণটি appendFooter(s);ফাংশনটিকে কল করে public void appendFooter(StringBuffer report)। কোডটির তার উন্নতিreport.appendFooter();

হতে পারে এটি কোড প্রসঙ্গে অভাবের কারণে, তবে আউটপুট আর্গুমেন্টগুলি কীভাবে দুর্বল কোডিং হিসাবে বিবেচিত হবে তা আমি দেখতে পাচ্ছি না। কেউ কি ধারণাটি ব্যাখ্যা করতে পারে বা কোডটি বোঝার জন্য উদাহরণের উদাহরণ দিতে পারে?

নিম্নলিখিত নীতিটিও কি উপরোক্ত নীতি দ্বারা অশুচি কোডের উদাহরণ হিসাবে বিবেচিত হবে?

int[] numberArray = {3, 5, 7, 1};
sortArray(numberArray);

যদি উপরেরটি আউটপুট আর্গুমেন্ট না ব্যবহারের মার্টিনের নীতির লঙ্ঘন হয়, তবে ক্ষেত্র হিসাবে অ্যারে রয়েছে এমন একটি অবজেক্ট এবং অ্যারে বাছাই করার জন্য বলা যেতে পারে এমন কোনও ফাংশন থাকা ভাল কি?

ObjectWithArrayField numberArray = new ObjectWithArrayField(3, 5, 7, 1);
numberArray.sort();

উত্তর:


11

বব মার্টিন কেবল পঠনযোগ্যতার কথা বলছেন ।

appendFooterউদাহরণস্বরূপ সমস্যাটি হ'ল, যদি আপনি appendFooter(s)কোনও প্রোগ্রামের কোথাও কোড লাইনটি খুঁজে পান , তা যদি তা কলটি sএকটি ইনপুট হিসাবে গ্রহণ করে এবং এটি কোথাও সংযোজন করে, বা যদি sকেবলমাত্র সেই ফাংশনটির আউটপুট নিতে পাস হয় তবে তা স্পষ্ট নয় । নিশ্চিত হওয়ার জন্য, আপনাকে ফাংশনের ডকুমেন্টেশন পরীক্ষা করতে হবে। কোনও কল যেমন report.appendFooter()সমস্যাটি এড়িয়ে চলে: যা ঘটেছিল তা এখন অনেক বেশি স্পষ্ট।

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

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


2
sortArray(numberArray)অবশ্যই, numberArrayস্থানে ধরণের । অথবা এটি কোনও অনুলিপি না করে numberArray, অনুলিপিটি সাজানো এবং সাজানো অনুলিপিটি ফেরত দেয় numberArray?
বিট্রি

@ 8 বিট্রি: এটি সত্য, তবে এটি এখানে দ্বিধায় থাকার বিষয় নয় - sort()একটি পাত্রে কোনও পদ্ধতি "আউটপুট আর্গুমেন্ট" ব্যবহার না করে পাশাপাশি জায়গায় কাজ করতে পারে। সুতরাং কেবলমাত্র sortArray(numberArray)একটি অন্তর্নিহিত পদ্ধতি হ'ল "আউটপুট আর্গুমেন্ট ফর্ম" কে ন্যায্য প্রমাণিত করার কোনও কারণ নেই
ডক ব্রাউন

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

1
@ 8 বিট্রি: ঠিক আছে, আপনি আমাকে পেয়েছেন, আমি আমার উত্তর থেকে দাবির বিবৃতি সরিয়েছি। তবে, আপনার বর্ণিত সমস্যাটি সদস্য ফাংশনটি ব্যবহার করে অদৃশ্য হয় না - এমনকি কোনও "সাজানো" সদস্য ফাংশনও সেভাবে আচরণ করতে পারে।
ডক ব্রাউন

11

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

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

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

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