মান দ্বারা পাস করা পরামিতিগুলির মানগুলি সংশোধন না করার কোনও কারণ আছে?


9

কোনও কার্যের শরীরে বাই-ভ্যালু প্যারামিটারের মানগুলি সংশোধন করার জন্য বা বিপক্ষে উদ্দেশ্যমূলক, সমর্থনযোগ্য সফ্টওয়্যার-ইঞ্জিনিয়ারিং যুক্তি রয়েছে?

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

এটি কি পুনরায় সমাধানযোগ্য ধর্মীয় দ্বন্দ্ব, নাকি উভয় দিকেই কোনও ভাল, উদ্দেশ্যমূলক সফ্টওয়্যার ইঞ্জিনিয়ারিং কারণ রয়েছে?

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


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

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

আমি ভেবেছিলাম এটি অবশ্যই আগে জিজ্ঞাসা করা হয়েছিল, তবে আমি খুঁজে পেতে পারি একমাত্র ডুপ এই পুরানো এসও প্রশ্ন
ডক ব্রাউন

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

উত্তর:


15

আমি একমত নই এবং ধরে রাখছি যে প্যারামিটারগুলি পদ্ধতিটি কল করার সিনট্যাক্স দ্বারা আরম্ভ করা স্থানীয় ভেরিয়েবলগুলি ছাড়া আর কিছুই নয়

আমি তৃতীয় অবস্থান গ্রহণ করি: প্যারামিটারগুলি স্থানীয় ভেরিয়েবলগুলির মতো: উভয়টিকেই ডিফল্টরূপে অপরিবর্তনীয় হিসাবে বিবেচনা করা উচিত। সুতরাং ভেরিয়েবল একবার বরাদ্দ করা হয় এবং তারপরে কেবল পরিবর্তন করা হয় না read লুপগুলির ক্ষেত্রে for each (x in ...), পরিবর্তনশীল প্রতিটি পুনরাবৃত্তির প্রসঙ্গে আবশ্যক। এর কারণগুলি হ'ল:

  1. কোডটি "আমার মাথায় চালানো" সহজ করে তোলে,
  2. এটি ভেরিয়েবলগুলির জন্য আরও বর্ণনামূলক নামের অনুমতি দেয়।

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

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

আমার অভিজ্ঞতায়, প্রাক্তনটি আমার দুর্বল মস্তিষ্কে অনেক সহজ। অন্য, চালক, আমার চেয়ে লোকের এই সমস্যা নাও থাকতে পারে, তবে এটি আমাকে সাহায্য করে।

অন্য বিষয় হিসাবে:

double Foo(double r)
{
    r = r * r;
    r = Math.Pi * r;
    return r;
}

বনাম

double Foo(int r)
{
    var rSquared = r * r;
    var area = Math.Pi * rSquared;
    return area;
} 

রচিত উদাহরণগুলি, তবে আমার মতে এটি ভেরিয়েবল নামগুলির কারণে দ্বিতীয় উদাহরণে কী ঘটছে তা অনেকটাই স্পষ্ট: তারা উদাহরণের চেয়ে বড় সংখ্যাটির চেয়ে পাঠকের কাছে অনেক বেশি তথ্য সরবরাহ করে r


"স্থানীয় পরিবর্তনশীল .... ডিফল্টরূপে অপরিবর্তনীয় হিসাবে বিবেচনা করা উচিত।" - কি?
15-18

1
forঅপরিবর্তনীয় ভেরিয়েবলের সাহায্যে লুপ চালানো বেশ শক্ত । ফাংশনটিতে ভেরিয়েবলকে আবদ্ধ করা আপনার পক্ষে যথেষ্ট নয়? যদি আপনার ভেরিয়েবলগুলি কেবল একটি ফাংশনে অনুসরণ করতে সমস্যা হয় তবে সম্ভবত আপনার কার্যগুলি দীর্ঘ long
রবার্ট হার্ভে

@ রবার্টহারভে for (const auto thing : things)হ'ল লুপ এবং এটি যে পরিবর্তনশীলটি প্রবর্তন করে তা হ'ল (স্থানীয়ভাবে) অপরিবর্তনীয়। for i, thing in enumerate(things):কোনও স্থানীয়কেও পরিবর্তন করতে পারে না
ক্লেথ

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

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

4

এটি কি পুনরায় সমাধানযোগ্য ধর্মীয় দ্বন্দ্ব, নাকি উভয় দিকেই কোনও ভাল, উদ্দেশ্যমূলক সফ্টওয়্যার ইঞ্জিনিয়ারিং কারণ রয়েছে?

এটি সম্পর্কে আমি সত্যিই পছন্দ করি (ভাল লিখিত) সি ++: আপনি কী আশা করবেন তা দেখতে পারেন। const string& x1একটি ধ্রুবক রেফারেন্স, string x2একটি অনুলিপি এবং const string x3একটি ধ্রুবক অনুলিপি। ফাংশনে কী হবে তা আমি জানি । পরিবর্তন করা x2 হবে , কারণ যদি এটি না হয়, তবে এটি অ-নিরপেক্ষ করার কোনও কারণ নেই।

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

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


আর একটি ভাল জিনিস হ'ল int f(const T x)এবং int f(T x)ফাংশন-বডিতে কেবল আলাদা।
উত্সাহক

3
একটি প্যারামিটার সহ একটি সি ++ ফাংশন const int xঠিক পরিষ্কার করার জন্য x এর ভিতরে পরিবর্তন হয় না? আমার কাছে খুব অদ্ভুত স্টাইল লাগছে।
ডক ব্রাউন

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

@ ন্যাভিগট: যদি কেউ ("বাই-ভ্যালু") ফাংশন প্যারামিটারটি সংশোধন করতে পছন্দ করে constতবে যদি সে বাধা দেয় তবে সে কেবলমাত্র প্যারামিটার তালিকা থেকে দূরে সরিয়ে ফেলবে । সুতরাং আমি মনে করি না এটি প্রশ্নের উত্তর দেয়।
ডক ব্রাউন

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

1

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

অকার্যকর প্রচার (ওবিজেইসিটি * অবজেক্ট, ডাবল টি0, ডাবল ডিটি) {
  ডাবল টি = টি0; / * টি এর মান পরিবর্তন করা এড়াতে স্থানীয় কপি *
  যখন (যাই হোক না কেন)
    timestep_the_object (...);
    t + = dt; }
  আসতে; }

তাই এখানে শুধু যুক্তি নামের কারণ t0 , আমি সম্ভবত তার মান পরিবর্তন না করতে বেছে নিতে চাই। তবে এর পরিবর্তে ধরুন, আমরা কেবলমাত্র যুক্তিটির নামটি এখনই পরিবর্তন করেছিলাম বা এ জাতীয় কিছু। তারপরে আমি স্থানীয়-অনুলিপিটি সম্পর্কে অনেক বেশি ভুলে গিয়ে কেবল tNow + = dt লিখি ; যে শেষ বিবৃতি জন্য।

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

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

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