বিমূর্ত শ্রেণিতে কোন কোড অন্তর্ভুক্ত করা উচিত?


10

আমি বিমূর্ত ক্লাস ব্যবহার সম্পর্কে ইদানীং সমস্যায় পড়েছি।

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

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

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

কোডটি যে বিমূর্ত শ্রেণীর জন্য নিজেই কোনও অর্থহীন নাও হতে পারে কেবল কারণ এটি উদ্ভূত শ্রেণীর জন্য সাধারণ বলে মনে হয়?

আমি একটি উদাহরণ দিতে পারি: বিমূর্ত শ্রেণির A এর একটি পদ্ধতি a () এবং একটি বিমূর্ত পদ্ধতি aq () রয়েছে। পদ্ধতি aq (), উভয় ডিগ্রি ডিগ্রি এ বি এবং এসি-তে, একটি পদ্ধতি খ () ব্যবহার করে। খ () এ এ স্থানান্তরিত করা উচিত? যদি হ্যাঁ, তবে যদি কেউ কেবল এ এর ​​দিকে চেয়ে থাকে (আসুন ভেবে দেখি এবি এবং এসি নেই), খ () এর অস্তিত্ব কোনও তাত্পর্যপূর্ণ নয়! এটা কি একটা খারাপ জিনিস? কেউ কি বিমূর্ত ক্লাসে নজর রাখতে পেরেছেন এবং উত্পন্ন ক্লাসগুলি না দেখে কী চলছে তা বুঝতে সক্ষম হওয়া উচিত?

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

আপনার কী ধারণা / অনুশীলন?


7
কেন সেখানে "নিয়ম" থাকতে হবে?
রবার্ট হার্ভে

1
Writing an abstract class that makes sense without having to look in the derived classes is a matter of clean code and clean architecture.- কেন? এটি কি সম্ভব নয় যে, কোনও অ্যাপ্লিকেশন ডিজাইনিং এবং বিকাশকালে, আমি আবিষ্কার করেছি যে বেশ কয়েকটি ক্লাসের সাধারণ কার্যকারিতা রয়েছে যা প্রাকৃতিকভাবে একটি বিমূর্ত শ্রেণিতে সংশোধন করা যায়? উদ্ভূত শ্রেণীর জন্য কোনও কোড লেখার আগে আমি কি সর্বদা এটি অনুমান করার পক্ষে যথেষ্ট স্পষ্টবাদী হতে হবে? যদি আমি এই চমকপ্রদ হতে ব্যর্থ হই, তবে আমি কি এই জাতীয় রিফ্যাক্টরিং করা থেকে বারণ করছি? আমি কি আমার কোড টস আউট এবং আবার শুরু করতে হবে?
রবার্ট হার্ভে

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

@ রবার্টহারভে জনসাধারণের বেস ক্লাসের জন্য, উত্পন্ন ক্লাসগুলি দেখা থেকে নিষেধ করা হবে। অভ্যন্তরীণ শ্রেণীর জন্য, এটি কোনও পার্থক্য করে না।
ফ্রাঙ্ক হিলেমান

উত্তর:


4

আমি একটি উদাহরণ দিতে পারি: বিমূর্ত শ্রেণির A এর একটি পদ্ধতি a () এবং একটি বিমূর্ত পদ্ধতি aq () রয়েছে। পদ্ধতি aq (), উভয় ডিগ্রি ডিগ্রি এ বি এবং এসি-তে, একটি পদ্ধতি খ () ব্যবহার করে। খ () এ এ স্থানান্তরিত করা উচিত? যদি হ্যাঁ, তবে যদি কেউ কেবল এ এর ​​দিকে চেয়ে থাকে (আসুন ভেবে দেখি এবি এবং এসি নেই), খ () এর অস্তিত্ব কোনও তাত্পর্যপূর্ণ নয়! এটা কি একটা খারাপ জিনিস? কেউ কি বিমূর্ত ক্লাসে নজর রাখতে পেরেছেন এবং উত্পন্ন ক্লাসগুলি না দেখে কী চলছে তা বুঝতে সক্ষম হওয়া উচিত?

আপনার জিজ্ঞাসাটি কোথায় রাখবেন b()এবং অন্য কোনও অর্থে একটি প্রশ্ন হ'ল এবং এর Aজন্য তাত্ক্ষণিক সুপার ক্লাস হিসাবে সেরা পছন্দ কিনা । ABAC

