প্রতিবিম্ব ব্যবহার করে সমস্যা আছে?


49

আমি জানি না, তবে আমি সর্বদা মনে করি যখন আমি প্রতিবিম্ব ব্যবহার করি তখন আমি "প্রতারণা" করছি - সম্ভবত এটি আমি যে পারফরম্যান্সের আঘাতের কারণে জানি তা আমি গ্রহণ করছি।

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

প্রতিবিম্ব ব্যবহার করার সময় আমার কী কী সম্ভাব্য সমস্যাগুলি সন্ধান করা উচিত এবং সেগুলি সম্পর্কে আমার কতটা উদ্বিগ্ন হওয়া উচিত? আরও প্রচলিত সমাধান খুঁজতে চেষ্টা করার জন্য কতটা ব্যয় মূল্য?


2
আমার ধারণা এটি ভাষা এবং পরিবেশের উপর নির্ভর করে। কিছু এটি সমর্থন, এমনকি উত্সাহ। কখনও কখনও জাভাতে কাজ করার সময় আমি আরও ভাল প্রতিচ্ছবি সমর্থন চেয়েছিলেন।
হতাশ

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

1
আপনি কোন ভাষা ব্যবহার করছেন? ব্রেইনফাকের প্রতিবিম্ব নেই এবং পাইথন একেবারে আলাদা।
কাজ

1
প্রতিবিম্বের মাধ্যমে কেন ব্যক্তিগত পদ্ধতিতে অ্যাক্সেসের অনুমতি দেওয়া হচ্ছে তা আমি কখনই বুঝতে পারি নি। আমার অন্তর্দৃষ্টি অনুযায়ী এটি নিষিদ্ধ করা উচিত।
জর্জিও

3
বিশ্বাস করা শক্ত যে এই জাতীয় দুর্বল কথার প্রশ্নটি কোনও সম্পাদনা ছাড়াই ২ up টি আপভোট পেয়েছে।
অ্যারোনআউট

উত্তর:


48

না, এটি প্রতারণা করছে না - এটি কিছু প্রোগ্রামিং ভাষায় সমস্যাগুলি সমাধান করার উপায়।

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

আমাদের বর্তমান প্রকল্প (জাভা) এর দুটি উদাহরণ:

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

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


8
যখন আপনার কাছে রূপান্তর কারণে মধ্যবর্তী বস্তু থাকে তখন +1 প্রতিবিম্ব ডেটা আমদানি / রফতানির জন্য অবিশ্বাস্যভাবে কার্যকর।
এড জেমস

2
এটি ডেটা-চালিত অ্যাপ্লিকেশনগুলিতেও অবিশ্বাস্যভাবে কার্যকর - এর বিশাল স্ট্যাক ব্যবহার না করে if (propName = n) setN(propValue);আপনি নিজের (অর্থাত্) এক্সএমএল ট্যাগগুলিকে নিজের কোড বৈশিষ্ট্যের মতোই নাম রাখতে পারেন এবং সেগুলির উপর একটি লুপ চালাতে পারেন। এই পদ্ধতিটি পরবর্তীতে বৈশিষ্ট্য যুক্ত করা আরও সহজ করে তোলে।
মাইকেল কে

প্রতিবিম্ব ফ্লুয়েটএন হাইবারনেট এর মতো সাবলীল ইন্টারফেসে খুব বেশি ব্যবহৃত হয়।
স্কট হুইটলক

4
@ মিশেল: যতক্ষণ না আপনি ক্লাসে থাকা এই সম্পত্তিগুলির মধ্যে একটির নাম পরিবর্তন করে সিদ্ধান্ত নেবেন যে আপনার কোডটি বিস্ফোরিত হয়েছে। আপনার প্রোগ্রামটি যে জিনিসগুলি উত্পন্ন করে তার সাথে যদি আপনার তুলনামূলকতা বজায় রাখার দরকার না হয় তবে তা ঠিক আছে তবে আমার সন্দেহ হয় যে এটি আমাদের বেশিরভাগ নয়।
বিলি ওনিল

