ফাংশনটি কেবল অপরিবর্তিত প্যারামিটার ফেরত দেয়, অকেজো?


15

আমি যে প্রকল্পে কাজ করছি তার মধ্যে আমি এই ফাংশনটি পেয়েছি:

  -- Just returns the text unchanged.
  -- Note: <text> may be nil, function must return nil in that case!
  function Widget:wtr(text)
      return text
  end

খুব দুঃখের বিষয়, কোডারটি আর সংস্থায় কাজ করে না। কেন কেউ এমন একটি ফাংশন তৈরি করবে যা কিছুই করে না, তবে যে প্যারামিটারটি দিয়েছিল তাকে ফেরত দেয়?

এই উদাহরণে নির্দিষ্ট না করে এই জাতীয় কোনও কার্যক্রমে কি কোনও ব্যবহার রয়েছে, তবে সামগ্রিকভাবে কোনও ক্ষেত্রে?

কারণে

function aFunction(parameter)
    return parameter
end

শেষ হয়

aFunction(parameter) == parameter

কেন এমন কিছু লিখব

aFunction(parameter) == whatIWantToCheck

পরিবর্তে

parameter == whatIWantToCheck

?



13
@gnat কীভাবে পৃথিবীতে এটি একটি সদৃশ?
কিলিয়ান ফুট

13
তাই না? এই ফাংশনটি তার প্যারামিটারটি দেয় - শৃঙ্খলা ফিরে আসা জড়িত this
কিলিয়ান ফট

11
@gnat প্রশ্নটি হল যে কেউ কেন এমন কোনও ফাংশন লিখবে যা নিজে ফিরে আসা ছাড়া কিছুই করে না । হ্যাঁ আপনি পদ্ধতিতে শৃঙ্খলার অনুমতি দেওয়ার জন্য নির্দিষ্ট কিছু বস্তু বা মানগুলি ফিরিয়ে দিতে পারেন, তবে এটি তাঁর প্রশ্ন নয়। তাঁর প্রশ্ন কেন কেউ would কি কখনো লেখার কিছু int getParam(int param) { //DO NOTHING return param; } একটি পদ্ধতি chaining দৃষ্টিকোণ এটি একটি সম্পূর্ণ অপ্রয়োজনীয় এবং অপ্রয়োজনীয় কল হিসাবে আপনি একটি পদ্ধতি শৃঙ্খল থেকে বের ওপি এর ফাংশন চলে যাবে এবং এটি একটি একক পার্থক্য করতে না থেকে।
জিরোস্ট্যাটিক

4
এটি সম্ভবত অফটোপিক এবং লুয়ার ক্ষেত্রে প্রযোজ্য নয়, তবে পিএইচপি-র জন্য এটির জন্য একটি বৈধ ব্যবহারের কেস রয়েছে - পুরানো সংস্করণগুলিতে, new Foo()->method();বৈধ বাক্য গঠন ছিল না, এবং এর মতো function with($what) { return $what; }; with(new Foo())->method();নির্মাণগুলি ওয়ার্কআউন্ড হিসাবে ব্যবহৃত হত।
ডিসিড্ডার

উত্তর:


57

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

অন্য উপায় রাখুন, এটি একটি কার্যকর ডিফল্ট ফাংশন করে। আপনি সেট করতে চাইবেন শুধু offset = 0একটি ডিফল্ট পূর্ণসংখ্যা হিসাবে, যদিও একটি অফসেট কিছুই করতে তোলে, এটা উপকারে আসা সেট পাবে পারে filterFunction = identityএকটি ডিফল্ট ফাংশন হিসাবে, যদিও ফিল্টার কিছুই করতে তোলে।


ফিল্টার ফাংশনটি কি বুলিয়ান মানটি ফেরত দেয় না? এই ক্ষেত্রে "শূন্য" ফিল্টার ফাংশনটি সত্যটি প্রত্যাশা করে।
কিরিল রাখমান

1
@ চিত্তাকর্ষক একটি মানচিত্র ফাংশন, তারপর।
সাপি

6
বা এটি কোনও নকশা ধারণার অধীনে আটকে রাখতে: নাল অবজেক্ট প্যাটার্ন , ফাংশন সংস্করণ
ব্লগটি

@ বিস্ময়কর, এটি এমন একটি শিকারীর পক্ষে হবে যা একটি উচ্চতর অর্ডার ফাংশনে আর্গুমেন্ট হিসাবে পাস হয়ে যায়filter । প্রথম-অর্ডার filterফাংশন টাইপ হয়েছে [a] -> [a],
কার্ল Bielefeldt

উদাহরণস্বরূপ সি # তে আমি প্রায়শই ব্যবহার করি.OrderBy(x => x)
CodeInChaos

27

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

তারপরে আপনাকে ডেটা পেতে তুচ্ছ "সমস্ত কিছু গ্রহণ করুন" এবং একটি তুচ্ছ "রিটার্ন অপরিবর্তিত" ফাংশন আবিষ্কার করতে হবে। wtrঅবিকল এটি একটি তুচ্ছ সিউডো-ফর্ম্যাটার। আপনি যদি সেই এপিআইটি অনেক বেশি ব্যবহার করেন তবে আপনি যখনই কোনও কিছুর অনুসন্ধান করেন তখন কোনও বেনামি ফাংশন তৈরি না করে এই সিউডো-সহায়ক ফাংশনটি প্রায় পড়ে থাকা খুব দরকারী it (আপনি এটির identityপরিবর্তে কল করার বিষয়টি বিবেচনা করতে wtrপারেন যাতে এটি অবিলম্বে পরিষ্কার হয় যে এটি কিছুই করে না))


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

