একজন প্রোগ্রামারকে রেফারেন্সিয়াল স্বচ্ছতার কী কী সুবিধা রয়েছে?


18

প্রোগ্রামিংয়ে, রেফারেন্সিয়াল স্বচ্ছতার সুবিধা কী ?

আরটি কার্যকরী এবং আবশ্যকীয় দৃষ্টান্তগুলির মধ্যে অন্যতম প্রধান পার্থক্য তৈরি করে এবং প্রায়শই কার্যকরী দৃষ্টান্তের সমর্থনকারীদের দ্বারা আবশ্যকীয় ব্যক্তির উপর সুস্পষ্ট সুবিধা হিসাবে ব্যবহৃত হয়; তবে তাদের সমস্ত প্রচেষ্টায়, এই উকিলরা কখনই ব্যাখ্যা করে না যে এটি প্রোগ্রামার হিসাবে আমার পক্ষে কেন সুবিধা ।

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

দ্রষ্টব্য: এটি রেফারেন্সিয়াল স্বচ্ছতা কী এর একটি সদৃশ নয় ? আধুনিক ঠিকানাগুলির বিষয় কি , রিটুইট থাকাকালীন এই প্রশ্নের এটার সুবিধা (তাই স্বজ্ঞাত না হতে পারে) adressses।




3
রেফারেন্সিয়াল ট্রান্সপারেসি আপনাকে সমীকরণ যুক্তি ব্যবহার করতে দেয় : 1) কোডের বৈশিষ্ট্য প্রমাণ করুন এবং 2) প্রোগ্রাম লিখুন । হাস্কেল সম্পর্কে কয়েকটি বই রয়েছে যেখানে লেখকরা আপনাকে কিছু সমীকরণ থেকে শুরু করতে পারেন যা আপনি একটি ফাংশন ফুলফিল করতে চান এবং কেবল সমীকরণীয় যুক্তি ব্যবহার করে আপনি শেষ ফাংশনটির একটি বাস্তবায়ন অর্জন করেন, সুতরাং এটি অবশ্যই সঠিক। এখন "দিন-দিন" প্রোগ্রামিংয়ে এটি কতটুকু প্রয়োগ করা যেতে পারে সম্ভবত সেই প্রসঙ্গে নির্ভর করে ...
বাকুরিউ

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

সুবিধাটি হ'ল আপনার রেফারেন্সিয়াল নন ট্রান্সপার্পেন্সি নিয়ে ভাবতে সময় নষ্ট করার দরকার নেই। কিন্ডার মত কীভাবে ভেরিয়েবলের সুবিধাগুলি হল যে আপনার রেজিস্টার বরাদ্দ সম্পর্কে ভেবে সময় নষ্ট করার দরকার নেই।
ব্যবহারকারী 253751

উত্তর:


37

সুবিধাটি হ'ল খাঁটি ফাংশনগুলি আপনার কোড সম্পর্কে তর্ক করতে আরও সহজ করে। অথবা, অন্য কথায়, পার্শ্ব প্রতিক্রিয়াগুলি আপনার কোডের জটিলতা বাড়ায়।

computeProductPriceপদ্ধতির উদাহরণ নিন Take

একটি খাঁটি পদ্ধতি আপনাকে একটি পণ্যের পরিমাণ, একটি মুদ্রা ইত্যাদির জন্য জিজ্ঞাসা করবে আপনি জানেন যে যখনই পদ্ধতিটিকে একই যুক্তি দিয়ে ডাকা হয়, এটি সর্বদা একই ফলাফল তৈরি করে।

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

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

উদাহরণ

ভাবুন ফ্রেমওয়ার্কে এমন একটি পদ্ধতি রয়েছে যা একটি সংখ্যাকে পার্স করে:

decimal math.parse(string t)

এটিতে রেফারেন্সিয়াল স্বচ্ছতা নেই, কারণ এটি এর উপর নির্ভর করে:

  • এনভায়রনমেন্ট ভেরিয়েবল যা সংখ্যায়ন সিস্টেমটি নির্দিষ্ট করে, তা বেস 10 বা অন্য কিছু something

  • mathলাইব্রেরির মধ্যে চলক যা পার্স করতে সংখ্যার যথার্থতা নির্দিষ্ট করে। মান সহ সুতরাং 1, স্ট্রিং পার্সিং "12.3456"দেবে 12.3

  • সংস্কৃতি, যা প্রত্যাশিত বিন্যাস সংজ্ঞায়িত করে। উদাহরণস্বরূপ, এর সাথে fr-FR, পার্সিং "12.345"দেবে 12345, কারণ বিচ্ছেদ চরিত্রটি হওয়া উচিত ,, নয়.

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

এই স্পষ্টভাবে ভাঙা পদ্ধতিটি কীভাবে ঠিক করবেন? রেফারেন্সিয়াল স্বচ্ছতার পরিচয় দিয়ে। অন্য কথায়, বিশ্বব্যাপী অবস্থা থেকে মুক্তি পেয়ে এবং সবকিছুকে পদ্ধতির পরামিতিগুলিতে স্থানান্তরিত করে:

decimal math.parse(string t, base=10, precision=20, culture=cultures.en_us)

এখন যেহেতু পদ্ধতিটি খাঁটি, আপনি জানেন যে আপনি যখন পদ্ধতিটি কল করেন তা কোনও ব্যাপার নয়, এটি সর্বদা একই যুক্তিগুলির জন্য একই ফলাফল উত্পন্ন করবে।