1
@ বিলি, আমি আপনার বিরোধিতা করার অর্থ বোঝাতে চাইনি, আপনি যা লিখেছেন তা নিয়ে আমি একমত। যদিও, আপনি যে উদাহরণটি এনেছেন তা হ'ল আইএমএইচও আরও সাধারণ নিয়মের একটি সাবকেস "পাবলিক ইন্টারফেস পরিবর্তন করা এড়াতে"।
পেটার টারিক

37

এটা প্রতারণা নয়। তবে অন্তত নিম্নলিখিত কারণে এটি উত্পাদন কোডে সাধারণত একটি খারাপ ধারণা:

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

আমি নিম্নলিখিত ক্ষেত্রে প্রতিবিম্বের ব্যবহার সীমাবদ্ধ করার পরামর্শ দেব:

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

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


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

3
মনে রাখবেন যে উপরের পয়েন্টগুলি আপনার পছন্দসই ভাষার ক্ষেত্রে প্রয়োগ হতে পারে বা নাও পারে। উদাহরণস্বরূপ, স্মল্টালকের প্রতিচ্ছবিটির কোনও গতি জরিমানা নেই, না আপনি সংকলন-সময় সুরক্ষা হারাবেন না, কারণ গণনা সম্পূর্ণ দেরিতে আবদ্ধ।
ফ্রাঙ্ক শায়ারার

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

2
@ ডিডালিনেক্স: আপনি কোন খারাপ দিকটি উল্লেখ করছেন? এই উত্তরে বেশ কয়েকটি রয়েছে। পারফরম্যান্স ইস্যু হ'ল ভাষা নির্ভর only
বিলি ওনিল

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

11

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


2
+1, এটি আমাকে প্রতিফলন কী তা বুঝতে সহায়তা করে । আমি একজন সি ++ প্রোগ্রামার এবং তাই আমি কখনও সত্যই প্রতিচ্ছবি আঁকিনি। এটি সাহায্য করে। । (যদিও আমি স্বীকার যে আমার দৃষ্টিকোণ থেকে, প্রতিফলন ভাষায় একটি অভাব মিলনসাধন করার একটা প্রচেষ্টা মত মনে হয় আমরা সি ++ বলছি যে জন্য টেমপ্লেটগুলি ব্যবহার তাই আমি আপনি যে একই বলতে পারে অনুমান করা :)।।
greyfade

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

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

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

8

আপনি যা অর্জন করতে চাইছেন তার উপর অবশ্যই এটি নির্ভরশীল।

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

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

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


1
"নিশ্চয়ই এগুলি নির্ভর করে আপনি কী অর্জন করার চেষ্টা করছেন তার উপর।" +1
ডেভশাউ

7

আপনি যদি কোনও গ্রন্থাগারের লেখক হন তবে প্রতিবিম্ব একটি দুর্দান্ত সরঞ্জাম no প্রতিবিম্ব এবং মেটা-প্রোগ্রামিংয়ের সংমিশ্রণটি আপনার গ্রন্থাগারকে নির্বিচারে কলারদের সাথে নির্বিঘ্নে বিন্যাসে কোড জেনারেশন ইত্যাদির ঝাঁপিয়ে পড়ে কাজ করতে দেয় can

আমি আবেদন কোডের প্রতিবিম্ব থেকে নিরুৎসাহিত করার চেষ্টা করি , যদিও; অ্যাপ্লিকেশন স্তরে আপনার বিভিন্ন রূপক - ইন্টারফেস, বিমূর্তি, এনক্যাপসুলেশন ইত্যাদি ব্যবহার করা উচিত


এই ধরনের লাইব্রেরিগুলি প্রায়শই ব্যবহার করা শক্ত এবং সর্বোত্তম এড়ানো (যেমন বসন্ত)।
শ্রীধর সারনোবাত

@ শ্রীধর তাই আপনি কখনও কোনও সিরিয়ালাইজেশন এপিআই ব্যবহার করেন নি? নাকি কোনও ওআরএম / মাইক্রো-ওআরএম?
মার্ক Gravell

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

7

বিকাশকারীদের জন্য বিল্ডিং সরঞ্জামগুলির জন্য প্রতিচ্ছবি দুর্দান্ত।

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