3
@ সম্পিই অ্যাগেইন, যদি এপিআই-তে কোনও ফর্ম্যাটিং ফাংশন প্রয়োজন হয় , আনল্টারযুক্ত পাঠ্য পাওয়ার একমাত্র উপায় যদি ফাংশনটি পাঠ্যে কিছু না করে।
ডোভাল

3
অন্য কথায়: যদি আপনার এমন কোনও ফাংশন থাকে যার জন্য ফিল্টার / ফর্ম্যাট আর্গুমেন্টগুলি পাস করার প্রয়োজন হয় এবং আপনি একেবারেnull যুক্তি হিসাবে ব্যবহার করতে না পারেন তবে আপনি একটি খালি ফিল্টার ফাংশন ব্যবহার করেন যা প্রোগ্রামটিকে অভিযোগ করা বন্ধ করতে 'কিছুই না' দিয়ে ফিল্টার করে।
জিরোস্ট্যাটিক

3
@ সিম্পি আপনি এসকিউএল নিয়ে কাজ করেছেন, তাই না? আপনি জানেন কীভাবে আপনি একটি WHEREক্লজকে অন্তর্ভুক্ত করবেন না বা অন্তর্ভুক্ত করবেন না ? এটি শিথিলভাবে সিনট্যাকটিক চিনির ব্যাপার। মূলত কোনও WHEREধারাটির অনুপস্থিতি হুবহু হ'ল যেমন আপনার কাছে এমন একটি WHEREধারা রয়েছে যা কেবল এগিয়ে যায় এবং সমস্ত কিছুর অনুমতি দেয়। এসকিউএল এর ডিজাইনাররা আপনাকে একটি WHEREচাপ নির্দিষ্ট না করার পরিবর্তে আপনাকে একটি চাপ দিতে বাধ্য না করে, যদিও এটি সমস্ত কিছু গ্রহণ করে, আরও কম-বেশি সিনট্যাকটিক চিনি এবং তারা আপনাকে কেবল সহজ সুবিধার্থে সেই বিকল্পটি সরবরাহ করেছে। ..
Panzercrisis

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

15

এটি কি কেবল পলিমারফিজম নয়?

সঙ্গে আমার অভিজ্ঞতা থেকে কিউটি tr() এবং wtr()পদ্ধতি (সেখানে ব্যবহার করা অনুমিত হয় কিউটি স্থানীয়করণ মধ্যে) Widget'র পাঠ্য।

