পরামিতি হিসাবে খারাপ ফাংশন অন্যান্য ফাংশন মধ্যে পাস?


40

আমরা আমাদের এএস 3 অ্যাপ্লিকেশনটি কীভাবে আমাদের পিছনের প্রান্তে কথা বলি তা পরিবর্তন করার প্রক্রিয়াতে এসেছি এবং আমরা আমাদের পুরানোটিকে প্রতিস্থাপনের জন্য একটি REST সিস্টেম বাস্তবায়নের প্রক্রিয়াতে চলেছি।

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

এটি আমাকে সেই "খারাপ অনুভূতি" দিচ্ছে যেখানে এটি আমার কাছে ভয়াবহ অনুশীলন বলে মনে হয় এবং আমি সিস্টেমে পুনরায় কাজ করার প্রস্তাব দেওয়ার আগে আমি এর কয়েকটি কারণ সম্পর্কে চিন্তাভাবনা করতে পারি confir আমি ভাবছিলাম এই সম্ভাব্য সমস্যাটির সাথে কারও অভিজ্ঞতা আছে কিনা?


22
কেন এমন লাগছে? ফাংশনাল প্রোগ্রামিং নিয়ে আপনার কি কোনও অভিজ্ঞতা আছে? (আমি ধরে নিব না, তবে আপনার একবার দেখে নেওয়া উচিত)
ফোশি

8
তাহলে এটিকে একটি পাঠ বিবেচনা করুন! একাডেমিয়া কী শিক্ষা দেয় এবং আসলে কী কার্যকর তা প্রায়শই আশ্চর্যরকমভাবে সামান্য ওভারল্যাপ করে। প্রোগ্রামিং কৌশলগুলির একটি সম্পূর্ণ বিশ্ব আছে যেগুলি এই ধরণের ধরণের মতবাদের সাথে খাপ খায় না।
ফোশি

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

36
আমার দিন ফিরে আমরা এই
মাইকে

11
@ ব্লুহ্যাট এই এন.ইউইকিপিডিয়া.org / উইকি / কলব্যাক_জে কম্পিউটার_প্রেমিংটি পড়ুন )
মাইক

উত্তর:


84

এটি কোনও সমস্যা নয়।

এটি একটি পরিচিত কৌশল technique এগুলি হ'ল অর্ডার ফাংশন (ফাংশন যা পরামিতি হিসাবে ফাংশন নেয়)।

এই জাতীয় ফাংশন ক্রিয়ামূলক প্রোগ্রামিংয়ের একটি প্রাথমিক বিল্ডিং ব্লক এবং হাস্কেলের মতো ক্রিয়ামূলক ভাষায় ব্যাপকভাবে ব্যবহৃত হয় ।

এই ধরনের ফাংশনগুলি খারাপ বা ভাল নয় - আপনি যদি ধারণা এবং কৌশলটির মুখোমুখি না হন তবে প্রথমে তাদের উপলব্ধি করা কঠিন হতে পারে তবে তারা খুব শক্তিশালী হতে পারে এবং আপনার টুলবেল্টে রাখার জন্য এটি একটি ভাল সরঞ্জাম।


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


8
@ ব্লুহ্যাট আপনি কীভাবে এটির ব্যবহারের নিয়ন্ত্রণ রাখতে চান এমন কোনও কিছু ব্যক্তিগত হিসাবে ঘোষণা করেন, যদি সেই ব্যবহারটি নির্দিষ্ট ফাংশনের জন্য কলব্যাক হিসাবে থাকে তবে তা ঠিক আছে
রাচেট ফ্রিক

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

2
লক্ষণীয় যে আপনি যদি কনস্ট্রাক্টর প্যারামিটার হিসাবে ফাংশন সহ কংক্রিটের ক্লাস নিজেরাই লিখেন তবে আপনি সম্ভবত এটি ভুল টিএম করছেন
গুডডর

30

এগুলি কেবল কার্যকরী প্রোগ্রামিংয়ের জন্য ব্যবহৃত হয় না। এগুলি কলব্যাক হিসাবেও পরিচিত হতে পারে :

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

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

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


1
কলব্যাক পরিভাষা ব্যবহারের জন্য +1। "উচ্চতর ক্রম ফাংশন" এর চেয়ে আমি এই শব্দটির প্রায়শই বেশি মুখোমুখি হই।
রডনি শুলার

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

11

এটা খারাপ কিছু না। আসলে এটি খুব ভাল জিনিস।

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

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

প্রযুক্তিগতভাবে, একটি সি ++ ফান্টেক্টর হ'ল একধরণের কলব্যাক অবজেক্ট যা operator()()একই জিনিসটি করতে সিনট্যাকটিক চিনির উপর নির্ভর করে ।

শেষ অবধি, সি-স্টাইলের ফাংশন পয়েন্টার রয়েছে যা কেবলমাত্র সি তে ব্যবহার করা উচিত detail উপরে উল্লিখিত অন্যান্য বিমূর্ততাগুলি অনেক উন্নত এবং সেগুলি যে ভাষাগুলি রয়েছে সেগুলিতে ব্যবহার করা উচিত।

অন্যরা ফাংশনাল প্রোগ্রামিং এবং সেই ভাষাগুলিতে কীভাবে পাসিং ফাংশনগুলি খুব স্বাভাবিক তা উল্লেখ করেছেন। ল্যাম্বডাস এবং কলব্যাকগুলি পদ্ধতিগত এবং ওওপি ভাষাগুলি যেভাবে অনুকরণ করে তা হ'ল এবং সেগুলি খুব শক্তিশালী এবং কার্যকর।


এছাড়াও, সি # তে প্রতিনিধি এবং ল্যাম্বডাস উভয়ই ব্যাপকভাবে ব্যবহৃত হয়।
এভিল ডগ পাই

6

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

public void doSomethingGeneric(ISpecifier specifier) {
    //do generic stuff
    specifier.doSomethingSpecific();
    //do some other generic stuff
}

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


1
এই আইডিয়মটি কেবল কোনও ইন্টারফেসে ফাংশনটি মোড়ানো হয়, কাঁচা ফাংশনটি পাস করার অনুরূপ কিছু সম্পাদন করে

হ্যাঁ এটি হ'ল, আমি কেবল দেখাতে চেয়েছিলাম যে এটি কোনও অস্বাভাবিক অনুশীলন নয়।
ফিলিপ ম্যারি

3

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

সাধারণ কলব্যাকের কয়েকটি সম্ভাব্য ত্রুটি রয়েছে যদিও:

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

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

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


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