মনে হয় তিনটি পছন্দ আছে:

  1. b()উভয় ABএবং ছেড়ে দিনAC
  2. কোন মধ্যবর্তী শ্রেণী তৈরি ABAC-Parentথেকে উত্তরাধিকারী Aএবং যে প্রবর্তন b()করুন, এবং তারপর জন্য তাৎক্ষণিক সুপার শ্রেণী হিসেবে ব্যবহার করা হয় ABএবংAC
  3. করা b()মধ্যে A(বুদ্ধিমান কিনা আরেকটি ভবিষ্যৎ বর্গ না ADচান b()বা না হোক)

  1. DRY না হয়ে ভোগেন ।
  2. YAGNI দ্বারা ভুগছেন ।
  3. সুতরাং, যে এই এক ছেড়ে।

অন্য শ্রেণি ADযা b()নিজেকে উপস্থাপন করতে চায় না, ততক্ষণ (3) সঠিক পছন্দ বলে মনে হয়।

ADউপহার হিসাবে যেমন সময়ে , তারপরে আমরা (2) এ পদ্ধতির রিফ্যাক্টর করতে পারি - সর্বোপরি এটি সফ্টওয়্যার!


7
একটি চতুর্থ বিকল্প আছে। করা উচিত b()কোন ক্লাসে। এটিকে একটি ফ্রি ফাংশন করুন যা এর সমস্ত ডেটা আর্গুমেন্ট হিসাবে গ্রহণ করে এবং উভয়ই রাখে ABএবং ACকল করে call এর অর্থ এটি যখন আপনি যুক্ত করবেন তখন আপনাকে এটিকে স্থানান্তর করতে বা কোনও ক্লাস তৈরি করার দরকার নেই AD
ব্যবহারকারী 1118321

1
@ ব্যবহারকারী 1118321, দুর্দান্ত, বাক্সের বাইরে সুন্দর চিন্তাভাবনা। b()কোনও দৃষ্টিকোণ-দীর্ঘকালীন রাষ্ট্রের প্রয়োজন না হলে বিশেষ জ্ঞান তৈরি করে ।
এরিক tদ

আমাকে (3) কীসের মধ্যে ঝামেলা করছে তা হ'ল বিমূর্ত শ্রেণি আর কোনও স্ব-ধারণামূলক আচরণের অংশটিকে বর্ণনা করে না। এটি কোডের বিটস এবং টুকরা এবং আমি এবং এটি এবং সমস্ত উত্পন্ন ক্লাসের মধ্যে পিছনে পিছনে না গিয়ে বিমূর্ত ক্লাস কোডটি বুঝতে পারি না।
আলেকজান্দ্রোস গৌগৌসিস

আপনি কি এমন বেস / ডিফল্ট তৈরি করতে পারেন যা বিমূর্ত হওয়ার পরিবর্তে acকল bকরে ac?
এরিক tদ

3
আমার কাছে, সবচেয়ে গুরুত্বপূর্ণ প্রশ্নটি হল, কেন AB এবং AC উভয়ই একই পদ্ধতি খ () ব্যবহার করে use যদি এটি কেবল কাকতালীয় হয় তবে আমি এবি এবং এসিতে দুটি অনুরূপ বাস্তবায়ন রেখে যাব। তবে সম্ভবত এটি কারণ এ বি এবং এসির জন্য কিছু সাধারণ বিমূর্ততা রয়েছে। আমার কাছে, ডিআরওয়াই নিজের মধ্যে তেমন একটি মূল্য নয়, তবে আপনাকে একটি ইঙ্গিত দেয় যে আপনি সম্ভবত কিছু দরকারী বিমূর্ততা মিস করেছেন।
রাল্ফ ক্লেবারহফ

2

একটি বিমূর্ত শ্রেণি বোঝানো হয় না যে বিবিধ ফাংশন বা ডেটা যা বিমূর্ত শ্রেণিতে নিক্ষেপ করা হয় এটি সুবিধাজনক কারণ ডাম্পিং গ্রাউন্ড।

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

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

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

তবে সবসময় পরিবর্তনের প্রশ্ন রয়েছে, কী পরিবর্তন হবে এবং কীভাবে এটি পরিবর্তন হবে এবং কেন এটি পরিবর্তন হবে change

উত্তরাধিকার সূত্রের ভঙ্গুর এবং ভঙ্গুর সংস্থাগুলির দিকে পরিচালিত করতে পারে ( উত্তরাধিকারও দেখুন: ইতিমধ্যে এটি ব্যবহার বন্ধ করুন! )।

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


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

