বেশ কয়েকটি স্তর দিয়ে উদাহরণগুলি পাস করা কি খারাপ অভ্যাস?


60

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

সম্পাদনা: প্লেয়ারের উদাহরণটি সম্ভবত সেরা নয় কারণ আমি পরে ফাইলটি লোড করতে পারি, তবে অন্যান্য ক্ষেত্রে এটি কার্যকর হয় না।

উত্তর:


54

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

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

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


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

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

স্পষ্ট করার জন্য: আপনি লোকদের সরাসরি তাদের "ডেটা স্তর" থেকে UI অ্যাক্সেস করতে দেখেছেন (উদাহরণস্বরূপ, তালিকা বাক্সগুলি)? আমি মনে করি না যে আমি প্রোডাকশন কোডে এমন লঙ্ঘন করেছি ... বাহ ..
সাইমন হোয়াইটহেড

7
@ সিমোন হোয়াইটহেড পার্থক্য সম্পর্কে অস্পষ্ট লোকেরা একটি তালিকাবক্স এবং একটি অ্যারে নিয়েছিল এবং একটি ডিটিও হিসাবে লিস্টবক্স ব্যবহার করেছিল। এটি এমন এক মুহুর্ত যা আমাকে বুঝতে সাহায্য করেছিল যে আমি কতগুলি অদৃশ্য অনুমান করি যা অন্যদের কাছে স্বজ্ঞাত নয়।
অব্নার শাহর-কাশতান

1
@ সিমনওহাইটহেড - হ্যাঁ, খুব আগেই আমি দেখেছি ভিবি 6 এবং ভিবি.এনইট ফ্রেমওয়ার্ক 1.1 এবং 2.0 প্রোগ্রামগুলিতে এবং এই জাতীয় দানব বজায় রাখার দায়িত্ব দেওয়া হয়েছে। এটি খুব কুৎসিত হয়, খুব দ্রুত।
jfrankcarr

15

আকর্ষণীয় যে এখনও অপরিবর্তনীয় বস্তু সম্পর্কে কেউ কথা বলেনি । আমি যুক্তি দিয়ে বলব যে প্রতিটি স্তরের জন্য প্রচুর স্বল্প জীবন্ত বস্তু তৈরির পরিবর্তে সমস্ত বিভিন্ন স্তরকে অবিচ্ছিন্ন অবজেক্টটি অতিক্রম করা আসলে একটি ভাল জিনিস।

এরিক লিপার্টের তার ব্লগে অপরিবর্তনীয়তার বিষয়ে দুর্দান্ত কিছু আলোচনা রয়েছে

অন্যদিকে আমি যুক্তি দেব যে স্তরগুলির মধ্যে পারস্পরিক পরিবর্তনযোগ্য জিনিসগুলি পাস করা খারাপ নকশা। আপনি মূলত এই প্রতিশ্রুতি দিয়ে একটি স্তর তৈরি করছেন যে আশেপাশের স্তরগুলি আপনার কোড ভঙ্গ করার পথে এটি কোনও পরিবর্তন করবে না।


13

চারপাশে অবজেক্টের দৃষ্টান্তগুলি পাস করা একটি সাধারণ কাজ। এটি রাষ্ট্রের (যেমন উদাহরণের ভেরিয়েবলগুলি) রাখার প্রয়োজনীয়তা হ্রাস করে এবং কোডটিকে তার প্রয়োগের প্রসঙ্গ থেকে decouples করে।

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


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

8

নাবালিকা হতে পারে, তবে পরে কোনও স্তরে এই রেফারেন্সটি নির্ধারণের ঝুঁকি রয়েছে পরে কোনও ঝুঁকির রেফারেন্স বা মেমরি ফাঁস হওয়ার কারণ ..


আপনার বক্তব্যটি সঠিক, তবে ওপি'র পরিভাষা ("অবজেক্ট অবজেক্টগুলি") থেকে আমার ধারণা রয়েছে যে হয় সে মানগুলি (পয়েন্টার নয়) পার করছে বা তিনি কোনও আবর্জনা-সংগৃহীত পরিবেশ (জাভা, সি #, পাইথন, গো,) সম্পর্কে কথা বলছিলেন। ..)।
মোহাম্মদ দেহঘান

