অন্তর্নিহিত অনুমান বনাম পদ্ধতি নিষ্কাশন


27

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

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

আমি এর জন্য একমাত্র সমাধানটি দেখেছি whereহ্যাসকেলে থাকা ধারাটি যা আপনাকে "প্যারেন্ট" ফাংশনে ব্যবহৃত ছোট ছোট ফাংশনগুলি সংজ্ঞায়িত করতে দেয়। মূলত: এটি দেখতে এটির মতো দেখাচ্ছে:

len x y = sqrt $ (sq x) + (sq y)
    where sq a = a * a

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

সুতরাং, আমার প্রশ্নটি হ'ল - আপনি কি এটির মুখোমুখি হন, এবং আপনি কি এটি দেখেন যে এটি একটি সমস্যা? আপনি যদি করেন তবে আপনি সাধারণত কীভাবে এটি সমাধান করবেন, বিশেষত জাভা / সি # / সি ++ এর মতো "মূলধারার" ওওপি ভাষায়?

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

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

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




@ আপনি যে প্রশ্নটির সাথে লিঙ্ক করেছেন সেই প্রশ্নটি উত্থাপন করুন যা আদৌ ফাংশন নিষ্কাশন করা উচিত কিনা তা নিয়ে আমি আলোচনা করি না while পরিবর্তে, আমি এটি করতে সবচেয়ে অনুকূল পদ্ধতিটি প্রশ্ন করি।
ম্যাক্স ইয়াঙ্কভ

2
@ এখান থেকে অন্য সম্পর্কিত প্রশ্ন যুক্ত রয়েছে, তবে এগুলির মধ্যে কেউই এই বিষয়টিকে নিয়ে আলোচনা করে না যে এই কোডটি কেবলমাত্র কলারের প্রসঙ্গে বৈধ যে নির্দিষ্ট অনুমানের উপর নির্ভর করতে পারে।
ম্যাক্স ইয়াঙ্কভ

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

উত্তর:


29

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

আপনার উদ্বেগটি সুপ্রতিষ্ঠিত। আরও একটি সমাধান আছে।

এক ধাপ পেছনে যাও. মৌলিকভাবে একটি পদ্ধতির উদ্দেশ্য কী? পদ্ধতিগুলি কেবল দুটি কাজের মধ্যে একটি করে:

  • একটি মান উত্পাদন
  • একটি প্রভাব কারণ

বা, দুর্ভাগ্যক্রমে, উভয়। আমি এমন দুটি পদ্ধতি এড়িয়ে চলার চেষ্টা করি যা প্রচুর পরিমাণে হয়। ধরা যাক যে উত্পাদিত প্রভাব বা উত্পাদিত মান হ'ল পদ্ধতির "ফলাফল"।

আপনি নোট করুন যে পদ্ধতিগুলিকে "প্রসঙ্গে" বলা হয়। সেই প্রসঙ্গটি কী?

  • যুক্তিগুলির মান
  • পদ্ধতির বাইরে প্রোগ্রামের অবস্থা

মূলত আপনি যা নির্দেশ করছেন তা হ'ল: পদ্ধতির ফলাফলের সঠিকতা যে প্রসঙ্গে বলা হয় তার উপর নির্ভর করে

আমরা কল করার পূর্বে একটি পদ্ধতি শরীর পদ্ধতি একটি সঠিক ফল করার জন্য শুরু হয় প্রয়োজনীয় শর্ত তার পূর্বশর্ত , এবং আমরা কল অবস্থার পরে যা পদ্ধতি শরীর ফেরৎ উত্পাদিত হবে তার postconditions

তাই মূলত কি ইশারা হয়: যখন আমি তার নিজস্ব পদ্ধতি মধ্যে একটি কোড ব্লক নিষ্কর্ষ, আমি পূর্বশর্ত এবং postconditions সম্পর্কে প্রাসঙ্গিক তথ্য হারাচ্ছি

এই সমস্যার সমাধান হ'ল প্রোগ্রামটিতে পূর্ব শর্ত এবং পোস্টকন্ডিশনগুলি সুস্পষ্ট করা । সি # তে, উদাহরণস্বরূপ, আপনি Debug.Assertপূর্ব শর্ত এবং পোস্টকন্ডিশনগুলি প্রকাশ করতে কোড চুক্তি ব্যবহার করতে পারেন ।

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

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

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

পূর্ববর্তী শর্তাবলী / পোস্টকন্ডিশনগুলির ক্ষেত্রে সমস্যার ব্যাখ্যা করে এমন উত্তর হিসাবে +1।
QuestionC

