ডেটা ট্রান্সফার অবজেক্টস (ডিটিও) কেন একটি অ্যান্টি-প্যাটার্ন?


132

আমি সম্প্রতি লোকদের শুনেছি যে ডেটা ট্রান্সফার অবজেক্টস (ডিটিও) একটি অ্যান্টি-প্যাটার্ন

কেন? বিকল্পগুলি কি?


11
সম্ভবত ব্যবসায়ের জিনিসগুলি নিজেরাই নিজের ডেটা পরিবহনে সক্ষম হওয়ায় আপনাকে অনেক ধন্যবাদ!
জোয়েডবার্গ

13
"এন্টি-প্যাটার্ন" আমার "মনোনীত বাক্যাংশের" জন্য উপযুক্ত হতে পারে যার বাক্যটির 15 মিনিট অনেক আগে ছিল a এটি "এখনই এটি সুপরিচিত ..."
ক্রেগ স্টান্টজ

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

10
DTOs শুকনো নীতি, যা J2EE মধ্যে unfortunatly ঘোরা বাস্তব রূপ দান Do নিজেকে পুনরাবৃত্তি।
জোফোরকার

আপনি এটি পড়তে চাইতে পারেন: ডেটা ট্রান্সফার
অবজেক্টটি

উত্তর:


139

কিছু প্রকল্পে দু'বার সমস্ত ডেটা থাকে । একবার ডোমেন অবজেক্ট হিসাবে, এবং একবার ডেটা স্থানান্তর বস্তু হিসাবে।

এই সদৃশটির একটি বিশাল ব্যয় রয়েছে , তাই স্থাপত্যটির উপযুক্ত হওয়ার জন্য এই বিচ্ছেদ থেকে একটি বিশাল সুবিধা পাওয়া দরকার।


5
দয়া করে "বিশাল ব্যয়" এর বিস্তারিত বর্ণনা করুন। এছাড়াও, বলুন কেন ডিটিও ক্লাস তৈরি করতে কোড উত্সাহ কৌশল ব্যবহার করে ব্যয়টি হ্রাস করা যায় না।
জন স্যান্ডার্স

70
+1 টি। দুবার? কেবলমাত্র যদি আপনি ভাগ্যবান হন :-) এমন প্রকল্পগুলি যেগুলি ডিটিও হিসাবে ডোমেনিকেট ডোমেনটি সত্তাগুলিরও পরিপূরক হিসাবে প্রায় একই ধরণের তবে ওহ-তাই-সাবটলি-ভিন্ন ইউআই মটরশুটি থাকে to এটি ৩. এবং, godশ্বর যদি নিষেধ না করেন তবে কিছুটা রিমোটিং (ওয়েব সার্ভিসেস / এক্সএমএল-আরপিসি / যা কিছু) চলছে, আপনি সহজেই 4 বা 5
পৌঁছে

17
আমি বর্তমানে একটি এন্টারপ্রিসির সাথে কাজ করছি 14 স্তর লাসাগনা আর্কিটেকচার (বাচ্চা নয়)। আমি আপনাকে নিশ্চয়তা দিতে পারি যে 11-বা তাই স্তরগুলি যা মূলত ডেটা ট্রান্সারগুলির জন্য হয় সেগুলি নিখরচায় আসে না।
কার্লপি

10
এছাড়াও, আমি যখন বোকা নকশাগুলি নিয়ে কাজ করার সময় কোড জেনারেটরগুলিকে একেবারে পছন্দ করি তখন তারা হ'ল) ​​একটি নিশ্চিত জিনিস যা আপনি এটি দিয়ে ভুলটি করছেন। খ) তারা নিখরচায় আসে না।
কার্লপি