সুতরাং, অপরিবর্তিত টেক্সট ফিরে এই পদ্ধতি শুধু বলে: Widget does no localization (translation of the text) by default. Override this function to enable your own logic


1
বুঝতে পারিনি যে এটি একটি কিউটি জিনিস ছিল - এটি অবশ্যই উত্তর।
করলি ব্রিগম্যান

8

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

function getIndex(index)
    return index
end

এবং যেহেতু আপনার সূচক 0 থেকে শুরু হয় এটি সমস্ত ঠিক আছে। আপনি পরে কোনও উপাদান পরিবর্তন করেছেন অন্য কোথাও, এই উপাদানটি আপনার সূচিটি 1 থেকে শুরু করার জন্য অনুবাদ করতে হবে আপনাকে আপনার কোডের সর্বত্র শত শত সূচক + 1 যুক্ত করতে হবে। তবে এর মতো একটি পদ্ধতি সহ, সহজভাবে বলুন:

 function getIndex(index)
    return index+1
end

এবং আপনি ভাল আছেন। এর মতো ক্রিয়াকলাপগুলি দ্রুত ওভার ইঞ্জিনিয়ারিংয়ের দিকে পরিচালিত করতে পারে তবে কিছু সময়ে তারা প্রচুর পরিমাণে অর্থ বোধ করে!


2
হ্যাঁ, যদিও এটি লক্ষণীয় যে ওপি দ্বারা পোস্ট করা ফাংশনের ডক্টস্ট্রিংটি প্রস্তাব দেয় না যে এটি তার ক্ষেত্রে ফাংশনের উদ্দেশ্য of
মার্ক আমেরিকা

6

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


5

একটি অতিরিক্ত দৃশ্য অজগর এবং সি # বৈশিষ্ট্যের ব্যবহারের মতো, তবে ভাষাগুলিতে বৈশিষ্ট্য নেই the

সাধারণভাবে, আপনি ক্লাসের সদস্য হিসাবে কিছু ঘোষণা করতে পারেন; স্ট্রিং হিসাবে 'নাম' বলি। এর অর্থ হ'ল আপনি এটিকে এতে অ্যাক্সেস করেন:

someobject.name

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

someobject.name()

তবে আপনার যদি এই কলটির প্রচুর উদাহরণ থাকে তবে এর সাথে কোনওরকম ভুল হওয়ার সম্ভাবনা খুব কম somewhere কোথাও এই পরিবর্তন করা হবে না, আপনি যখন point পয়েন্টে পৌঁছবেন তখন প্রোগ্রামটি ক্রাশ হয়ে যাবে etc.

সি # / পাইথনের বৈশিষ্ট্যগুলি আপনাকে কোনও অ্যাট্রিবিউট হিসাবে ব্যবহৃত হবে তার জন্য কোনও ফাংশনটি প্রতিস্থাপনের অনুমতি দেয়, তবুও এটি কোনও অ্যাট্রিবিটের মতো অ্যাক্সেস করার অনুমতি দেয় অর্থাৎ কোনও পরিবর্তন ছাড়াই। এমনকি আপনার সামনে পরিকল্পনাও করতে হবে না।

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

টিএল; ডিআর এটি ভবিষ্যতের পরিবর্তনের জন্য কেবল বুদ্ধিমান প্রোগ্রামার পরিকল্পনা হতে পারে।


3
যদি এই পদ্ধতিটি অন্য কোনও কিছুর উপর নির্ভর করে তবে তা বোধগম্য হবে but এটি কোনও সম্পত্তি, গিটার / সেটার বা ক্ষেত্র নয়। এটি এমন একটি পদ্ধতি যা বর্তমানে কিছু করে না। ভবিষ্যতের পরিবর্তনের জন্য তিনি পরিকল্পনা করছেন কেবলমাত্র যদি এই পদ্ধতির যুক্তি পরিবর্তন করতে চলেছে।
ম্যাথু স্টেপলস