5
আমি যুক্ত করব যে টাইপ সিস্টেমে প্রাক-শর্তাবলীর পরে শর্তগুলি পরীক্ষা করা প্রায়শই সম্ভব (এবং একটি ভাল ধারণা!)। আপনার যদি এমন কোনও ফাংশন থাকে যা এটি নেয় stringএবং এটি ডাটাবেসে সংরক্ষণ করে, আপনি যদি এটি পরিষ্কার করতে ভুলে যান তবে আপনার এসকিউএল ইঞ্জেকশন হওয়ার ঝুঁকি রয়েছে। অন্যদিকে, যদি আপনার ফাংশনটি গ্রহণ করে SanitisedStringএবং এটির একমাত্র উপায় SantisiedStringকল করে বলা হয় Sanitise, তবে আপনি এসকিউএল ইঞ্জেকশন বাগগুলি নির্মাণ করে বাতিল করেছেন। সংকলকটি ভুল কোডটিকে প্রত্যাখ্যান করার জন্য আমি ক্রমশ নিজেকে আবিষ্কার করছি।
বেনিয়ামিন হজসন 21

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

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

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

13

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

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


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

সম্প্রতি আমি কেবল এমন পরিস্থিতিতে পড়েছিলাম যা স্থাপত্যের দৃষ্টিকোণ থেকে এটির জন্য আদর্শ হবে be আমি একটি রেন্ডারার ক্লাস এবং একটি পাবলিক রেন্ডার পদ্ধতি সহ একটি সফ্টওয়্যার রেন্ডারার লিখেছিলাম, যার প্রচুর প্রসঙ্গ ছিল যা এটি অন্যান্য পদ্ধতিগুলি কল করত। আমি এর জন্য একটি পৃথক রেন্ডারকন্টেক্সট ক্লাস তৈরি করার বিষয়ে চিন্তাভাবনা করেছি, তবে, প্রতিটি প্রকল্পের জন্য এই প্রকল্পটি বরাদ্দ করা এবং হ্রাস করতে এটি কেবল অপব্যয়জনক বলে মনে হচ্ছে। github.com/golergka/tinyrenderer/blob/master/src/renderer.h
ম্যাক্স

6

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

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

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

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


বাসা বাঁধার ফাংশন ... লাম্বদা ফাংশনগুলি সি # (এবং জাভা 8) এ কী অর্জন করে?
আর্টুরো টরেস সানচেজ

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

এই পাইথনের উদাহরণগুলি অবশ্যই সি # তে সম্ভব। উদাহরণস্বরূপ, ঘটনামূলক । এগুলি আরও ভার্বোজ হতে পারে তবে তারা 100% সম্ভব।
আর্টুরো টরেস সানচেজ

2
কেউ বলেনি এটা সম্ভব হয়নি। এমনকি ওপি তাঁর প্রশ্নে ল্যাম্বডাস ব্যবহারের কথা উল্লেখ করেছেন। এটি কেবলমাত্র যদি আপনি পঠনযোগ্যতার স্বার্থে কোনও পদ্ধতি বের করেন তবে এটি আরও বেশি পঠনযোগ্য হলে ভাল হবে।
কার্ল বিলেফেল্ট

আপনার প্রথম অনুচ্ছেদে বোঝা যাচ্ছে যে এটি সম্ভব নয়, বিশেষত আপনার উদ্ধৃতি দিয়ে: "এটি একটি খারাপ ধারণা হতে হবে, অন্যথায় আমার প্রিয় 'মূলধারার' ভাষা এটির অনুমতি দেবে।"
আর্টুরো টরেস সানচেজ

4

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

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

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

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


1

এই ছোট পদ্ধতিগুলির তুলনায় যুক্তিযুক্ত হওয়া শক্ত হয়ে ওঠে যখন এগুলি বড়দের মধ্যে কেবল কোডের ব্লক ছিল, কারণ যখন আমি এগুলি বের করি তখন আমি প্রচুর অন্তর্নিহিত অনুমানগুলি হারা যা কলারের প্রসঙ্গে আসে।

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

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

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

তবুও আমার কাছে সবচেয়ে বড় সমস্যাটি ছিল সমস্ত পরীক্ষার উত্তীর্ণ হওয়া সত্ত্বেও সিস্টেমের সামগ্রিক সঠিকতা সম্পর্কে আত্মবিশ্বাসের সাথে যুক্ত করতে না পেরে। আমার মস্তিষ্কের মধ্যে takeোকা এবং বোঝার জন্য অনেক কিছুই ছিল কারণ এই ধরণের সিস্টেম আপনাকে এই সমস্ত ক্ষুদ্র বিবরণ এবং সর্বত্র চলমান ছোট ছোট ফাংশন এবং অবজেক্টগুলির মধ্যে অন্তহীন মিথস্ক্রিয়া গ্রহণ না করেই এটি সম্পর্কে তর্ক করতে দেয়নি। অনেকগুলি "কি আইএফএস?" ছিল, অনেক সময় যা সঠিক সময়ে ডেকে আনা দরকার ছিল, তাদের যদি ভুল সময় বলা হয় তবে কী ঘটবে সে সম্পর্কে অনেকগুলি প্রশ্ন (আপনি যখন বিড়ম্বনার দিকে পৌঁছতে শুরু করেন) একটি ইভেন্ট অন্য ইভেন্টকে ট্রিগার করে এমন একটি ইভেন্ট ঘটায় যা আপনাকে সমস্ত ধরণের অবিশ্বাস্য স্থানে নিয়ে যায়) ইত্যাদি etc.

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

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

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


0

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

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

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

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