@ অ্যালেক্সান্দ্রস গৌগৌসিস আমি ধরে নিচ্ছি না যে b()এটি একটি খাঁটি কাজ। এটি একটি ফান্টটোড বা একটি টেম্পলেট বা অন্য কিছু হতে পারে। খাঁটি ফাংশন, সিওএম অবজেক্ট, বা এটি যে কার্যকারিতার জন্য ব্যবহৃত হয় তা সমাধানের জন্য যা কিছু ব্যবহার করা হয় তার অর্থ হিসাবে আমি "লাইব্রেরি পদ্ধতি" শব্দটি ব্যবহার করছি।
রিচার্ড চেম্বারস

দুঃখিত, আমি পরিষ্কার না হলে! অনেক উদাহরণের মধ্যে একটি হিসাবে খাঁটি ফাংশনটি উল্লেখ করেছি (আপনি আরও দিয়েছেন)।
আলেকজান্দ্রোস গৌগুসিস

1

আপনার প্রশ্নটি একটি বা বিমূর্ত ক্লাসে যাওয়ার পদ্ধতির পরামর্শ দেয়। তবে আমি মনে করি আপনার এটিকে আপনার সরঞ্জামবক্সের অন্য একটি সরঞ্জাম হিসাবে বিবেচনা করা উচিত। এবং তারপরে প্রশ্নটি দাঁড়ায়: কোন কাজ / সমস্যাগুলি অ্যাবস্ট্রাক্ট ক্লাসগুলির জন্য সঠিক সরঞ্জাম?

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

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

আমি মনে করি যে আপনার প্রথম উদাহরণটি মূলত টেমপ্লেট পদ্ধতির প্যাটার্নের বিবরণ (আমি ভুল হলে আমাকে সংশোধন করি), সুতরাং আমি এটিকে বিমূর্ত শ্রেণির একদম বৈধ ব্যবহারের কেস হিসাবে বিবেচনা করব।

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

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

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

যদি s()সর্বজনীন ইন্টারফেসের অংশ হয় তবে এটি কিছুটা জটিল হয়ে ওঠে। এই ধারণার অধীনে s()যার কোনও সম্পর্ক নেই Bএবং এর Cসাথে সম্পর্কিত হচ্ছে A, আপনার s()ভিতরে প্রবেশ করা উচিত নয় A। তাহলে কোথায় রাখব? আমি পৃথক ইন্টারফেস ঘোষণার জন্য তর্ক করব I, যা সংজ্ঞায়িত করে s()। তারপর আবার, আপনি একটি পৃথক বর্গ যে বাস্তবায়নের জন্য যুক্তিবিজ্ঞান রয়েছে তৈরি করা উচিত s()এবং উভয় Bএবং Cএটা উপর নির্ভর করে।

সর্বশেষে, এখানে এসও সম্পর্কিত একটি আকর্ষণীয় প্রশ্নের উত্তরের উত্তরের একটি লিঙ্ক রয়েছে যা আপনাকে ইন্টারফেসের জন্য কখন এবং কখন কোনও বিমূর্ত শ্রেণীর জন্য যেতে হবে তা সিদ্ধান্ত নিতে সহায়তা করতে পারে:

একটি ভাল বিমূর্ত শ্রেণি কোডটির পরিমাণ কমিয়ে দেবে যা আবার লিখতে হবে কারণ এটির কার্যকারিতা বা রাষ্ট্র ভাগ করা যায়।


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

1

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

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

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

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


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

"বেস ক্লাসগুলিতে নিজেই অবতরণ ক্লাস সম্পর্কে কোনও জ্ঞান থাকা উচিত নয়।" এর সাথে আমি পুরোপুরি একমত। একটি পিতামাত্ত শ্রেণীর (বিমূর্ত বা না) ব্যবসায়ের যুক্তিগুলির একটি স্ব-অন্তর্ভুক্ত থাকা উচিত যা তা বোঝার জন্য শিশু শ্রেণীর প্রয়োগের তদন্তের প্রয়োজন নেই।
আলেকজান্দ্রোস গৌগুসিস

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

0

প্রথম প্রশ্ন, আপনার প্রশ্ন থেকে:

এই জাতীয় ক্ষেত্রে, একটি বিমূর্ত শ্রেণি একটি নীলনকের মতো কাজ করে, কার্যকারিতার উচ্চ স্তরের বিবরণ বা যা আপনি এটি কল করতে চান।

