আমি কী ভেবে ভুল করছি যে অটোম্যাপারের মতো কোনও কিছুর প্রয়োজন দুর্বল ডিজাইনের ইঙ্গিত?


35

অটোম্যাপার। নেট এর জন্য একটি "অবজেক্ট-অবজেক্ট ম্যাপার", যার অর্থ একটি শ্রেণি থেকে অবজেক্টগুলি অন্য শ্রেণিতে অনুলিপি করা যা একই জিনিসকে উপস্থাপন করে।

কেন এটি সর্বদা দরকারী? ক্লাসগুলির সদৃশ কি কখনও কার্যকর / ভাল ডিজাইনের?


একটু রেফারেন্স: devtrends.co.uk/blog/… বিশেষত "আমরা স্বয়ংচালক ব্যবহার করতে পারি না কেন?" বিভাগটি পড়ুন?
জানি হাইতিয়েনেন

উত্তর:


28

একটি দ্রুত গুগল অনুসন্ধান এই উদাহরণটি প্রকাশ করেছে:

http://www.codeproject.com/Articles/61629/AutoMapper

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

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

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


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

1
@ তাত্ত্বিকভাবে স্ট্যাটিক_আরটি হ্যাঁ, তবে আপনি সম্ভবত এটি চান না যে আপনার আসল শ্রেণিটি প্রকাশ্যে বা / এবং কোনও সমাবেশে প্রকাশিত
হোক

2
@ স্ট্যাটিক_আরটি: হ্যাঁ, এটি একটি সম্পূর্ণ বৈধ, ভিন্ন পদ্ধতি। এই দুটি ডিজাইনের মধ্যে প্রধান পার্থক্য হ'ল ডেটা / বৈশিষ্ট্যগুলির জীবনকাল। অনুলিপিগুলি ব্যবহার করে আপনাকে ডেটার একটি স্ন্যাপশট সরবরাহ করে, বৈশিষ্ট্যগুলি ব্যবহার করে মূল ডেটার উল্লেখ করা হয় না। উভয় পদ্ধতিরই এর পক্ষে মতামত রয়েছে, তবে আইএমএইচও সাধারণভাবে কোনও "ভাল বা খারাপ" নেই। অতিরিক্তভাবে, কার্য সম্পাদনের বিবেচনা থাকতে পারে, যা কী ব্যবহার করবেন তা সিদ্ধান্তে প্রভাব ফেলতে পারে বা নাও পারে।
ডক ব্রাউন 14

3
যতটা সম্ভব ডিক্লুপিং করা সর্বদা একটি ভাল ধারণা। এটি এমনকি ক্ষুদ্র প্রকল্পগুলির জন্য বিশেষ উপকারী বলে নয়, তবে প্রকল্পগুলি বৃদ্ধি পেতে পারে।
ট্যামস সেজেলি

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

45

ক্লাসগুলির সদৃশ কি কখনও কার্যকর / ভাল ডিজাইনের?

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

অটোম্যাপার ব্যবহার যতদূর যায়, আমি ব্যক্তিগতভাবে এটিকে 3 টি কারণে এড়িয়ে চলেছি:

নিরব ব্যর্থতা আরও সাধারণ

কারণ স্বয়ংক্রিয়ভাবে বৈশিষ্ট্যগুলির মধ্যে অটোম্যাপার ম্যাপস, এক শ্রেণিতে একটি সম্পত্তির নাম পরিবর্তন করা এবং অন্যটি নয় তবে সম্পত্তি ম্যাপিং এড়ানো যায়। সংকলক জানতে পারবে না। অটোম্যাপার যত্ন নেবে না।

স্থির বিশ্লেষণের অভাব

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

দেরীতে প্রয়োজনীয়তা যা জটিলতা বাড়ায়

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

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

সংক্ষেপে, অটোম্যাপারে পৌঁছানোর আগে নিজেকে এক ক্লাসে অন্য ক্লাসে ম্যাপিংয়ের 30 সেকেন্ডের নিজেকে 30 সেকেন্ড সংরক্ষণ করার আগে, এটি সম্পর্কে ভাবুন।

প্রোগ্রামিং হ'ল কম্পিউটারটিকে অন্য একজন যা করতে চায় তা বলার শিল্প। - ডোনাল্ড নুথ

এটি মাথায় রেখে, নিজেকে জিজ্ঞাসা করুন "আজ অটোম্যাপার সহায়ক এবং এটি কি আগামীকাল হবে?"


[আপনি যদি ট্রেন্ডি ওয়েব দেব করেন] সুতরাং আপনি যদি একটি আরএসটি ওয়েব পরিষেবা লিখছেন তবে আপনার জাভাস্ক্রিপ্ট অবজেক্ট মডেলটি আপনার .NET অবজেক্ট মডেলের সাথে সামঞ্জস্যপূর্ণ কিনা তা নিশ্চিত করার জন্য আপনি সর্বদা প্রতিটি সম্পত্তি পরীক্ষা করে দেখেন?
ডেন

3
@ দিন - হ্যাঁ এবং আপনি সমস্ত সম্পত্তি সঠিকভাবে পেয়েছেন তা নিশ্চিত করার জন্য আপনি পরীক্ষা লিখেন (যেমন আপনার পরীক্ষাটি এমন কোনও বৈশিষ্ট্য প্রদর্শন করবে যা আপনি 1 জায়গায় যুক্ত করেছেন যা অন্যান্য স্তরে প্রচারিত হয় না)
gbjbaanb