4
কেবলমাত্র একটি সংযোজন: রেফারেন্সিয়াল স্বচ্ছতা কেবলমাত্র ফাংশন নয়, কোনও ভাষায় সমস্ত প্রকাশের ক্ষেত্রে প্রযোজ্য।
বাগানবাড়ী

3
মনে রাখবেন যে আপনি কতটা স্বচ্ছ হতে পারবেন তার সীমাবদ্ধতা রয়েছে। packet = socket.recv()উল্লেখযোগ্যভাবে স্বচ্ছ তৈরি করা ফাংশনের পয়েন্টটি পরাস্ত করে।
চিহ্নিত করুন

1
সংস্কৃতি হতে হবে = সংস্কৃতি.invariant t আপনি দুর্ঘটনাক্রমে এমন সফ্টওয়্যার তৈরি করতে না চান যা কেবল মার্কিন যুক্তরাষ্ট্রে সঠিকভাবে কাজ করে।
ব্যবহারকারী 253751

@ ইমিবিস: এইচএম, ভাল প্রশ্ন। পার্সিং বিধিগুলি কীসের জন্য হবে invariant? হয় তারা একই রকম en_us, কোন ক্ষেত্রে, কেন বিরক্ত করে, বা তারা অন্য en_usকোনও দেশের সাথে মিল রাখে, কোন ক্ষেত্রে, কোনটি এবং কেন এই পরিবর্তে , অথবা তাদের নির্দিষ্ট বিধি রয়েছে যা কোনওভাবেই কোনও দেশের সাথে মেলে না have যা অকেজো হবে। তার মাঝে সত্যিই কোন "সত্য উত্তর" হয় 12,345.67এবং 12 345,67কোন "ডিফল্ট নিয়ম" কয়েক দেশের জন্য কাজ করবে, এবং অন্যদের জন্য কাজ করবে না।
আর্সেনি মরজেনকো

3
@ আর্সেনি মৌরজেনকো এটি সাধারণত একটি "সর্বনিম্ন সাধারণ ডিনোমিনেটর" এবং অনেকগুলি প্রোগ্রামিং ভাষার ব্যবহার সিনট্যাক্সের মতো (যা সংস্কৃতি-আক্রমণকারীও)। 1234512345 যেমন parses, 12 345বা 12,345বা 12.345ত্রুটিপূর্ণ কিনা। 12.345একটি আক্রমণকারী ভাসমান-পয়েন্ট নম্বর হিসাবে পার্স করা ব্যবহারের প্রোগ্রামিং ভাষা কনভেনশন অনুসারে সর্বদা 12.345 উপার্জন করে। দশমিক বিভাজক হিসাবে। স্ট্রিংগুলি তাদের ইউনিকোড কোড পয়েন্ট এবং কেস-সংবেদনশীলতার সাথে বাছাই করা হয়। ইত্যাদি।
ব্যবহারকারী 253751

11

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

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

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


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

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

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

9

লোকেরা "সহজে যুক্তিযুক্ত হওয়া" শব্দটি প্রায় ছড়িয়ে দেয় তবে এর অর্থ কী তা কখনই ব্যাখ্যা করে না। নিম্নলিখিত উদাহরণ বিবেচনা করুন:

result1 = foo("bar", 12)
// 100 lines of code
result2 = foo("bar", 12)

হয় result1এবং result2একই বা ভিন্ন? রেফারেন্সিয়াল স্বচ্ছতা ছাড়া আপনার কোনও ধারণা নেই। আপনাকে অবশ্যই এটি fooনিশ্চিত করতে শরীরের পড়তে হবে, এবং সম্ভবত কোনও ফাংশনগুলির বডি foo, এবং আরও অনেক কিছু।

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

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


1
আপনি উল্লেখ করেছেন যে রেফারেন্সিয়াল স্বচ্ছতা আপনাকে foo () এর কলগুলির ফলাফল সম্পর্কে যুক্তি জানাতে দেয় এবং জানতে পারে যে একই result1এবং কিনা result2। আর একটি গুরুত্বপূর্ণ বিষয় হ'ল যদি foo("bar", 12)সাধারণভাবে স্বচ্ছ হয়, তবে আপনাকে নিজের কাছে জিজ্ঞাসা করতে হবে না যে এই কলটি অন্য কোথাও কোনও প্রভাব তৈরি করেছে (কিছু ভেরিয়েবল সেট করেছে? একটি ফাইল মুছে ফেলেছে? যাই হোক না কেন)।
জর্জিও

একমাত্র "রেফারেন্সিয়াল অখণ্ডতা" যার সাথে আমি পরিচিত, রিলেশনাল ডাটাবেসগুলি জড়িত।
চিহ্নিত করুন

1
@ মার্ক এটি একটি টাইপো। কার্ল বোঝাতে চেয়েছিলেন রেফারেনশিয়াল স্বচ্ছতা, যেমনটি তাঁর বাকী উত্তর থেকে সুস্পষ্ট।
আন্দ্রেস এফ।

6

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

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

এই বড় ফাংশনগুলি যাদু করে এবং আমি তাদের স্পর্শ করতে ভয় পাই কারণ তারা দর্শনীয় উপায়ে ভাঙতে পারে।

খাঁটি ফাংশন কেবলমাত্র কার্যকরী প্রোগ্রামিংয়ের জন্য নয়, তবে প্রতিটি প্রোগ্রামের জন্য।

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