7
দুঃখিত, তবে এটি ঠিক ভুল এবং ভুল উত্তরটি উচ্চ ভোট পেয়ে স্বীকৃত হয়েছে। প্রথমে আপনি ফ্লাইতে ডিটিও তৈরি করতে প্রতিবিম্ব ব্যবহার করতে পারেন। দ্বিতীয়ত আপনি একটি "রুট সংজ্ঞা" ব্যবহার করতে পারেন যেমন CASE সিস্টেমে বা OAW এ এবং বিও এবং ডিটিও তৈরি করতে পারেন। তৃতীয়টি আপনি একটি এক্সএসডি এবং জ্যাকএক্সবি ব্যবহার করতে পারেন ডিটিও তৈরি করতে এবং ডিটিওকে বিওর ভিত্তি হিসাবে ব্যবহার করতে পারেন, বা আপনি এক্সএসডি থেকে উভয়ই তৈরি করতে পারেন ... যাইহোক, কেউ যদি ডিবি থেকে সদ্য তাজা নিয়ে আসা কোনও ইজেবি স্থানান্তর করার সাহস করে? একটি ক্লায়েন্ট প্রোগ্রামের তারে ... আমি যে পরিবেশে কাজ করি তার মাথাটি খুব শীঘ্রই রূপোর প্লেটে
উঠবে

128

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

আমি জানি এটি একটি জাভা-ভিত্তিক প্রশ্ন, তবে .NET ভাষায় বেনামে প্রকারভেদ, সিরিয়ালাইজেশন এবং লিনকিউ ডিটিওগুলিকে অন-ফ্লাই তৈরির অনুমতি দেয় যা সেগুলি ব্যবহারের সেটআপ এবং ওভারহেডকে হ্রাস করে।


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