একটি সাধারণ প্রোগ্রামিং কৌশল হিসাবে এটি কার্যকর হতে পারে তবে বেশিরভাগ লোকের কল্পনা থেকে এটি খাঁটি।

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


প্রকৃতপক্ষে, বসন্তটি "বেশিরভাগ লোকেরা কল্পনা করে তার চেয়ে বেশি ভঙ্গুর"।
শ্রীধর সারনোবাত

5

উচ্চ সচেতনতার সাথে যদি ব্যবহার না করা হয় তবে ওও ভাষাগুলিতে প্রতিবিম্বের ব্যবহার প্রায়শই ক্ষতিকারক।

স্ট্যাকএক্সচেঞ্জ সাইটে আমি কয়টি খারাপ প্রশ্ন দেখেছি তার গণনা আমি হারিয়ে ফেলেছি

  1. ব্যবহৃত ভাষাটি ওও
  2. কোন ধরণের অবজেক্টটি পাস হয়েছে তা লেখক জানতে চান এবং তারপরে একটি পদ্ধতি কল করতে চান
  3. লেখক এই প্রতিবিম্বটি ভুল কৌশল হিসাবে গ্রহণ করতে অস্বীকার করেছেন এবং "আমাকে কীভাবে সাহায্য করবেন জানি না" হিসাবে এই বিষয়টিকে চিহ্নিত করে এমন কাউকে অভিযুক্ত করেছেন

এখানে হয় টিপিক্যাল উদাহরণ।

OO এর বেশিরভাগ পয়েন্ট এটি

  1. আপনি গ্রুপ ফাংশন যা জিনিস নিজেই একটি কাঠামো / ধারণা হস্তান্তর করতে জানেন।
  2. আপনার কোডের যে কোনও বিন্দুতে আপনাকে কোনও অবজেক্টের প্রকারের সম্পর্কে যথেষ্ট পরিমাণে জানতে হবে এটিতে কী প্রাসঙ্গিক ফাংশন রয়েছে তা জানতে এবং সেই ফাংশনগুলির নির্দিষ্ট সংস্করণটি কল করতে বলুন।
  3. আপনি প্রতিটি ফাংশনের জন্য সঠিক ইনপুট প্রকারটি নির্দিষ্ট করে এবং প্রতিটি ফাংশন প্রাসঙ্গিকের চেয়ে বেশি (এবং আরও কিছু করবেন না) জেনে পূর্ববর্তী পয়েন্টটির সত্যতা নিশ্চিত করেন।

যদি আপনার কোডের কোনও বিন্দুতে, বিন্দু 2 কোনও বস্তুটি আপনাকে উত্তীর্ণের জন্য বৈধ নয় তবে এর মধ্যে এক বা একাধিক সত্য

  1. ভুল ইনপুট খাওয়ানো হচ্ছে
  2. আপনার কোডটি খারাপভাবে কাঠামোযুক্ত
  3. তুমি কী করছ তা তোমার কোনও ধারণা নেই।

দুর্বল দক্ষ বিকাশকারীরা কেবল এটি পান না এবং তারা বিশ্বাস করেন যে তাদের কোডের যে কোনও অংশে তারা যে কোনও কিছুতে পাস হতে পারে এবং সম্ভাবনার একটি (হার্ড-কোডেড) সেট থেকে যা চান তারা তা করতে পারেন। এই মূর্খরা প্রতিবিম্ব অনেক ব্যবহার করে ।

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


3

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

পরিস্থিতির উপর নির্ভর করে এটি আপনাকে আরও দ্রুত কোড তৈরি করতে সহায়তা করতে পারে - বা কেবল প্রচুর কোড ব্লাট করে। এটি প্রতিবিম্বের অসুবিধাগুলি এড়িয়ে যায়:

  • সংকলন-টাইপ সুরক্ষা ক্ষতি
  • রিফ্যাক্টরিংয়ের কারণে বাগগুলি
  • ধীর পারফরম্যান্স

আগে উল্লিখিত।

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


2

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

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

যাহোক.

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

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


2

প্রতিবিম্বের সাথে আমাদের একটি সমস্যা হ'ল আমরা যখন মিশ্রণে ওফসকেশন যোগ করি । সমস্ত শ্রেণীর নতুন নাম আসে এবং হঠাৎ করে কোনও শ্রেণি বা ফাংশন লোড করা এর নাম দিয়ে কাজ করা বন্ধ করে দেয়।