7

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


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

আমি মনে করি আমি উত্তরটি এখানে পেয়েছি: martinfowler.com/articles/inication.html
Puckl

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

4

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


3

দ্রুত উত্তর: নেই ভুল কিছুই বস্তুর দৃষ্টান্ত ক্ষণস্থায়ী হবে। যেমনটি উল্লেখ করা হয়েছে, পয়েন্ট হ'ল সমস্ত স্তরগুলিতে এই রেফারেন্সটি দেওয়া সম্ভাব্যভাবে একটি ঝুঁকির রেফারেন্স বা মেমরি ফুটোর কারণ হতে পারে।

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


3

আমি মূলত একটি ওয়েব ইউআই দেব কিন্তু এটি আমার কাছে মনে হয় আপনার স্বজ্ঞাত অস্বস্তি যেমন পাসের মাধ্যমে উদাহরণটি কম হবে এবং আপনি যে নিয়ামকের সাথে কিছুটা প্রসেসরিয়াল যাচ্ছেন সে সম্পর্কে আরও বেশি হতে পারে। আপনার নিয়ামক এই সমস্ত বিবরণ ঘাম করা উচিত? কেন এটি অডিও প্লে হওয়ার জন্য অন্য একেরও বেশি অবজেক্টের নাম উল্লেখ করে?

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

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

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


2

এটি সম্পূর্ণরূপে একটি সাধারণ নকশা যা শেষ হয়ে যায় যদিও আপনার অ্যাপ্লিকেশনটি সেই ধরণের বিষয়ে সংবেদনশীল থাকলে আপনার বিলম্বিত সমস্যা হতে পারে।


2

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


2

অন্যান্য উত্তরগুলি যেমন নির্দেশ করেছে, এটি অন্তর্নিহিত দরিদ্র নকশা নয়। এটি নেস্টেড ক্লাস এবং তাদের নীড়গুলির মধ্যে কষে সংযোগ তৈরি করতে পারে তবে রেফারেন্সগুলিকে বাসা বেঁধে যদি নকশাকে একটি মান সরবরাহ করে তবে মিলন looseিলে ফেলা বৈধ বিকল্প হতে পারে না।

একটি সম্ভাব্য সমাধান হ'ল নিয়ন্ত্রক শ্রেণীর নেস্টেড রেফারেন্সগুলিকে "সমতল" করা।

নেস্টেড অবজেক্টগুলির মাধ্যমে প্যারামিটারটি বেশ কয়েকবার পাস করার পরিবর্তে, আপনি নেস্টেড সমস্ত বস্তুর নিয়ামক শ্রেণীর রেফারেন্সগুলিতে বজায় রাখতে পারেন।

কীভাবে এটি বাস্তবায়ন করা হয় (বা এটি এমনকি বৈধ সমাধান হলেও) সিস্টেমের বর্তমান ডিজাইনের উপর নির্ভরশীল যেমন:

  • আপনি খুব জটিল না হয়ে নিয়ন্ত্রকের নেস্টেড অবজেক্টগুলির কোনও ধরণের মানচিত্র বজায় রাখতে সক্ষম?
  • আপনি যখন উপযুক্ত নেস্টেড অবজেক্টে প্যারামিটারটি পাস করেন, নেস্টেড অবজেক্ট তত্ক্ষণাত প্যারামিটারটি চিনতে পারে, বা নেস্টেড অবজেক্টগুলির মধ্য দিয়ে যাওয়ার সময় অতিরিক্ত কার্যকারিতা সংঘটিত হয়েছিল?
  • প্রভৃতি

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

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


0

আপনি যা বর্ণনা করছেন তা হ'ল চেইন অফ দায়িত্বশীলতার নকশার ধরণ called অ্যাপল তাদের ইভেন্ট হ্যান্ডলিং সিস্টেমের জন্য এই প্যাটার্নটি ব্যবহার করে, এটির জন্য মূল্য।

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