@gbjbaanb আমি সম্ভবত সাধারণভাবে এই বৈধতাটির জন্য প্রতিচ্ছবি ব্যবহার করব। কিছু বৈধতা যুক্ত করতে অটোম্যাপার বাড়ানোর সম্ভাবনাটি সম্ভবত আবিষ্কার করুন। স্পষ্টভাবে এড়াতে চান প্রচুর ম্যানুয়াল বরাদ্দকরণ এর।
ডেন

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

21

আমার অভিজ্ঞতায়, যখন কেউ 'অত্যধিক বয়লারপ্লেট' সম্পর্কে অভিযোগ করেছে এবং অটোম্যাপার ব্যবহার করতে চায়, তখন এটি নিম্নলিখিতগুলির মধ্যে একটি:

  1. তারা একই কোডটি বারবার লিখতে জ্বালাতন করে।
  2. তারা অলস এবং কোড লিখতে চায় না যা অক্ষ = বিএক্স করে
  3. এ্যাক্স = বিএক্স বারবার লিখার পক্ষে একটি ভাল ধারণা এবং তারপরে কার্যটির জন্য ভাল কোড লিখতে হবে কিনা তা নিয়ে তারা আসলে অনেক সময় চাপের মধ্যে রয়েছে।

যাহোক:

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

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

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

সুতরাং, ক্লাসগুলির সদৃশ কি খারাপ ডিজাইন? অগত্যা।

অটোম্যাপার কী খারাপ ধারণা? হ্যাঁ একেবারে.

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


1
ভাল বলেছেন, বিশেষত ২।
মার্ডক্সক্স

2
আমি জানি যে এটি খুব পুরানো থ্রেড, তবে আমার সাথে একমত হতে হবে না ১। আপনি বিমূর্ত ম্যাপিংয়ের কোনও পদ্ধতি তৈরি করতে পারবেন না। আপনি 1 শ্রেণীর জন্য করতে পারেন, তবে যদি 2 থাকে তবে আপনার 2 টি পদ্ধতি প্রয়োজন। 3 - 3 পদ্ধতি। এএম সহ এই কোডের 1 লাইন - ম্যাপিংয়ের সংজ্ঞা। অধিকন্তু, আমি সত্যিই একটি দৃশ্যের সাথে লড়াই করেছি, যেখানে আমার একটি তালিকা <ব্যাসটাইপ> 10 সাব টাইপ ডিটিও দিয়ে পূর্ণ। আপনি যখন এটি মানচিত্র করতে চান, আপনার ক্ষেত্রের মানগুলি অনুলিপি করার জন্য টাইপ এবং টাইপ করার একটি পদ্ধতি দরকার। এবং যদি কোনও একটি ক্ষেত্রকে আলাদাভাবে ম্যাপ করতে হয় তবে কী হবে? আপনার উত্তরটি কেবলমাত্র ভাল যদি আপনার কয়েকটি সাধারণ ক্লাস থাকে। অটোম্যাপার আরও জটিল পরিস্থিতিতে হাতছাড়া করে।
ব্যবহারকারী 3512524

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

7

এখানে একটি গভীর সমস্যা রয়েছে: সি # এবং জাভা জোর দেয় যে সর্বাধিক / সমস্ত প্রকারের কাঠামোর পরিবর্তে নাম অনুসারে পৃথক করা উচিত: উদাহরণস্বরূপ class MyPoint2Dএবং class YourPoint2Dযথাযথ একই সংজ্ঞা থাকলেও পৃথক প্রকারের। আপনি যে প্রকারটি চান তা যখন " xক্ষেত্র এবং ক্ষেত্রের সাথে কিছু বেনামে জিনিস y" হয় (অর্থাত্ একটি রেকর্ড ), আপনি ভাগ্যের বাইরে। সুতরাং আপনি যখন একটিকে YourPoint2Dরূপান্তর করতে চান MyPoint2D, তখন আপনার কাছে তিনটি বিকল্প রয়েছে:

  1. এর লাইন বরাবর কিছু ক্লান্তিকর, পুনরাবৃত্তিমূলক, জাগতিক বয়লারপ্লেট লিখুন this.x = that.x; this.y = that.y
  2. কোনওভাবে কোড তৈরি করুন।
  3. প্রতিবিম্ব ব্যবহার করুন।

পছন্দ 1 ছোট ডোজগুলিতে যথেষ্ট সহজ তবে যখন আপনার মানচিত্রের প্রয়োজনের ধরণের সংখ্যা বড় হয় তখন তাড়াতাড়ি কাজকর্ম হয়।

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

যে আপনাকে প্রতিবিম্ব সঙ্গে ছেড়ে দেয়। আপনি নিজে এটি করতে পারেন বা আপনি অটোম্যাপার ব্যবহার করতে পারেন।


3

অটোম্যাপার হ'ল সেই লাইব্রেরি / সরঞ্জামগুলির মধ্যে একটি যেখানে সম্রাট আক্ষরিক অর্থে বাটকে নগ্ন হয়ে ঘুরে বেড়াচ্ছেন। যখন আপনি চকচকে লোগোটি পেয়ে যাবেন, আপনি বুঝতে পারবেন এটি আরও ভাল ফলাফলের সাথে ম্যানুয়ালি করতে পারবেন না এমন কিছু করে না।

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

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

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