নির্ভরতা ইনজেকশন সহ ইউআইতে পাগল পরিমাণ ইন্টারফেস কীভাবে এড়ানো যায়?


8

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

কোনও ইউআই প্যারেন্টের নির্ভরতা যেখানে মূলত এটির সমস্ত শিশুদের একত্রিত হয়, সুতরাং একটি ইউআই উপাদান যত বেশি স্তরক্রম হয়, তত বেশি প্রস্ফুটিত হয় তার নির্মাতা।

ইউআই হায়ারার্কির শীর্ষে সমস্ত উপায় ছিল একটি অ্যাপ্লিকেশন ক্লাস, বর্তমান নির্বাচনের তথ্য এবং একটি 3 ডি মডেলের রেফারেন্স রয়েছে যা পরিবর্তনগুলি প্রতিফলিত করতে পারে। অ্যাপ্লিকেশন ক্লাসটি 8 টি ইন্টারফেস বাস্তবায়ন করছিল, এবং এটি কেবলমাত্র পণ্যগুলির (/ ইন্টারফেস) পঞ্চম অংশের চারদিকে ছিল!

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

প্রশ্ন
এই প্রকল্পের জন্য একটি সিঙ্গলটন সম্ভবত উপযুক্ত?
যদি তা না হয় তবে আমার চিন্তাভাবনা এবং / অথবা ডিআই এর বাস্তবায়নের কোনও মৌলিক ত্রুটি আছে যা এটিকে এত জটিল করে তুলেছে?

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

প্রায় সব ক্ষেত্রেই, ব্যবহারকারীর ইন্টারঅ্যাকশন বেশ কয়েকটি ক্রিয়াকে ট্রিগার করে। উদাহরণস্বরূপ, যখন ব্যবহারকারী কোনও আইটেম নির্বাচন করেন

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

ডিআই কেবল ইন্টারফেস ব্যবহার করার জন্য নয়, এটি একক পরীক্ষার ক্ষেত্রের জন্য বিশেষত দরকারী যা কনক্রিশনগুলি সরিয়ে নেওয়ার ক্ষমতা ...
রবি ডি

1
এছাড়াও, আমি এখনও এমন একটি সমস্যা দেখতে পাই যেখানে একটি সিঙ্গলটনই পছন্দসই সমাধান। ক্যানোনিকাল উদাহরণটি লোকেদের সর্বদা লগ লেখক বলে মনে হয় তবে আপনি এখানে বিভিন্ন লগের (ত্রুটি, ডিবাগ ইত্যাদি) লিখতে চাইতে পারেন।
রবি ডি

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

ইন্টারফেস-কনক্রিটেশন বিন্যাসটি মশকরা ফ্রেমওয়ার্কের একটি বৈশিষ্ট্য। তারা কয়েক দশক ধরে ওও ভাষায়ও রয়েছে ...
রবি ডি

আমি আপনার বক্তব্য না।
আর স্মিটজ

উত্তর:


4

আমি মনে করি প্রশ্নটি একটি লক্ষণ, কোনও সমাধান নয়।

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

একটি সমস্যার সন্ধান একটি সমাধান; এটি এবং এটির ভুল বোঝাবুঝি সম্ভবত আপনার নকশাটিকে দূষিত করছে। আপনি ডিআই বনাম সিঙ্গলটন, বিভিন্ন ধারণা বা না সম্পর্কে এই এসও প্রশ্নটি পড়েছেন ? আমি পড়েছি যে কেবল একটি সিঙ্গলটন মোড়ানো যাতে ক্লায়েন্টকে সিঙ্গলটনের সাথে ডিল করতে হয় না। It.is.just.good.old.encapsulation। আমি মনে করি যে এটি স্পট।


একটি ইউআই উপাদান যত বেশি স্তরক্রম ছিল, তার নির্মাতা তত বেশি ফুলে উঠেছে।

প্রথমে ছোট বিটগুলি তৈরি করুন তারপরে তাদের যে জিনিসটির সাথে যুক্ত সেগুলি তাদের কনস্ট্রাক্টারে পাস করুন এবং সেই বৃহত্তর জিনিসটি পরবর্তী বড় জিনিসটির কনস্ট্রাক্টারে পাস করুন ...

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


অ্যাপ্লিকেশন ক্লাসটি 8 টি ইন্টারফেস বাস্তবায়ন করছিল, এবং এটি কেবলমাত্র পণ্যগুলির (/ ইন্টারফেস) পঞ্চম অংশের চারদিকে ছিল!

এটি প্রসারিত-সক্ষমতার অনুপস্থিতির মতো শোনাচ্ছে। মূল নকশাটি অনুপস্থিত এবং উপর থেকে সমস্ত কিছু ক্র্যাম করা হচ্ছে। আরও নিচে নির্মাণ, রচনা এবং উত্তরাধিকার চলছে।

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

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


