আমি সম্প্রতি লোকদের শুনেছি যে ডেটা ট্রান্সফার অবজেক্টস (ডিটিও) একটি অ্যান্টি-প্যাটার্ন ।
কেন? বিকল্পগুলি কি?
আমি সম্প্রতি লোকদের শুনেছি যে ডেটা ট্রান্সফার অবজেক্টস (ডিটিও) একটি অ্যান্টি-প্যাটার্ন ।
কেন? বিকল্পগুলি কি?
উত্তর:
কিছু প্রকল্পে দু'বার সমস্ত ডেটা থাকে । একবার ডোমেন অবজেক্ট হিসাবে, এবং একবার ডেটা স্থানান্তর বস্তু হিসাবে।
এই সদৃশটির একটি বিশাল ব্যয় রয়েছে , তাই স্থাপত্যটির উপযুক্ত হওয়ার জন্য এই বিচ্ছেদ থেকে একটি বিশাল সুবিধা পাওয়া দরকার।
ডিটিওগুলি কোনও অ্যান্টি-প্যাটার্ন নয়। যখন আপনি তারের ওপারে কিছু ডেটা প্রেরণ করছেন (বলুন, একটি অ্যাজাক্স কলের ওয়েব পৃষ্ঠায়), আপনি নিশ্চিত হতে চান যে গন্তব্যটি কেবলমাত্র ডেটা পাঠিয়ে আপনি ব্যান্ডউইদথ সংরক্ষণ করেছেন con এছাড়াও, প্রায়শই উপস্থাপনা স্তরটির জন্য কোনও স্থানীয় ব্যবসায়িক সামগ্রীর চেয়ে কিছুটা আলাদা ফর্ম্যাটে ডেটা রাখা সুবিধাজনক।
আমি জানি এটি একটি জাভা-ভিত্তিক প্রশ্ন, তবে .NET ভাষায় বেনামে প্রকারভেদ, সিরিয়ালাইজেশন এবং লিনকিউ ডিটিওগুলিকে অন-ফ্লাই তৈরির অনুমতি দেয় যা সেগুলি ব্যবহারের সেটআপ এবং ওভারহেডকে হ্রাস করে।
EJB 3.0 এ ডিটিও একটি অ্যান্টিপ্যাটার্ন বলেছেন:
EJB 3.0 এর পূর্বে EJB স্পেসিফিকেশনে সত্তার মটরশুটিগুলির ভারী ওজন প্রকৃতির ফলে ডেটা স্থানান্তর অবজেক্টস (ডিটিও) এর মতো নকশার নিদর্শনগুলির ব্যবহার শুরু হয়েছিল। ডিটিওগুলি লাইটওয়েট অবজেক্টে পরিণত হয়েছিল (যা প্রথমে তাদের সত্তা মটরশুটি হওয়া উচিত) যা স্তরগুলি জুড়ে ডেটা প্রেরণের জন্য ব্যবহৃত হয়েছিল ... এখন ইজেবি 3.0 স্পেকটি সত্তা পুরানো জাভা অবজেক্ট (পোজো) এর মতো সত্তা বিনের মডেলটিকে তৈরি করে। এই নতুন পোজো মডেলটির সাথে আপনার আর প্রতিটি সত্তার জন্য বা সত্তা সংস্থার জন্য কোনও ডিটিও তৈরি করার প্রয়োজন হবে না ... আপনি যদি EJB 3.0.০ সত্ত্বা পাঠাতে চান তবে তাদের কেবল java.io.Sialiazable বাস্তবায়ন করুন
আমি মনে করি না ডিটিওগুলি প্রতি সেফ একটি অ্যান্টি-প্যাটার্ন, তবে ডিটিও ব্যবহারের সাথে যুক্ত রয়েছে অ্যান্টিপ্যাটার্ন। বিল ডুডনি একটি উদাহরণ হিসাবে ডিটিও বিস্ফোরণকে বোঝায়:
http://www.softwaresummit.com/2003/speakers/DudneyJ2EEAntiPatterns.pdf
এখানে ডিটিওর বেশ কয়েকটি গালিগালাজ উল্লেখ করা হয়েছে:
http://anirudhvyas.com/root/2008/04/19/abuses-of-dto-pattern-in-java-world/
স্তরগুলির মধ্যে ডেটা পাস করার উপায় হিসাবে তিন স্তরের সিস্টেমের (সাধারণত প্রযুক্তি হিসাবে EJB ব্যবহার করা) কারণেই তাদের উত্স। স্প্রিংয়ের মতো ফ্রেমওয়ার্কের উপর ভিত্তি করে বেশিরভাগ আধুনিক জাভা সিস্টেমগুলি POJO গুলি ডোমেন অবজেক্ট হিসাবে ব্যবহার করে (প্রায়শই জেপিএ ইত্যাদির সাহায্যে বর্ণিত হয় ...) একক স্তরে ... এখানে ডিটিও ব্যবহার অপ্রয়োজনীয়।
ওও পিউরিস্টরা বলবেন যে ডিটিও হ'ল অ্যান্টি-প্যাটার্ন কারণ প্রকৃত ডোমেন অবজেক্টের পরিবর্তে অবজেক্টগুলি ডাটা টেবিলের উপস্থাপনা হয়ে যায়।
কেউ কেউ সম্ভাব্য আপত্তিজনক কারণে ডিটিওকে একটি অ্যান্টি-প্যাটার্ন হিসাবে বিবেচনা করে। এগুলি প্রায়শই ব্যবহার করা হয় যখন সেগুলি হওয়ার / প্রয়োজন হবে না।
এই নিবন্ধটি অস্পষ্টভাবে কিছু আপত্তি বর্ণনা করে।
যদি আপনি কোনও বিতরণ ব্যবস্থা তৈরি করেন তবে ডিটিওগুলি অবশ্যই কোনও বিরোধী নিদর্শন নয়। সবাই সেই অর্থে বিকাশ করবে না, তবে আপনার যদি একটি (উদাহরণস্বরূপ) ওপেন সোশ্যাল অ্যাপ থাকে তবে সমস্ত জাভাস্ক্রিপ্ট থেকে বন্ধ রয়েছে।
এটি আপনার এপিআইতে প্রচুর ডেটা পোস্ট করবে। এরপরে এটি কিছু ধরণের অবজেক্টের, সাধারণত একটি ডিটিও / রিকোয়েস্ট অবজেক্টে ডিসেরায়ালাইজ করা হয়। এর পরে প্রবেশকারীর ডেটা কোনও মডেল অবজেক্টে রূপান্তরিত হওয়ার আগে সঠিক হয় তা নিশ্চিত করার জন্য এটি বৈধ করা যেতে পারে।
আমার মতে এটি এন্টি-প্যাটার্ন হিসাবে দেখা হচ্ছে কারণ এটির ভুল ব্যবহার রয়েছে। আপনি যদি বিতরণ ব্যবস্থা না তৈরি করেন তবে আপনার সেগুলির দরকার নেই এমন সম্ভাবনা রয়েছে।
একটি উদ্দেশ্য ডেটা স্থানান্তর অবজেক্ট বিভিন্ন সূত্র থেকে তথ্য সংরক্ষণ এবং তারপর এটি একটি ডাটাবেস মধ্যে স্থানান্তর (অথবা হয় রিমোট ছদ্মরূপ একবারে)।
তবে ডিটিও প্যাটার্ন একক দায়িত্বের নীতি লঙ্ঘন করে , যেহেতু ডিটিও কেবল ডেটা সঞ্চয় করে না, তবে এটি ডেটাবেস বা সম্মুখস্থ স্থানান্তর করে।
ব্যবসায়ের বস্তু থেকে ডেটা অবজেক্টগুলিকে আলাদা করার প্রয়োজন কোনও অ্যান্টিপ্যাটার্ন নয়, কারণ সম্ভবত এটি ডাটাবেস স্তর পৃথক করার প্রয়োজন is কোনওভাবেই ।
ডিটিওগুলির পরিবর্তে আপনার সমষ্টি এবং সংগ্রহস্থল প্যাটার্নগুলি ব্যবহার করা উচিত, যা বস্তুর সংগ্রহ ( সমষ্টি ) এবং ডেটা স্থানান্তরকে পৃথক করে ( সংগ্রহস্থল ) পৃথক করে।
একদল অবজেক্টের স্থানান্তর করতে আপনি এটি ব্যবহার করতে পারেন ইউনিট অফ ওয়ার্ক প্যাটার্নটি , এটিতে রিপোজিটরিগুলির একটি সেট এবং লেনদেনের প্রসঙ্গ রয়েছে; সামগ্রিকভাবে প্রতিটি বস্তুকে লেনদেনের মধ্যে আলাদাভাবে স্থানান্তর করতে।
আপনি যখন আপনার সমস্ত ডোমেন অবজেক্টগুলিকে EAGERly লোড যুক্ত করেন তখন ডিটিও একটি প্রয়োজনীয়তা হয়ে ওঠে না TI
আপনি যদি ডিটিও না করেন তবে আপনার ব্যবসায় স্তর থেকে আপনার ক্লায়েন্ট / ওয়েব স্তরে অপ্রয়োজনীয় স্থানান্তরিত অবজেক্ট থাকবে।
এই ক্ষেত্রে ওভারহেড সীমাবদ্ধ করতে বরং ডিটিও স্থানান্তর করুন।
প্রশ্নটি "কেন" নয়, " কখন " হওয়া উচিত।
অবশ্যই এটির বিরোধী-প্যাটার্ন যখন কেবল এটির ব্যবহারের ফলাফল উচ্চ ব্যয় হয় - রান-টাইম বা রক্ষণাবেক্ষণ। আমি ডেটাবেস সত্তা শ্রেণীর সাথে একই রকম কয়েকশো ডিটিও'র প্রকল্পগুলিতে কাজ করেছি। প্রতিবার যখন আপনি একটি একক ক্ষেত্র যুক্ত করতে চেয়েছিলেন তখন চারবারের মতো আইডি যুক্ত করতে - ডিটিওতে, সত্তায়, ডিটিও থেকে ডোমেন শ্রেণিতে বা সত্তায় রূপান্তর করতে, বিপরীত রূপান্তর, ... আপনি কিছু স্থান এবং ডেটা পেয়ে গেছেন অসঙ্গত।
আপনার সত্যিকারের ডোমেন ক্লাসের বিভিন্ন উপস্থাপনের প্রয়োজন হলে এটি বিন্যাস-বিরোধী নয় not - আরও সমতল, আরও ধনী, আরও সংকীর্ণ, ...
ব্যক্তিগতভাবে আমি ডোমেন ক্লাস দিয়ে শুরু করি এবং এটি সঠিক জায়গায় সঠিক চেক সহ পাসে পাস করি। আমি জেএসএন বা এক্সএমএলের মতো সিরিয়ালাইজেশন ফর্ম্যাটে ম্যাপিংগুলি তৈরি করতে, ডেটাবেসগুলিতে, কিছু "সহায়ক" ক্লাস টিকিয়ে দিতে এবং / বা যুক্ত করতে পারি ... যদি আমার প্রয়োজন বোধ হয় তবে আমি সর্বদা একটি শ্রেণিতে দুটি বিভক্ত করতে পারি।
এটি আপনার দৃষ্টিকোণের বিষয়ে - আমি একে অপরের থেকে তৈরি একাধিক অবজেক্টের পরিবর্তে একটি ডোমেন অবজেক্টকে একক অবজেক্ট হিসাবে বিভিন্ন ভূমিকা পালন করতে পছন্দ করি। যদি কোনও বস্তুর একমাত্র ভূমিকা ডেটা পরিবহন করা হয় তবে তা ডিটিও।
আমি মনে করি লোকেরা বোঝায় এটি ডিটিও হিসাবে সমস্ত দূরবর্তী বস্তু প্রয়োগ করলে এটি একটি অ্যান্টি-প্যাটার্ন হতে পারে। একটি ডিটিও হ'ল কেবল বৈশিষ্ট্যের একটি সেট এবং আপনার যদি বড় অবজেক্ট থাকে তবে আপনার প্রয়োজন বা ব্যবহার না করা সত্ত্বেও আপনি সমস্ত বৈশিষ্ট্য স্থানান্তর করবেন would পরবর্তী ক্ষেত্রে প্রক্সি প্যাটার্ন ব্যবহার করা পছন্দ করুন।