দ্বিতীয় মামলা:

অন্য কিছু সময় ... বিমূর্ত শ্রেণিটি সাধারণত এমন জায়গা হিসাবে ব্যবহৃত হয় যেখানে আপনি বর্তমান উত্পন্ন ক্লাসগুলিতে যে কোনও ধরণের প্রচলিত কোড রাখতে পারেন।

তারপরে, আপনার প্রশ্ন :

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

আইএমওতে আপনার দুটি ভিন্ন পরিস্থিতি রয়েছে, তাই কোন ডিজাইন প্রয়োগ করা উচিত তা সিদ্ধান্ত নেওয়ার জন্য আপনি একটি নিয়ম আঁকতে পারবেন না।

প্রথম কেসটির জন্য, আমাদের কাছে অন্যান্য উত্তরে ইতিমধ্যে উল্লিখিত টেম্পলেট পদ্ধতি প্যাটার্নের মতো জিনিস রয়েছে ।

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


-1

কিছুক্ষণ আগে আমার ঠিক একই প্রশ্ন ছিল!

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

abstract class AbstractProtocol
{
    /**
     * @return array Registration params to send
     */
    abstract protected function assembleRegistrationPart();

    /**
     * @return array Payment params to send
     */
    abstract protected function assemblePaymentPart();

    protected function doSend(array $data)
    {
        return
            (new HttpClient(
                [
                    'timeout' => 60,
                    'encoding' => 'utf-8',
                    'language' => 'en',
                ]
            ))
                ->send($data);
    }

    protected function log(array $data)
    {
        $header = 'Here is a request to external system!';
        $body = implode(', ', $this->maskData($data));
        Logger::log($header . '. \n ' . $body);
    }
}

class ClassicProtocol extends AbstractProtocol
{
    public function send()
    {
        $registration = $this->assembleRegistrationPart();
        $payment = $this->assemblePaymentPart();
        $specificParams = $this->assembleClassicSpecificPart();

        $dataToSend =
            array_merge(
                $registration, $payment, $specificParams
            );

        $this->log($dataToSend);

        $this->doSend($dataToSend);
    }

    protected function assembleRegistrationPart()
    {
        return ['hello' => 'there'];
    }

    protected function assemblePaymentPart()
    {
        return ['pay' => 'yes'];
    }
}

এই জাতীয় কোড নির্দেশ করে যে আমি কেবল উত্তরাধিকারের অপব্যবহার করি। এভাবেই এটি রিফ্যাক্টর করা যায়:

class ClassicProtocol
{
    private $request;
    private $logger;

    public function __construct(Request $request, Logger $logger, Client $client)
    {
        $this->request = $request;
        $this->client = $client;
        $this->logger = $logger;
    }

    public function send()
    {
        $this->logger->log($this->request->getData());
        $this->client->send($this->request->getData());
    }
}

$protocol =
    new ClassicProtocol(
        new PaymentRequest(
            new RegistrationData(),
            new PaymentData(),
            new ClassicSpecificData()
        ),
        new ClassicLogger(),
        new ClassicClient()
    );

class RegistrationData
{
    public function getData()
    {
        return ['hello' => 'there'];
    }
}

class PaymentData
{
    public function getData()
    {
        return ['pay' => 'yes'];
    }
}

class ClassicLogger
{
    public function log(array $data)
    {
        $header = 'Here is a request to external system!';
        $body = implode(', ', $this->maskData($data));
        Logger::log($header . '. \n ' . $body);
    }
}
class ClassicClient
{
    private $properties;

    public function __construct()
    {
        $this->properties =
            [
                'timeout' => 60,
                'encoding' => 'utf-8',
                'language' => 'en',
            ];
    }
}

তার পর থেকে আমি উত্তরাধিকার হিসাবে খুব সাবধানে আচরণ করি কারণ আমি বহুবার আহত হয়েছি।

সেই থেকে আমি উত্তরাধিকার সম্পর্কে অন্য সিদ্ধান্তে পৌঁছেছি। আমি অভ্যন্তরীণ কাঠামোর ভিত্তিতে উত্তরাধিকারের বিরুদ্ধে দৃ strongly ়ভাবে । এটি encapsulation ভাঙা, এটি ভঙ্গুর, এটি সর্বোপরি প্রক্রিয়াগত। এবং যখন আমি আমার ডোমেনটি সঠিকভাবে পচন করি , উত্তরাধিকার কেবল খুব প্রায়ই ঘটে না।


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