... 3 ডি মডেল যা পরিবর্তনগুলি প্রতিফলিত করতে হবে।

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

দর্শনার্থীর ধরণ সম্পর্কে পড়ুন। এটি বিভিন্ন ধরণের বিমূর্তভাবে কার্যকরীতার পুরো অংশ রাখার ধারণা।


ডিজাইন এবং ডিআই

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


অ্যাপার্টমেন্ট শপিং ডোমেনকে মডেলিংয়ে ফোকাস করুন।

ডিজাইনের জন্য জেসিকা সিম্পসন পদ্ধতির এড়িয়ে চলুন : "এর অর্থ কী তা আমি পুরোপুরি জানি না, তবে আমি এটি চাই" "

নিম্নলিখিতটি কেবলমাত্র ভুল:

  • আমার ইন্টারফেস ব্যবহার করার কথা
  • আমার সিঙ্গেলটন ব্যবহার করার কথা নয়
  • আমার ডিআই দরকার (যাই হোক না কেন)
  • আমার উত্তরাধিকার নয়, রচনা ব্যবহার করার কথা
  • আমার উত্তরাধিকার এড়ানোর কথা
  • আমার নিদর্শনগুলি ব্যবহার করা দরকার

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

শুধু এক পয়েন্ট, এবং আমি এখানে একটি সাহায্যের রক্তচোষা হতে চেষ্টা করছি না, কিন্তু এটি ছিল এক ধরনের হতে হবে যে আপনি প্রকৃতপক্ষে অনুমিত হয় না সাধারণ ঐক্যমত্য (এবং এটি বৈধ কারণের উপর ভিত্তি করে করা হয়) মনে: মূল প্রশ্ন অংশ একটি সিঙ্গলটন ব্যবহার করুন। আপনি লিখেন "'আমি সিঙ্গলটন ব্যবহারের কথা বলছি না' ভুল" - কোন পরিস্থিতিতে এটি ব্যবহার করা উপযুক্ত হবে?
আর। স্মিটজ

আমি যা বলছি তা হ'ল "এটি নির্ভর করে।" প্রায়শই আমি দেখি ম্যাক্সিমামগুলি বেশ আক্ষরিক অর্থে নেওয়া হয়েছে।
রাডারবব

3

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

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

শ্রোতাদের রচনার শৃঙ্খলে উপরের দিকে না গিয়ে, সেই সমস্ত উইজেটগুলিতে শ্রোতার একটি সংকলন ইনজেক্ট করুন। সংগ্রহটি কোনও প্রকাশকে ইনজেক্ট করুন যাতে তারা সংগ্রহে প্রকাশ করতে পারে। শ্রোতাদের মধ্যে সংগ্রহটি ইনজেকশন করুন যাতে তারা নিজেরাই সংগ্রহে যোগ করতে পারেন। সংগ্রহটি কম্পোজিশনের শৃঙ্খলে সমস্ত বস্তু জুড়ে দেয়।


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

@ আর.শ্মিটজ: ওভারহেড কি ব্যাপার? আপনি কি ইউআই-কে সুগঠিত হয়েছিলেন এবং আপনি যে নকশাকে দোষী বলে বর্ণনা করেছিলেন তা কি ছিল?
রবার্ট হার্ভে

@ আর.শ্মিটজ আপনি কি "অনেক শ্রোতার উপর দিয়ে যাওয়ার" বিষয়ে বিস্তারিত বলতে পারেন? হয়তো সি # তে ডিআই-র সাথে আমার অভিজ্ঞতা কম, তবে এমন কিছু আমাকে বলে যা উপযুক্ত নকশার সাথে প্রয়োজনীয় নয় (কমপক্ষে কনস্ট্রাক্টারে)।
কাতানা 314

@ রবার্টহারভে কোনও কর্মক্ষমতা হারাবেন না, এটি কেবল পঠনযোগ্যতার জন্য।
আর স্মিটজ

@ কটানা ৩১৪ উদাহরণস্বরূপ, যখন কোনও আইটেম যুক্ত করা হয় তখন 3 ডি মডেলটি আপডেট করা দরকার এবং এটি কোনও পণ্য বিভাগের সাথে সম্পর্কিত নয়, তাই এটি অ্যাপ্লিকেশন শ্রেণিতে উল্লেখ করা হয়েছে, যা আইটেমগুলি যুক্ত / সরানো / পরিবর্তিত হচ্ছে শুনবে। শেষ পর্যন্ত যে প্রতিটি পণ্য বিভাগের জন্য প্রায় একই হবে। অন্যান্য ইউআই অংশগুলিও প্রতিক্রিয়া দেখায় (এবং শোনায়), তবে বার্তাটি শীর্ষে ভ্রমণ করতে হবে কারণ সেখানে 3 ডি মডেলের রেফারেন্স এবং আসল ডেটা (যা পরে আপডেটও করা হয়েছে)।
আর স্মিটজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.