আমি সম্ভবত এটি কোনও কোড গন্ধ বা এমনকি কোনও এন্টি-প্যাটার্ন বিবেচনা করব যাতে একটি ক্লাস থাকে যা 23 ইন্টারফেস প্রয়োগ করে। যদি এটি সত্যিই একটি অ্যান্টি-প্যাটার্ন হয় তবে আপনি এটিকে কী বলবেন? বা এটি কেবল একক দায়িত্বের নীতি অনুসরণ করে না?
আমি সম্ভবত এটি কোনও কোড গন্ধ বা এমনকি কোনও এন্টি-প্যাটার্ন বিবেচনা করব যাতে একটি ক্লাস থাকে যা 23 ইন্টারফেস প্রয়োগ করে। যদি এটি সত্যিই একটি অ্যান্টি-প্যাটার্ন হয় তবে আপনি এটিকে কী বলবেন? বা এটি কেবল একক দায়িত্বের নীতি অনুসরণ করে না?
উত্তর:
রাজকীয় পরিবার: তারা বিশেষভাবে ক্রেজি কিছু করেন না তবে তাদের এক বিলিয়ন শিরোনাম রয়েছে এবং বেশিরভাগ অন্যান্য রোয়ালের সাথে এটি সম্পর্কিত related
somehow
আমি জমা দিচ্ছি যে এই অ্যান্টি-প্যাটার্নটির নাম জ্যাক অফ অল ট্রেড বা সম্ভবত অনেকগুলি টুপি রাখা হোক।
যদি আমাকে এটির নাম দিতে হয় তবে আমার মনে হয় আমি এটিকে হাইড্রাকে ডাকব :
গ্রীক পৌরাণিক কাহিনী অনুসারে, লার্নিয়ান হাইড্রা (গ্রীক: Λερναία Ὕδρα) ছিলেন প্রাচীন নামহীন সর্পের মতো ছাথোনিক জন্তুর প্রাণী, সরীসৃপের বৈশিষ্ট্যযুক্ত (যার নামটি প্রকাশিত হয়েছিল) যেগুলি অনেকগুলি মাথা ধারণ করেছিলেন - কবিরা দানি-চিত্রকরদের চেয়ে বেশি মাথা উল্লেখ করেছিলেন পেইন্ট, এবং প্রতিটি মাথা কাটা জন্য এটি আরও দুটি বৃদ্ধি পেয়েছিল - এবং বিষাক্ত শ্বাস এতটা মারাত্মক এমনকি এমনকি তার ট্র্যাকগুলি মারাত্মক ছিল।
বিশেষ প্রাসঙ্গিকতার সত্যতা হল যে এটির কেবল অনেক মাথা থাকে না, তবে সেগুলি আরও বেশি করে বাড়তে থাকে এবং এর কারণে হত্যা করা অসম্ভব। এই ধরণের ডিজাইনের সাথে আমার অভিজ্ঞতা হয়েছে; বিকাশকারীরা স্ক্রিনে ফিট করার মতো অনেক বেশি না হওয়া পর্যন্ত কেবল এতে আরও বেশি সংখ্যক ইন্টারফেস জ্যাম করে রাখেন এবং ততক্ষণে এটি প্রোগ্রামের নকশা এবং অনুমানগুলিতে এত গভীরভাবে আবদ্ধ হয়ে যায় যে এটি ভাগ করা একটি হতাশ সম্ভাবনা (যদি আপনি চেষ্টা করেন তবে আপনি আসলে প্রায়শই ব্যবধানটি পূরণ করতে আরও ইন্টারফেসের প্রয়োজন হয় )।
একটি "হাইড্রা" এর কারণে আসন্ন আযাবের প্রথম লক্ষণটি হ'ল এক তাত্পর্যপূর্ণ পরীক্ষা-নিরীক্ষা ছাড়াই একটি ইন্টারফেসের ঘন ঘন castালাই এবং প্রায়শই এমন লক্ষ্য হিসাবে বোঝানো হয় যা এইভাবে বোঝায় না:
public void CreateWidget(IPartLocator locator, int widgetTypeId)
{
var partsNeeded = locator.GetPartsForWidget(widgetTypeId);
return ((IAssembler)locator).BuildWidget(partsNeeded);
}
এই কোডটি সম্পর্কে মজাদার কিছু আছে এমন প্রসঙ্গের বাইরে নিয়ে গেলে এটি স্পষ্ট হয় তবে এই ঘটনার সম্ভাবনা আরও বেশি "মাথা" বাড়ার সাথে সাথে কোনও বস্তু বৃদ্ধি পায়, কারণ বিকাশকারীরা স্বজ্ঞাতই জানেন যে তারা সর্বদা একই প্রাণীর সাথে ডিল করছে।
সৌভাগ্য আপনি যে কোনও 23 টি ইন্টারফেস প্রয়োগ করে এমন কোনও রক্ষণাবেক্ষণ করছেন। প্রক্রিয়াটিতে আপনার জামানত ক্ষতি হওয়ার সম্ভাবনা খুব কম নয় to
ঈশ্বর অবজেক্ট মনে আসে; একটি একক বস্তু যা সমস্ত কিছু করতে জানে। এটি দুটি প্রধান নকশা পদ্ধতির "সংহতি" প্রয়োজনীয়তার সাথে কম আনুগত্য থেকে আসে; যদি আপনার 23 টি ইন্টারফেসের সাথে কোনও অবজেক্ট থাকে, আপনার কাছে এমন একটি অবজেক্ট রয়েছে যা তার ব্যবহারকারীদের কাছে কীভাবে 23 টি আলাদা জিনিস হতে হবে তা জানে এবং সেই 23 টি পৃথক জিনিস সম্ভবত সিস্টেমের কোনও একক কাজ বা ক্ষেত্রের ক্ষেত্রের সাথে নয়।
সলিডে, যখন এই বস্তুর স্রষ্টা স্পষ্টতই ইন্টারফেস বিভাজন নীতি অনুসরণ করার চেষ্টা করেছেন, তারা পূর্বের নিয়ম লঙ্ঘন করেছে; একক দায়িত্বের নীতি এটি "সলিড" এর একটি কারণ রয়েছে; ডিজাইন সম্পর্কে চিন্তাভাবনা করার সময় এস সর্বদা প্রথম আসে এবং অন্যান্য সমস্ত বিধি অনুসরণ করে।
জিআরএসপি-তে এই জাতীয় শ্রেণির স্রষ্টা "হাই কোহশন" বিধিটিকে অবহেলা করেছেন; সলিডের বিপরীতে জিআরএসপি শিখিয়ে দেয় যে কোনও জিনিসের একটি একক দায়িত্ব থাকার দরকার নেই, তবে বেশিরভাগ ক্ষেত্রে তার দুটি বা তিনটি খুব ঘনিষ্ঠভাবে সম্পর্কিত দায়িত্ব থাকতে হবে।
23 কেবল একটি সংখ্যা! খুব সম্ভবত দৃশ্যে এটি অ্যালার্মের পক্ষে যথেষ্ট। তবে, যদি আমরা জিজ্ঞাসা করি, কোনও ট্যাগটি "অ্যান্টি-প্যাটার্ন" হিসাবে ডাকার আগে এটি সবচেয়ে বেশি পদ্ধতি / ইন্টারফেস কী? এটি 5 বা 10 বা 25? আপনি বুঝতে পেরেছেন যে সংখ্যাটি আসলেই কোনও উত্তর নয় কারণ যদি 10 ভাল হয় তবে 11 টিও হতে পারে - এবং এর পরে কোনও পূর্ণসংখ্যা হবে।
আসল প্রশ্নটি জটিলতা নিয়ে। এবং আমাদের উল্লেখ করা উচিত যে দীর্ঘায়িত কোড, পদ্ধতিগুলির সংখ্যা বা কোনও পদক্ষেপের দ্বারা শ্রেণীর বৃহত আকারটি আসলে জটিলতার সংজ্ঞা নয় । হ্যাঁ, একটি বৃহত্তর এবং বৃহত্তর কোড (পদ্ধতিগুলির বৃহত সংখ্যা) একটি নতুন শিক্ষানবিশকে পড়তে এবং বুঝতে অসুবিধা সৃষ্টি করে। এটি সম্ভাব্য বৈচিত্রময় কার্যকারিতা, বিপুল সংখ্যক ব্যতিক্রম এবং বিভিন্ন পরিস্থিতিতে বিভিন্ন বিবর্তিত অ্যালগরিদমও পরিচালনা করে। এর অর্থ এটি জটিল নয় - এটি হজম করা কেবল কঠিন।
অন্যদিকে, অপেক্ষাকৃত ছোট আকারের কোড যা একটি কয়েক ঘন্টার মধ্যে এবং বাইরে পড়ার আশা করতে পারে- এটি এখনও জটিল হতে পারে। কোডটি (অযৌক্তিকভাবে) জটিল বলে আমি মনে করি।
অবজেক্ট-ওরিয়েন্টেড ডিজাইনের জ্ঞানের প্রতিটি টুকরো এখানে "জটিল" সংজ্ঞায়িত করার জন্য রাখা যেতে পারে তবে "এতগুলি পদ্ধতি" যখন জটিলতার ইঙ্গিত দেয় তখন আমি এখানে তা সীমাবদ্ধ রাখি।
পারস্পরিক জ্ঞান (ওরফে কাপলিং) অনেক সময় যখন জিনিসগুলি ক্লাস হিসাবে লেখা হয়, আমরা সকলেই এটি "সুন্দর" অবজেক্ট ওরিয়েন্টেড কোড বলে মনে করি। তবে অন্যান্য শ্রেণি সম্পর্কে ধারণা অনুধাবন মূলত আসল প্রয়োজনীয় এনক্যাপসুলেশনকে ভেঙে দেয়। যখন আপনার কাছে এমন পদ্ধতি রয়েছে যা অ্যালগোরিদমের অভ্যন্তরীণ অবস্থা সম্পর্কে গভীর বিবরণ "ফাঁস করে" - এবং অ্যাপ্লিকেশনটি পরিবেশনকারী শ্রেণীর অভ্যন্তরীণ অবস্থা সম্পর্কে মূল ধারণা নিয়ে তৈরি করা হয়।
অনেকগুলি পুনরাবৃত্তি (ব্রেকিং) যখন এমন পদ্ধতিগুলিতে একই নাম রয়েছে তবে কাজগুলি বিপরীতমুখী করে - বা অনুরূপ কার্যকারিতা সহ নামগুলির সাথে বিরোধিতা করে। বিভিন্ন অ্যাপ্লিকেশনের জন্য কিছু সময় কোড কিছুটা আলাদা ইন্টারফেস সমর্থন করে olve
অনেকগুলি ভূমিকা যখন শ্রেণি পক্ষের ফাংশনগুলি যুক্ত করে রাখে এবং লোকেরা এটির মতো আরও বিস্তৃত রাখে কেবল তখনই জানতে হবে যে ক্লাসটি আসলেই এখন একটি দুটি শ্রেণি। আশ্চর্যজনকভাবে এগুলি সমস্ত আসল দিয়ে শুরু হয়এটি করার জন্য প্রয়োজনীয়তা এবং অন্য কোনও শ্রেণীর উপস্থিতি নেই। এটি বিবেচনা করুন, এখানে একটি শ্রেণি লেনদেন রয়েছে, যা লেনদেনের বিশদ জানায়। এখন পর্যন্ত দেখতে ভাল লাগছে, এখন কারও "লেনদেনের সময়" (ইউটিসি এবং লাইক এর মধ্যে) ফর্ম্যাট রূপান্তর প্রয়োজন, পরে লোকেরা লেনদেনকে বৈধ করার জন্য নির্দিষ্ট কিছু তারিখে নির্দিষ্ট কিছু আছে কিনা তা পরীক্ষা করার জন্য বিধি যুক্ত করে। - আমি পুরো গল্পটি লিখতে চাই না তবে শেষ পর্যন্ত, লেনদেনের ক্লাসটি এতে পুরো ক্যালেন্ডারটি তৈরি করে এবং তারপরে লোকেরা "কেবলমাত্র পাত্রে" অংশটি ব্যবহার শুরু করে! এটি খুব জটিল (কল্পনা করার জন্য) আমি কেন "লেনদেনের ক্লাস" এর কার্যকারিতা রাখতে ইনস্ট্যান্ট করব যা একটি "ক্যালেন্ডার" আমাকে সরবরাহ করবে!
(ইন) API এর ধারাবাহিকতা যখন আমি book_a_ticket () করি - আমি একটি টিকিট বুক করি! এটি কতটা চেক এবং প্রক্রিয়াগুলি ঘটায় তা নির্বিশেষে এটি খুব সাধারণ। সময় প্রবাহ যখন এটিকে প্রভাবিত করে তখন এটি জটিল হয়। সাধারণত কেউ "অনুসন্ধান" এবং সম্ভাব্য উপলভ্য / অনুপলব্ধ স্থিতির অনুমতি দেয়, তারপরে পিছনে-এন-কমানোর জন্য আপনি টিকিটের অভ্যন্তরে কিছু প্রসঙ্গ পয়েন্টার সংরক্ষণ করতে শুরু করেন এবং তারপরে টিকিট বুক করার জন্য উল্লেখ করুন । অনুসন্ধান কেবলমাত্র কার্যকারিতা নয় - এই জাতীয় "পার্শ্ব কার্যকারিতা" এর পরে জিনিসগুলি আরও খারাপ হয়ে যায়। প্রক্রিয়াতে বই_এ_টিকেট () এর অর্থ হ'ল বই_ত_ টিকেট ()! এবং এটি অভাবনীয় জটিল হতে পারে।
সম্ভবত এমন অনেকগুলি পরিস্থিতি রয়েছে যা আপনি খুব বিবর্তিত কোডে দেখতে পাবেন এবং আমি নিশ্চিত যে অনেক লোক দৃশ্যাবলী যুক্ত করতে পারে, যেখানে "এতগুলি পদ্ধতি" কেবল বুদ্ধি দেয় না বা যা আপনি অবশ্যই মনে করেন তা করেন না। এটি অ্যান্টি-প্যাটার্ন।
আমার ব্যক্তিগত অভিজ্ঞতা হ'ল যে প্রকল্পগুলি যখন যুক্তিসঙ্গতভাবে নীচে শুরু হয়, তখন অনেকগুলি জিনিস যার জন্য তাদের নিজস্ব-কর্মস্থলগুলিতে জেনুইন ক্লাস করা উচিত ছিল বা আরও খারাপ এখনও বিভিন্ন শ্রেণীর মধ্যে বিভক্ত থাকে এবং সংযোজন বৃদ্ধি পায়। প্রায়শই যা 10 টি শ্রেণীর জন্য প্রাপ্য ছিল, তবে কেবল 4 টি রয়েছে, সম্ভবত তাদের অনেকেরই বহু উদ্দেশ্যমূলক বিভ্রান্তি এবং বিপুল সংখ্যক পদ্ধতি রয়েছে। একে Gশ্বর এবং ড্রাগন বলুন, এটাই খারাপ।
তবে আপনি খুব বড় ক্লাস জুড়ে আসতে পারেন যা খুব সুন্দরভাবে সামঞ্জস্যপূর্ণ, তাদের 30 টি পদ্ধতি রয়েছে - এবং এখনও খুব পরিষ্কার LE তারা ভাল হতে পারে।
ক্লাসগুলির ঠিক সঠিক সংখ্যক ইন্টারফেস থাকতে হবে; বেশিও না, কমও না.
এই ইন্টারফেসগুলির সমস্তই সেই শ্রেণিতে একটি কার্যকর উদ্দেশ্য উপভোগ করে কিনা তা না দেখে "অনেক বেশি" বলা অসম্ভব। কোনও বস্তু একটি ইন্টারফেস প্রয়োগ করে তা ঘোষণার অর্থ হ'ল আপনি যদি ক্লাসটি সংকলন করার আশা করেন তবে আপনাকে তার পদ্ধতিগুলি প্রয়োগ করতে হবে। (আমি অনুমান করছি আপনি যে শ্রেণীর দিকে তাকিয়ে রয়েছেন।) আমি কেবলমাত্র সেই ক্ষেত্রেই ভাবতে পারি যেখানে কোনও ইন্টারফেস সেই মানদণ্ডগুলির সাথে মিলিত হয় না যেখানে বাহ্যিক: যখন কেউ এটি ব্যবহার করে না।
কিছু ভাষা জাভার extends
কীওয়ার্ডের মতো প্রক্রিয়া ব্যবহার করে ইন্টারফেসগুলিকে "উপশ্রেণীকৃত" করার অনুমতি দেয় এবং যে কেউ এটি লিখেছিল তা হয়তো এটি জানেন না। এটিও হতে পারে যে সমস্ত 23 যথেষ্ট পরিমাণে সুদূরপ্রসারী যে তাদের একত্রিত করার কোনও অর্থ হয় না।
এটি মনে হয় যেমন তাদের প্রতিটি সম্পত্তির জন্য "গেটর" / "সেটার" জুটি রয়েছে, যেমনটি একটি সাধারণ "শিম" এর জন্য সাধারণ এবং ইন্টারফেসে এই সমস্ত পদ্ধতি প্রচার করে। সুতরাং কিভাবে এটি " শিম " বলা সম্পর্কে । বা আরও রাবেলেসিয়ান "ফ্ল্যাটুলেন্স" সুপরিচিত পরে অনেকগুলি মটরশুটি প্রভাবিত করে।
জেনেরিক বস্তুটি বিভিন্ন পরিবেশে ব্যবহার করা হলে ইন্টারফেসের সংখ্যা প্রায়শই বৃদ্ধি পায়। সি # তে আইকোম্যাপারেবলের রূপগুলি, আইকোয়ালিটি কম্পিউটার এবং আইসিম্পারার আলাদা আলাদা সেটআপগুলিতে বাছাই করতে দেয়, যার ফলে আপনি জেনেরিক দৃ strongly়ভাবে টাইপিত সংস্করণগুলি অ-জেনেরিক সংস্করণগুলিও প্রয়োগ করতে পারেন, সেগুলির কয়েকটি সম্ভবত একাধিকবার প্রয়োগ করতে পারেন them , অতিরিক্ত হিসাবে আপনি জেনেরিকগুলির একটিরও বেশি প্রয়োগ করতে পারেন।
আসুন একটি উদাহরণের দৃশ্যে নেওয়া যাক, এমন একটি ওয়েবশপ বলি যেখানে আপনি ক্রেডিট কিনতে পারেন যার সাহায্যে আপনি অন্য কিছু কিনতে পারেন (স্টক ফটো সাইটগুলি প্রায়শই এই স্কিমটি ব্যবহার করে)। আপনার কাছে একটি ক্লাস "ভালুটা" এবং একটি শ্রেণি "ক্রেডিট" থাকতে পারে যা উত্তরাধিকার সূত্রে একই ভিত্তি তৈরি করে। ভালুতে কিছু নিফটি অপারেটর ওভারলোড এবং তুলনার রুটিন রয়েছে যা আপনাকে "মুদ্রা" সম্পত্তি (উদাহরণস্বরূপ ডলারে পাউন্ড যুক্ত করে) চিন্তা না করে গণনা করতে দেয়। ক্রেডিটগুলি বরাদ্দ সহজ কিন্তু কিছু অন্যান্য স্বতন্ত্র আচরণ আছে। একে অপরের সাথে এগুলি তুলনা করতে সক্ষম হতে চাইলে আপনি আইকাম্পারেবল পাশাপাশি আইকোম্পারেবল এবং উভয়টির তুলনা ইন্টারফেসের অন্যান্য রূপগুলি বাস্তবায়ন করতে পারেন (যদিও তারা বেস শ্রেণিতে বা অন্য কোথাও একটি সাধারণ প্রয়োগ ব্যবহার করেন)।
সিরিয়ালাইজেশন প্রয়োগ করার সময়, ইশেরিয়াইজেবল, আইডিসিরিয়ালাইজেশন ক্যালব্যাক বাস্তবায়িত হয়। তারপরে পূর্বাবস্থায় ফিরিয়ে আনুন স্ট্যাকগুলি: আইসিএলনেবল যুক্ত করা হয়। আইসডার্টি কার্যকারিতা: আইওজার্ভেবল, আইএনটিফাইপ্রোপার্টিচেনজড। ব্যবহারকারীদের স্ট্রিংগুলি ব্যবহার করে মানগুলি সম্পাদনা করার মঞ্জুরি দেওয়া হচ্ছে: আইকনভারটেটেবল ... তালিকাটি আরও চলতে পারে ...
আধুনিক ভাষায় আমরা একটি ভিন্ন প্রবণতা দেখি যা মূল দিকগুলির বাইরে এই দিকগুলি পৃথক করতে এবং তাদের নিজস্ব শ্রেণিতে স্থাপন করতে সহায়তা করে। তারপরে বাইরের শ্রেণি বা দিকটি টীকাগুলি (গুণাবলী) ব্যবহার করে লক্ষ্য শ্রেণীর সাথে যুক্ত হয়। প্রায়শই বাইরের দিকের ক্লাসগুলি কম বেশি জেনেরিক করা সম্ভব হয় is
গুণাবলীর ব্যবহার (টিকা) প্রতিবিম্বের বিষয়। একটি অপূর্ণতা গৌণ (প্রাথমিক) কর্মক্ষমতা হ্রাস। একটি (প্রায়শই সংবেদনশীল) হ্রাসটি হ'ল এনক্যাপসুলেশনের মতো নীতিগুলি শিথিল করা দরকার।
অন্যান্য সমাধানগুলি সর্বদা থাকে তবে প্রতিটি নিফটির সমাধানের জন্য ট্রেড অফ বা ক্যাচ থাকে। উদাহরণস্বরূপ, একটি ওআরএম সমাধান ব্যবহার করে সমস্ত বৈশিষ্ট্যকে ভার্চুয়াল হিসাবে ঘোষণার দাবি করতে পারে। সিরিয়ালাইজেশন সমাধানগুলি আপনার ক্লাসে ডিফল্ট নির্মাতাদের দাবি করতে পারে। আপনি যদি নির্ভরতা ইঞ্জেকশনটি ব্যবহার করেন তবে আপনি একক শ্রেণিতে 23 টি ইন্টারফেস প্রয়োগ করতে পারেন।
আমার দৃষ্টিতে, 23 টি ইন্টারফেস সংজ্ঞা অনুসারে খারাপ হতে হবে না। এর পিছনে একটি সুচিন্তিত পরিকল্পনা থাকতে পারে, বা কিছু নীতি নির্ধারণ যেমন প্রতিচ্ছবি ব্যবহার বা চরম এনক্যাপসুলেশন বিশ্বাসকে এড়ানো avo
যখনই কোনও কাজ স্যুইচ করা, বা কোনও বিদ্যমান আর্কিটেকচার তৈরি করতে হবে। আমার পরামর্শটি হ'ল প্রথমে সম্পূর্ণ পরিচিত হয়ে উঠুন, খুব দ্রুত সবকিছুকে চুল্লি করার চেষ্টা করবেন না। আসল বিকাশকারীটির কথা শুনুন (যদি তিনি এখনও সেখানে থাকেন) এবং আপনি যা দেখছেন তার পিছনে চিন্তাভাবনা এবং ধারণাগুলি বের করার চেষ্টা করুন। প্রশ্ন জিজ্ঞাসা করার সময়, এটি ভেঙে দেওয়ার উদ্দেশ্যে নয়, তবে শিখতে ... হ্যাঁ, প্রত্যেকের নিজস্ব স্বর্ণের হাতুড়ি রয়েছে, তবে যত বেশি হাতুড়ি আপনি সংগ্রহ করতে পারবেন তত সহজেই সহকর্মীদের সাথে আপনি পাবেন।
"অনেকগুলি" বিষয়গত: প্রোগ্রামিং শৈলী? কর্মক্ষমতা? মান অনুসারে? প্রিসিডেন্ট? আরাম / আত্মবিশ্বাসের কি সরল?
এতক্ষণ আপনার কোডটি সঠিক আচরণ করে এবং কোনও রক্ষণাবেক্ষণের সমস্যা না উপস্থাপন করে, 23 এমনকি এটি নতুন আদর্শ হতে পারে। কোনও দিন আমি তখন বলতে পারি, "আপনি 23 টি ইন্টারফেস দিয়ে একটি দুর্দান্ত কাজ করতে পারেন, দেখুন: জোনাস এলফস্ট্রাম"।
আমি বলব যে সীমাটি 23 এর চেয়ে কম সংখ্যক হওয়া উচিত - আরও 5 বা 7 এর মতো,
তবে এই ইন্টারফেসগুলির কোনও অংশ বা বেস শ্রেণীর দ্বারা প্রয়োগ করা কোনও ইন্টারফেস অন্তর্ভুক্ত নয়।
(সুতরাং সামগ্রিকভাবে, এন + যে কোনও সংখ্যক উত্তরাধিকারসূত্রে ইন্টারফেস রয়েছে, যেখানে এন <= 7.)
যদি আপনার শ্রেণি অনেক বেশি ইন্টারফেস প্রয়োগ করে তবে এটি সম্ভবত godশ্বর-শ্রেণি ।