অন্য কোনও ফাংশন থেকে কোনও ক্রিয়াকলাপকে কী বিশুদ্ধ বলে বিবেচনা করা হয়?


9

পার্শ্ব প্রতিক্রিয়া ছাড়াই ফাংশনগুলি তৈরি করার সময় আমি ডিফল্ট পরিবর্তনশীল মানগুলি হ্যান্ডেল করার একটি উপায় বের করার চেষ্টা করছি এবং নিম্নলিখিতটি দিয়ে শেষ করেছি:

function getDefaultSeparator() {
    return ':';
}

function process(input, separator) {
    var separator = separator || getDefaultSeparator();

    // Use separator in some logic

    return output;
}

ডিফল্ট বিভাজক অন্যান্য ফাংশনে ব্যবহৃত হবে এবং আমি কেবল এটি একটি জায়গায় সংজ্ঞায়িত করতে চাই।

এটি যদি খাঁটি ফাংশন হয় তবে কেবলমাত্র বিশ্বব্যাপী ডিএফএএলএফএসইএসএপিটারের পরিবর্তে ধ্রুবক ব্যবহার করা থেকে কী পার্থক্য রয়েছে?


5
কোনও উপাদানগত পার্থক্য নেই, যদি না আপনি পরে যুক্তিযুক্ত কিছু যুক্তির জন্য স্থানধারক হিসাবে ফাংশনটি ব্যবহার করার পরিকল্পনা করছেন।
রবার্ট হার্ভে

3
এর সম্ভাব্য সদৃশটি যদি কোনও পরামিতি হিসাবে কোনও ফাংশন গ্রহণ করে তবে কী কোনও তৎক্ষণাৎ অশুদ্ধ? । প্রশ্নটি হুবহু সদৃশ নয়, তবে উত্তরটি একই হওয়া উচিত। ("এটি অন্যান্য ফাংশনের বিশুদ্ধতার উপর নির্ভর করে" ")
জেএমপিসি 26

1
গ্লোবাল ধ্রুবক ব্যবহার করা কোনও ফাংশনকে অপরিষ্কার করে না। আপনি ধরে নিচ্ছেন এমন একটি বৈশ্বিক মান ব্যবহার করা ধ্রুবক হয়।
চিপনার

বিটিডব্লিউ, আপনি কারি করতে পারেন process(বিপরীত প্যারামিটার অর্ডার দিয়ে) এবং কারিড ফাংশনটিকে বিশেষ করতেvar processDefault = process(":")
বব

উত্তর:


22

অন্য কোনও ফাংশন থেকে কোনও ক্রিয়াকলাপকে কী বিশুদ্ধ বলে বিবেচনা করা হয়?

এটি অন্যান্য ফাংশনটি কী করে এবং কলিং ফাংশন কী করে তার উপর নির্ভর করে। অপরিষ্কার সংক্রামক, বিশুদ্ধতা নয়।

খাঁটি ফাংশন কল করা কলিং ফাংশনের বিশুদ্ধতা পরিবর্তন করে না। অপরিষ্কার ফাংশন কল করা স্বয়ংক্রিয়ভাবে কলিং ফাংশনটিকেও অশুচি করে তোলে।

সুতরাং, আপনার উদাহরণে এটি আপনার যে অংশটি ছেড়ে গেছে তার বিশুদ্ধতার উপর নির্ভর করে: যদি এটি খাঁটি হয় তবে পুরো ফাংশনটি খাঁটি।

এটি যদি খাঁটি ফাংশন হয় তবে কেবলমাত্র বিশ্বব্যাপী ডিএফএএলএফএসইএসএপিটারের পরিবর্তে ধ্রুবক ব্যবহার করা থেকে কী পার্থক্য রয়েছে?

কিছুই নেই। একটি ক্রিয়াকলাপ যা সর্বদা একই মান দেয় একটি ধ্রুবক থেকে পৃথক্ হয়। প্রকৃতপক্ষে, ঠিক এভাবেই const-ক্যালকুলাসে ধ্রুবকগুলি মডেল করা হয়।


2
"একটি অপবিত্র ফাংশন কল করা স্বয়ংক্রিয়ভাবে কলিং ফাংশনটিকেও অশুচি করে তোলে" আপনি কি সে সম্পর্কে যথেষ্ট নিশ্চিত? আফিক্স, একটি অপরিষ্কার ফাংশন কল করা স্বয়ংক্রিয়ভাবে কলকারীকে অপরিষ্কার করে না, যদিও এটি করা সম্ভব।
Deduplicator

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

6

হ্যাঁ, এগুলি উভয়ই খাঁটি ফাংশন (ধরে নিলে এলিড অংশটিও খাঁটি) কারণ:

  1. ফলাফল কেবল পরামিতিগুলির উপর নির্ভর করে।
  2. কোনও পার্শ্ব প্রতিক্রিয়া নেই।

মনে রাখবেন যে যদি getDefaultSeparator()একটি খাঁটি ফাংশন না ছিল, তবে উভয়ই process()খাঁটি হবে না।

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

খাঁটি ফাংশনগুলির পিছনে একটি মূল ধারণাটি হ'ল প্রোগ্রামের ফলাফলগুলিকে প্রভাবিত না করে তারা যে মূল্য ফেরত দেয় তাদের সাথে প্রতিস্থাপন করা যেতে পারে।


1

অন্যরা যেমন বলছে, নিশ্চিত, এটি এখনও একটি খাঁটি ফাংশন।

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

একটি ফাংশন ব্যবহার আপনাকে বাস্তবায়ন পরিবর্তন করতে আরও স্বচ্ছন্দতা দেয়, যা ফাংশন পদ্ধতির একটি বৈশ্বিক পরিবর্তনশীলের চেয়ে আলগা সংযোগের প্রস্তাব দেয়।

প্রশ্ন হচ্ছে এর দরকার আছে কিনা?

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

এমনকি যদি ভোক্তা ও সরবরাহকারী বিভিন্ন মডিউলে থাকে তবুও মডিউলগুলি একসাথে রূপান্তরিত হয় (উদাহরণস্বরূপ, আপনি একটি মিনিফায়ার ব্যবহার করেন, যাতে গ্রাহক এবং সরবরাহকারীর মডিউলগুলি একই ফাইলে থাকে), YAGNI প্রয়োগও করতে পারে।

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

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

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