কেন ডেটা ক্লাসগুলি একটি কোড গন্ধ হিসাবে বিবেচিত হয়?


18

এই নিবন্ধটি দাবি করেছে যে একটি ডেটা শ্রেণি একটি "কোড গন্ধ"। কারন:

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

কেন কোনও বস্তুর কেবলমাত্র ডেটা থাকা ভুল? ক্লাসের মূল দায়িত্ব যদি ডেটা উপস্থাপন করা হয় তবে ডেটাগুলিতে পরিচালিত পদ্ধতিগুলি কী একক দায়িত্বের নীতিটি ভেঙে দেবে না ?


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

1
আমি মনে করি কিছু ডেটা শুধুমাত্র শ্রেণীর থাকার SE প্রতি একটি কোড গন্ধ নয়, কিন্তু যদি সবচেয়ে শ্রেণীর তারপর আমরা antipattern "রক্তহীন DOMAIN" বিষয়ে কথা হয় যে মত en.wikipedia.org/wiki/Anemic_domain_model
Tulains কর্ডোভা

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

আপনি এই উত্তরটি স্ট্যাকওভারফ্লোতে পড়তে চাইতে পারেন যা শীর্ষ ভোটের উত্তরের চেয়ে অনেক বেশি স্বতন্ত্র, যা সমৃদ্ধ ডোমেন মডেলের নিকৃষ্টতাকে পোষ্ট করে এবং এটি প্রমাণিত সত্যের মতো উপস্থাপন করে। stackoverflow.com/questions/23314330/...
McLovin

উত্তর:


31

খাঁটি ডেটা অবজেক্ট থাকাতে একেবারেই ভুল নেই। টুকরোটির লেখক বেশ স্পষ্টভাবে জানেন না যে তিনি কী সম্পর্কে কথা বলছেন।

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

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


1
খালি ডেটা অবজেক্টগুলি মডেলিং সম্পর্ক, বৈধতা, অ্যাক্সেস / পরিবর্তনগুলি নিয়ন্ত্রণ করার জন্য অমূল্য হতে পারে তা যুক্ত করতে চেয়েছিলেন।
অ্যাড্রিয়ান

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

7
যদি ফাংশনটি সেই ডেটা প্রকারের একটি আর্গুমেন্ট নেয় তবে এটি ইতিমধ্যে ডেটাটির সাথে মিলিত হয়েছে।
রিমকো গ্রিলিচ

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

3
বাস্তবতা আমাদের অনেক কিছু দেখিয়েছে। মতামত জানার জন্য -1-সমস্ত "অন্যরা ব্যর্থ হয়েছে" মতামত। এছাড়াও, লেখক বলেন না যে খাঁটি ডেটা অবজেক্টগুলি "ভুল", কেবলমাত্র তারা "কোড গন্ধ" এবং প্রশ্ন করার উপযুক্ত। আমি কেবল আফসোস করছি যে আমার দেশের জন্য একটি ডাউনভোট রয়েছে have :-)
user949300

7

খাঁটি ডেটা অবজেক্ট থাকাতে একেবারেই কোনও ভুল নেই। আমার জানা সফ্টওয়্যার বিকাশকারীদের দ্বারা লেখকের মতামত নেই।

বিশেষত ডাটাবেস ম্যাপিংয়ের জন্য আপনাকে সাধারণভাবে সত্তা শ্রেণি থাকে যা কেবলমাত্র ডেটা বেস এবং গেটার এবং সেটারগুলিতে সঞ্চিত ক্ষেত্রগুলিতে থাকে। উইকিপিডিয়া হাইবারনেট (কাঠামো)

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

ফজিৎ:
যদি কেউ দাবি করে যে কোনও কিছু 'খারাপ' বা 'কোড গন্ধ' রয়েছে তবে আপনার সর্বদা প্রদত্ত কারণগুলির সন্ধান করা উচিত। কারণগুলি যদি আপনি রাজি না হন তবে আরও ভাল কারণে বা ভিন্ন মতামত জন্য আপনি অন্য কাউকে জিজ্ঞাসা করুন। (যেমন আপনি এই ফোরামে করেছেন)


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

1
@ ব্যবহারকারী949300, আপনি বিভ্রান্ত বলে মনে হচ্ছে। লেখক যদি তাদের কোডের গন্ধ হিসাবে উল্লেখ করে তবে তিনি সেগুলিতে ইঙ্গিত করেছেন যে তাদের সাথে কিছু ভুল হতে পারে। যেহেতু এই দিনগুলিতে তারা খুব ভাল অনুশীলন হিসাবে ব্যাপকভাবে স্বীকৃত, তারা স্পষ্টত কোনও কোড গন্ধ নয়। এইভাবে MrSmith42 সঠিক: তাদের সাথে একেবারেই ভুল কিছু নেই।
ডেভিড আরনো

4

মার্টিন ফোলার কেন একটি ভাল যুক্তি:

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

https://martinfowler.com/bliki/TellDontAsk.html


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

2
@ ডেভিড আর্নো আপনি এনক্যাপসুলেশন এবং লুকানোর বিষয়টি ভুলে যাচ্ছেন। আপনি কোনও অবজেক্টকে সদস্য পদ্ধতিটি কার্যকর করতে বলুন এবং সদস্য পদ্ধতিটি অবজেক্টের ব্ল্যাক বাক্সে চলে যায় এবং উত্তর পেতে যা যা করা দরকার তা করে। আপনি যদি বাইরে থেকে কোনও বস্তু জিজ্ঞাসা করেন তবে আপনার এর ব্যক্তিগত অবস্থানে অ্যাক্সেস নেই, এবং সুতরাং হয় বস্তুটি বুদ্ধিমানের চেয়ে আরও বেশি রাজ্য উন্মোচন করে, বা জিজ্ঞাসককে প্রয়োজনের তুলনায় আরও হুপের মধ্য দিয়ে ঝাঁপিয়ে পড়তে হয়। আপনি কখনই OO পরিবেশে কোনও জিনিস "জিজ্ঞাসা" করতে চান তা আমি দেখতে পাচ্ছি না। (অন্যান্য প্রোগ্রামিং দৃষ্টান্তগুলি অবশ্যই বিভিন্ন পদ্ধতির জন্য কল করতে পারে))
মার্নেন লাইবো-কোসার ২

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

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

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

2

আপনার যা বোঝার দরকার তা হ'ল দুটি ধরণের অবজেক্ট রয়েছে:

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

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

    আমি লিখি বেশিরভাগ ক্লাস এই বিভাগে।

  • অবজেক্টস যা সত্যই কেবল ডেটা । এগুলি কেবল তাদের সমস্ত সদস্যকে সর্বজনীনভাবে ঘোষণা করা উচিত (বা তাদের জন্য অ্যাক্সেসরের সম্পূর্ণ সেট সরবরাহ করুন)।

    উদাহরণ একটি ক্লাস হবে Point2D। এই শ্রেণীর সদস্যদের জন্য নিশ্চিত হওয়া দরকার এমন কোনও আক্রমণকারী নেই এবং ব্যবহারকারীদের কেবলমাত্র myPoint.xএবং এর মাধ্যমে ডেটা অ্যাক্সেস করতে সক্ষম হওয়া উচিত myPoint.y

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

অবজেক্ট অরিয়েন্টেশনে দক্ষ হয়ে ওঠার মধ্যে এই পার্থক্যটি বিদ্যমান তা উপলব্ধি করা এবং এই দুটি বিভাগের একটিতে একটি শ্রেণির ফাংশনকে শ্রেণিবদ্ধ করা শেখা অন্তর্ভুক্ত।


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



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