1
এটি করার দরকার নেই ... এর অর্থ এই মুহূর্তে, আমি এই ডেটাটি প্রসেস করি না, তবে পরে যদি আমি এটি প্রক্রিয়া করতে চাই তবে সেই ডেটার প্রত্যেক ব্যবহারকারী বিনামূল্যে প্রসেসড ডেটা পান। বোকা উদাহরণ: ধরা যাক আপনি পর্দায় স্ট্রিংগুলি মুদ্রণ করুন এবং আপনি সাধারণত করেন print data। তারপরে, আপনি বুঝতে পারবেন যে সমস্ত স্ট্রিংগুলি আপার কেস হতে হবে - আপনাকে আপনার প্রোগ্রামের প্রতিটি মুদ্রণ সন্ধান করতে হবে এবং এতে পরিবর্তন করতে হবে print data.upper()। তবে আপনার যদি def cdata(data): return dataএবং সর্বত্র যদি বলা হয় print cdata(data), তবে আপনি কেবল বদলে যান def cdata(data): return data.upper()এবং এটিই একমাত্র পরিবর্তন।
করলি ব্রিগম্যান

আমি সেখানে আপনি কি বলতে চাই। এটি আরও
অর্থবোধ করে

2

এটি অকেজো নয়, আসলে এটি অত্যন্ত কার্যকর হতে পারে কারণ এটি আপনার কোডটিকে আরও ইউনিফর্ম এবং নমনীয় করে তোলে।

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

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


4
এটি দৃশ্যের সাথে খাপ খায় না। আমি একটি ফাংশন বলতে চাইছিলাম যা তার পরামিতিগুলি ফিরিয়ে দেয় এবং কোনও ক্ষেত্রেই অন্য কিছু না করে।
সেম্পি

@ স্যাম্পি: এটাই তিনি বলছেন। আপনি যদি একটি থাকে তাহলে Filterসঙ্গে বর্গ বা ইন্টারফেস MaleFilterএবং FemaleFilterউপশ্রেণী এবং আপনার কোড কিছু ফিল্টার, একটি ফিল্টার যা কিছুই না (অপরিবর্তিত তার পরামিতি ফেরৎ) প্রয়োজন কেমন হ্যান্ডেল হয় All। ফাংশনটি কখনই কিছু করে না, তবে এটির জন্য প্রতিস্থাপন করা যেতে পারে।
Magus

@ ম্যাগাস, তবে আপনার দৃশ্যে ফাংশনটি হ'ল একধরণের স্থানধারক, পরে স্থানান্তরিত হবে, বা কেবল উপস্থিত রয়েছে কারণ পুরানো ফাংশনটি অপ্রচলিত হয়ে উঠেছে তবে প্রোগ্রামের এই পাসস্ট্র্রু দরকার। যাইহোক, এটি কোনও হস্তান্তর নয়। ফিল্টারটি অন্য কোনও ফাংশনটিতে অপরিবর্তিত প্যারামিটার দেয় না, যেমনটি একটি ফিল্টার করতে পারে, তবে এটি কলিং ফাংশনে ফিরিয়ে দেয়।
সেম্পি 11

@ সিম্পি না, এটি কোনও স্থান নয়, এটি অস্থায়ী পাসথ্র্রু হিসাবে ব্যবহার নয়। এটি একটি দরকারী কোডিং (এবং গাণিতিক) ধারণা, "পরিচয়" ফাংশন। এবং, হ্যাঁ, এটি এখনও একটি হ্যান্ডওভার, এটি "অন্য ফাংশন" বা কলিং ফাংশনে ফিরিয়ে দেয় কিনা key মূলটি হ'ল "পরিচয়" ফাংশন কলিং ফাংশন দ্বারা ডাকা বিভিন্ন সম্ভাব্য ফাংশনগুলির মধ্যে একটি হতে পারে, এবং ব্যবহৃত হয় যখন ডাকা ফাংশনটি কিছু করার প্রয়োজন হয় না এবং যদি এবং বিশেষ-কেসিং এড়ানোর জন্য।
হেজাজমান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.