8
উম, জন, এটা ঠিক সত্য নয়। আপনি ঠিকঠাক জেএসএনে বেনামে ধরণের সিরিয়ালাইজ করতে পারেন। এটি একটি এমভিসি অ্যাপ্লিকেশনে ব্যবহার করে দেখুন: জসনকে ফিরিয়ে দিন (নতুন {ফু = "হাই হাই!}); আমি আপনাকে প্রতিশ্রুতি দিচ্ছি যে এটি ঠিকঠাক কাজ করে। অজ্ঞাতনামা প্রকারের চেয়ে সম্ভবত, বেনামের ধরণের সাধারণত অবজেক্টের গ্রাফগুলিতে কোনও চক্র থাকে না perhaps , যা
জেএসএন

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

1
গ্যাবটি ঠিক আছে, ডিটিও কোনও সেটের জন্য কোনও অ্যান্টি-প্যাটার্ন নয় (কোনও ডেটা ডুপ্লিকেশন না থাকলে তবে এটি ভুলভাবে ব্যবহার করা যেতে পারে!)। উদাহরণস্বরূপ, বিও বিভিন্ন উত্স থেকে ডেটা ডিটিওতে সমষ্টি করতে পারে।
অ্যাস্ট্রো

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

25

EJB 3.0 এ ডিটিও একটি অ্যান্টিপ্যাটার্ন বলেছেন:

EJB 3.0 এর পূর্বে EJB স্পেসিফিকেশনে সত্তার মটরশুটিগুলির ভারী ওজন প্রকৃতির ফলে ডেটা স্থানান্তর অবজেক্টস (ডিটিও) এর মতো নকশার নিদর্শনগুলির ব্যবহার শুরু হয়েছিল। ডিটিওগুলি লাইটওয়েট অবজেক্টে পরিণত হয়েছিল (যা প্রথমে তাদের সত্তা মটরশুটি হওয়া উচিত) যা স্তরগুলি জুড়ে ডেটা প্রেরণের জন্য ব্যবহৃত হয়েছিল ... এখন ইজেবি 3.0 স্পেকটি সত্তা পুরানো জাভা অবজেক্ট (পোজো) এর মতো সত্তা বিনের মডেলটিকে তৈরি করে। এই নতুন পোজো মডেলটির সাথে আপনার আর প্রতিটি সত্তার জন্য বা সত্তা সংস্থার জন্য কোনও ডিটিও তৈরি করার প্রয়োজন হবে না ... আপনি যদি EJB 3.0.০ সত্ত্বা পাঠাতে চান তবে তাদের কেবল java.io.Sialiazable বাস্তবায়ন করুন


6
আপনি যখন একই JVM- তে মেমরির মধ্যে পদ্ধতিগুলির মধ্যে অবজেক্ট স্থানান্তর করেন তখন সত্য। সত্য আপনি যখন তারের উপর দিয়ে সিরিয়ালিং করছেন এবং কতটা সিরিয়ালাইজ করতে হবে তার নিয়ন্ত্রণ চান, এবং / অথবা অলস লোডিং সংরক্ষণ করুন true
wrschneider

হ্যাঁ, এবং এমনকি একই জেভিএম-তে, আপনি যদি জেইই / স্প্রিং ট্রানজিশনাল পরিচালনা ব্যবহার করেন তবে আপনার একই থ্যাডে থাকার জন্য সত্যই যত্ন নেওয়া উচিত।
মার্ক

20

আমি মনে করি না ডিটিওগুলি প্রতি সেফ একটি অ্যান্টি-প্যাটার্ন, তবে ডিটিও ব্যবহারের সাথে যুক্ত রয়েছে অ্যান্টিপ্যাটার্ন। বিল ডুডনি একটি উদাহরণ হিসাবে ডিটিও বিস্ফোরণকে বোঝায়:

http://www.softwaresummit.com/2003/speakers/DudneyJ2EEAntiPatterns.pdf

এখানে ডিটিওর বেশ কয়েকটি গালিগালাজ উল্লেখ করা হয়েছে:

http://anirudhvyas.com/root/2008/04/19/abuses-of-dto-pattern-in-java-world/

স্তরগুলির মধ্যে ডেটা পাস করার উপায় হিসাবে তিন স্তরের সিস্টেমের (সাধারণত প্রযুক্তি হিসাবে EJB ব্যবহার করা) কারণেই তাদের উত্স। স্প্রিংয়ের মতো ফ্রেমওয়ার্কের উপর ভিত্তি করে বেশিরভাগ আধুনিক জাভা সিস্টেমগুলি POJO গুলি ডোমেন অবজেক্ট হিসাবে ব্যবহার করে (প্রায়শই জেপিএ ইত্যাদির সাহায্যে বর্ণিত হয় ...) একক স্তরে ... এখানে ডিটিও ব্যবহার অপ্রয়োজনীয়।


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

19

ওও পিউরিস্টরা বলবেন যে ডিটিও হ'ল অ্যান্টি-প্যাটার্ন কারণ প্রকৃত ডোমেন অবজেক্টের পরিবর্তে অবজেক্টগুলি ডাটা টেবিলের উপস্থাপনা হয়ে যায়।


9

কেউ কেউ সম্ভাব্য আপত্তিজনক কারণে ডিটিওকে একটি অ্যান্টি-প্যাটার্ন হিসাবে বিবেচনা করে। এগুলি প্রায়শই ব্যবহার করা হয় যখন সেগুলি হওয়ার / প্রয়োজন হবে না।

এই নিবন্ধটি অস্পষ্টভাবে কিছু আপত্তি বর্ণনা করে।


1
নিবন্ধটি আরও সঠিকভাবে ডিটিওগুলি একটি নিদর্শন হিসাবে বর্ণনা করে যা আপত্তিজনক হতে পারে be
ক্রেগ স্টান্টজ

এটি একটি লিঙ্ক-কেবল উত্তরের পরিমাণে, এটি নিবন্ধের কমপক্ষে একটি উদ্ধৃতি প্রয়োজন। জানেন না কীভাবে এটি উত্তর হিসাবে উত্তর হিসাবে পতাকাঙ্কিত না হতে পারে।
নাথান হিউজেস


7

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

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

আমার মতে এটি এন্টি-প্যাটার্ন হিসাবে দেখা হচ্ছে কারণ এটির ভুল ব্যবহার রয়েছে। আপনি যদি বিতরণ ব্যবস্থা না তৈরি করেন তবে আপনার সেগুলির দরকার নেই এমন সম্ভাবনা রয়েছে।


4

একটি উদ্দেশ্য ডেটা স্থানান্তর অবজেক্ট বিভিন্ন সূত্র থেকে তথ্য সংরক্ষণ এবং তারপর এটি একটি ডাটাবেস মধ্যে স্থানান্তর (অথবা হয় রিমোট ছদ্মরূপ একবারে)।

তবে ডিটিও প্যাটার্ন একক দায়িত্বের নীতি লঙ্ঘন করে , যেহেতু ডিটিও কেবল ডেটা সঞ্চয় করে না, তবে এটি ডেটাবেস বা সম্মুখস্থ স্থানান্তর করে।

ব্যবসায়ের বস্তু থেকে ডেটা অবজেক্টগুলিকে আলাদা করার প্রয়োজন কোনও অ্যান্টিপ্যাটার্ন নয়, কারণ সম্ভবত এটি ডাটাবেস স্তর পৃথক করার প্রয়োজন is কোনওভাবেই ।

ডিটিওগুলির পরিবর্তে আপনার সমষ্টি এবং সংগ্রহস্থল প্যাটার্নগুলি ব্যবহার করা উচিত, যা বস্তুর সংগ্রহ ( সমষ্টি ) এবং ডেটা স্থানান্তরকে পৃথক করে ( সংগ্রহস্থল ) পৃথক করে।

একদল অবজেক্টের স্থানান্তর করতে আপনি এটি ব্যবহার করতে পারেন ইউনিট অফ ওয়ার্ক প্যাটার্নটি , এটিতে রিপোজিটরিগুলির একটি সেট এবং লেনদেনের প্রসঙ্গ রয়েছে; সামগ্রিকভাবে প্রতিটি বস্তুকে লেনদেনের মধ্যে আলাদাভাবে স্থানান্তর করতে।


4

আপনি যখন আপনার সমস্ত ডোমেন অবজেক্টগুলিকে EAGERly লোড যুক্ত করেন তখন ডিটিও একটি প্রয়োজনীয়তা হয়ে ওঠে না TI

আপনি যদি ডিটিও না করেন তবে আপনার ব্যবসায় স্তর থেকে আপনার ক্লায়েন্ট / ওয়েব স্তরে অপ্রয়োজনীয় স্থানান্তরিত অবজেক্ট থাকবে।

এই ক্ষেত্রে ওভারহেড সীমাবদ্ধ করতে বরং ডিটিও স্থানান্তর করুন।


1

প্রশ্নটি "কেন" নয়, " কখন " হওয়া উচিত।

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

আপনার সত্যিকারের ডোমেন ক্লাসের বিভিন্ন উপস্থাপনের প্রয়োজন হলে এটি বিন্যাস-বিরোধী নয় not - আরও সমতল, আরও ধনী, আরও সংকীর্ণ, ...

ব্যক্তিগতভাবে আমি ডোমেন ক্লাস দিয়ে শুরু করি এবং এটি সঠিক জায়গায় সঠিক চেক সহ পাসে পাস করি। আমি জেএসএন বা এক্সএমএলের মতো সিরিয়ালাইজেশন ফর্ম্যাটে ম্যাপিংগুলি তৈরি করতে, ডেটাবেসগুলিতে, কিছু "সহায়ক" ক্লাস টিকিয়ে দিতে এবং / বা যুক্ত করতে পারি ... যদি আমার প্রয়োজন বোধ হয় তবে আমি সর্বদা একটি শ্রেণিতে দুটি বিভক্ত করতে পারি।

এটি আপনার দৃষ্টিকোণের বিষয়ে - আমি একে অপরের থেকে তৈরি একাধিক অবজেক্টের পরিবর্তে একটি ডোমেন অবজেক্টকে একক অবজেক্ট হিসাবে বিভিন্ন ভূমিকা পালন করতে পছন্দ করি। যদি কোনও বস্তুর একমাত্র ভূমিকা ডেটা পরিবহন করা হয় তবে তা ডিটিও।


1

আমি মনে করি লোকেরা বোঝায় এটি ডিটিও হিসাবে সমস্ত দূরবর্তী বস্তু প্রয়োগ করলে এটি একটি অ্যান্টি-প্যাটার্ন হতে পারে। একটি ডিটিও হ'ল কেবল বৈশিষ্ট্যের একটি সেট এবং আপনার যদি বড় অবজেক্ট থাকে তবে আপনার প্রয়োজন বা ব্যবহার না করা সত্ত্বেও আপনি সমস্ত বৈশিষ্ট্য স্থানান্তর করবেন would পরবর্তী ক্ষেত্রে প্রক্সি প্যাটার্ন ব্যবহার করা পছন্দ করুন।

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