1

এটি পুরোপুরি নির্ভর করে। প্রতিবিম্ব ছাড়াই যে কাজ করা কঠিন হতে পারে তার উদাহরণ হ'ল অবজেক্টলিস্টভিউর প্রতিলিপি করা । এটি ফ্লাইতে আইএল কোডও জেনারেট করে।


1

প্রতিচ্ছবি হ'ল কনভেনশন-ভিত্তিক সিস্টেম তৈরির প্রাথমিক পদ্ধতি। বেশিরভাগ এমভিসি ফ্রেমওয়ার্কের অভ্যন্তরে এটি ভারী ব্যবহৃত হচ্ছে তা অবাক করে আমি অবাক হব না। এটি ওআরএম-এর একটি প্রধান উপাদান। সম্ভাবনাগুলি হ'ল, আপনি ইতিমধ্যে প্রতিদিন এটি দিয়ে নির্মিত উপাদানগুলি ব্যবহার করছেন।

এই জাতীয় ব্যবহারের বিকল্প হ'ল কনফিগারেশন, যার নিজস্ব ত্রুটিগুলির সেট রয়েছে।


0

প্রতিচ্ছবি এমন জিনিস অর্জন করতে পারে যা ব্যবহারিকভাবে অন্যথায় করা যায় না।

উদাহরণস্বরূপ, এই কোডটি কীভাবে অনুকূল করা যায় তা বিবেচনা করুন:

int PoorHash(char Operator, int seed, IEnumerable<int> values) {
    foreach (var v in values) {
        seed += 1;
        switch (char) {
            case '+': seed += v; break;
            case '^': seed ^= v; break;
            case '-': seed -= v; break;
            ...
        }
        seed *= 3;
    }
    return seed;
}

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

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

(দ্রষ্টব্য: আমি প্রথমে একটি চরের পরিবর্তে ফানক পাস করার সমতুল্য চেষ্টা করেছিলাম এবং এটি কিছুটা ভাল ছিল তবে প্রায় 10x প্রতিফলনটি অর্জন করেনি))


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

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

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

আমি আদর্শ 'কাঠামোগত সাম্য' উদাহরণ এড়াতে চেয়েছিলাম। স্ব-সংশোধনকারী কোডের জন্য প্রতিচ্ছবি প্রয়োজন হয় না তবে এটি অবশ্যই সহায়তা করে।
ক্রেগ গিডনি

আসলে তা না. আপনি প্রতি-প্রতিবিম্বিত ভাষাগুলিতে ঠিক এটি করতে পারেন।
বিলি ওনিল

-2

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

এবং আপনি যদি কোনও .class ফাইলের কোডটি দেখতে চান (জাভাতে) তবে বেশ কয়েকটি ডিকম্পিলার বিনামূল্যে পাওয়া যায়!


সংক্ষিপ্তকরণ একটি প্রতিবিম্ব বৈশিষ্ট্য নয়।
বিলি ওনিল

হ্যাঁ, এটি নয় ... তবে আমি বলতে চাইছিলাম যে আপনি যদি ভুলের চেয়েও প্রতিবিম্ব (যা আপনাকে জাভাতে যে কোনও শ্রেণির বিবরণ সরবরাহ করে) ব্যবহার করার সময় প্রতারণার মতো মনে করেন তবে কোকোজের প্রতিচ্ছবি একটি খুব দরকারী ধারণা এবং যদি কোনওটির বিশদ প্রাপ্ত হয় শ্রেণি যা আপনার সম্পর্কে যা তার চেয়ে সহজেই কোনও
ডিসকম্পেলার

2
হ্যাঁ, কিছু ক্ষেত্রে প্রতিফলন একটি দরকারী ধারণা। তবে আমি এটি ব্যবহার করা দেখছি এর 99.9% আমি দেখতে পাই এটি কোনও ডিজাইনের ত্রুটির আশপাশে হ্যাক করার জন্য ব্যবহৃত হয়েছিল।
বিলি ওনিল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.