ওওপি-তে ডকুমেন্টেশনের দ্বারা "প্রাপ্ত" কোনও গণনা সম্পাদন করে কিনা তা নির্দিষ্ট করে এড়ানো উচিত?


39

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

মায়ার বারবার এই বিষয়টি তুলে ধরেছেন যে ক্লাসগুলি তাদের বাস্তবায়ন সম্পর্কে যতটা সম্ভব তথ্য গোপন করা উচিত, যা বোঝা যায়। বিশেষত, তিনি বারবার যুক্তি দিয়েছিলেন যে বৈশিষ্ট্যগুলি (অর্থাত্ স্ট্যাটিক, ক্লাসের অ-গণিত বৈশিষ্ট্য) এবং রুটিনগুলি (ফাংশন / পদ্ধতি কলগুলির সাথে সম্পর্কিত শ্রেণীর বৈশিষ্ট্য) একে অপরের থেকে পৃথক হতে হবে।

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

শ্রেণীর সংক্ষিপ্ত রূপ হিসাবে পরিচিত শ্রেণীর জন্য স্ট্যান্ডার্ড ক্লায়েন্ট ডকুমেন্টেশন তৈরি করা হবে যাতে প্রদত্ত বৈশিষ্ট্যটি কোনও বৈশিষ্ট্য বা কোনও ফাংশন (যে ক্ষেত্রে এটি উভয় ক্ষেত্রে হতে পারে) তা প্রকাশ না করে।

উদাহরণস্বরূপ, তিনি দাবি করেন যে এমনকি ক্লাসের জন্য ডকুমেন্টেশনগুলি "গেটর" কোনও গণনা সম্পাদন করে কিনা তা নির্দিষ্ট করে এড়ানো উচিত।

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


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

আমি বইটি পড়িনি। মায়ার ডকুমেন্টেশনের যে স্টাইলের প্রস্তাব দেন তার কোনও উদাহরণ দেয়? আপনি যে কোনও ভাষার জন্য কী বর্ণনা করেছেন তা কল্পনা করা আমার পক্ষে কঠিন ।
ব্যবহারকারী16764

1
@ পেট্রিকক্লিনস আমি আপনাকে 'বিশেষ্য রাজ্যে মৃত্যুদন্ড কার্যকর' পড়ার পরামর্শ দিয়েছি এবং এখানে ক্রিয়াপদ এবং বিশেষ্যের ধারণাটি পেয়েছি। দ্বিতীয়ত
ওওপি গ্রাহক

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

1
@ পেট্রিকক্লিনস হ্যাঁ এটি: স্টিভ-yegge.blogspot.com/2006/03/… ! এটি কিছু চিন্তাভাবনা করার জন্য পয়েন্ট দেয়, অন্যটি হ'ল: আপনার সেটারগুলি ব্যবহার করে (আব) আপনার তথ্যকে ডেটা স্ট্রাকচারে পরিণত করা উচিত।
AndreasSchainert

উত্তর:


58

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

তবে আপনার ক্লাসটি ব্যবহার করে কোডারটি জেনে রাখার দরকার নেই আপনি প্রয়োগ করেছেন কিনা:

return currentAge;

বা:

return getCurrentYear() - yearBorn;

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

তবে এটি সর্বদা ক্ষেত্রে হয় না, উদাহরণস্বরূপ, ধরুন আপনার ধারকটিতে একটি আকার পদ্ধতি রয়েছে। এটি প্রয়োগ করা যেতে পারে:

return size;

অথবা

return end_pointer - start_pointer;

বা এটি হতে পারে:

count = 0
for(Node * node = firstNode; node; node = node->next)
{
    count++
}
return count

প্রথম দু'জনের মধ্যে পার্থক্যটির বিষয়টি আসলে বিবেচ্য নয়। তবে শেষেরটিতে গুরুতর পারফরম্যান্সের ক্ষুধা থাকতে পারে। এটা কেন STL, উদাহরণস্বরূপ, বলছেন যে এর .size()হয় O(1)। এটি আকার কীভাবে গণনা করা হয় ঠিক তা দলিল করে না, তবে এটি আমাকে কর্মক্ষমতা বৈশিষ্ট্য দেয়।

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


4
তদুপরি: ডকুমেন্টের সময় / স্পেস জটিলতা প্রথমে, তারপরে কোনও ক্রিয়াকলাপে কেন এই বৈশিষ্ট্য রয়েছে তার ব্যাখ্যা দিন give উদাহরণস্বরূপ:// O(n) Traverses the entire user list.
জন পূর্ব ২

2
= (পাইথনের যেমন lenব্যর্থতা তেমনি তুচ্ছ কিছু ... ... কমপক্ষে কিছু পরিস্থিতিতে এটি হ'ল O(n)আমরা যখন কলেজের একটি প্রকল্পে শিখেছিলাম যখন আমি প্রতিটি লুপের পুনরাবৃত্তি
পুনরায় গণনার

@ ইজকাটা, কৌতূহলী। আপনি কি কাঠামো ছিল মনে আছে O(n)?
উইনস্টন ইওয়ার্ট

পছন্দ করেছেন এটি 4+ বছর আগে একটি ডেটা মাইনিং প্রকল্পে ছিল এবং আমি কেবল আমার বন্ধুকে এটি একটি
হানচে

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

16

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

তবে, বেশিরভাগ আসল-বিশ্ব প্রোগ্রামগুলি জোয়েল স্পলস্কির " ফাঁসযুক্ত বিমূর্তির আইন" থেকে ভোগাচ্ছে , যা বলে

"কিছুটা তুচ্ছ তাত্পর্যপূর্ণ বিমূর্ততা কিছুটা ফাঁস হয়" "

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

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


+1, এবং তৈরি করা বেশিরভাগ ডকুমেন্টেশন হ'ল পরবর্তী প্রোগ্রামার আপনার প্রকল্প বজায় রাখার জন্য, পরবর্তী প্রোগ্রামার এটি ব্যবহার করার জন্য নয়।
jmoreno

12

প্রদত্ত কলটি ব্যয়বহুল কিনা তা আপনি লিখতে পারেন। ভাল, মত একটি নামকরণ কনভেনশন ব্যবহার getAgeদ্রুত অ্যাক্সেস এবং জন্য loadAgeবা fetchAgeব্যয়বহুল লুকআপ জন্য। পদ্ধতিটি কোনও আইও করছে কিনা আপনি অবশ্যই ব্যবহারকারীকে অবহিত করতে চান।

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


1
+1 উল্লেখ করার জন্য যে ডকুমেন্টেশনটি কোনও শ্রেণির চুক্তির তার ইন্টারফেসের মতোই অংশ।
বার্ট ভ্যান ইনজেন শেহেনো

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

9

আমি যদি ব্যক্তি অবজেক্টে ভরা একটি ডেটাবেস ডিজাইন করি, তবে পার্সন.এজ একটি ব্যয়বহুল কল কিনা তা জানা উচিত নয়?

হ্যাঁ.

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

যে কোনও ক্ষেত্রে, কোনও ক্রিয়াকলাপ বা বৈশিষ্ট্য কিনা তা অনুমান করার জন্য কোডটিতে নিজেই পর্যাপ্ত তথ্য থাকা উচিত, তাই ডকুমেন্টেশনে এটি বলার দরকার আমি সত্যিই দেখছি না।


4
+1: এই সম্মেলনটি বেশ কয়েকটি জায়গায় মূর্তিমান। আরও, ডকুমেন্টেশন ইন্টারফেস স্তরে করা উচিত - সেই সময়ে আপনি জানেন না কীভাবে ব্যক্তি। এজ প্রয়োগ করা হয়।
টেলাস্টিন

@ টেলাস্টিন: আমি এইভাবে ডকুমেন্টেশন সম্পর্কে কখনও ভাবিনি; এটি হ'ল এটি ইন্টারফেস স্তরে করা উচিত। এটা এখন সুস্পষ্ট বলে মনে হচ্ছে। সেই মূল্যবান মন্তব্যের জন্য +1।
স্টাকেক্স

আমি এই উত্তরটি অনেক পছন্দ করি। আপনি যে কর্মক্ষমতা বর্ণনা করছেন তার একটি নিখুঁত উদাহরণ প্রোগ্রামটি নিজেই উদ্বেগের বিষয় নয় যদি ব্যক্তি কোনও বিশ্রাম পরিষেবা থেকে পুনরুদ্ধারকৃত সত্তা হয়ে থাকে। জিইটি অন্তর্নিহিত তবে এটি সস্তা বা ব্যয়বহুল হবে কিনা তা স্পষ্ট নয়। অবশ্যই এটি OOP নয় তবে পয়েন্টটি একই।
maple_shaft

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

এই সম্মেলনটি কোথা থেকে এসেছে? জাভা চিন্তা করে আমি এটি অন্য উপায়ে আশা করব: getপদ্ধতিটি কোনও অ্যাট্রিবিউট অ্যাক্সেসের সমান এবং এত ব্যয়বহুল নয়
সাতফোর্স

3

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

সি ++ এবং জাভা-র মতো কোনও ভাষাতে আপনাকে অবশ্যই একটি বৈশিষ্ট্য এবং একটি পদ্ধতি কল অ্যাক্সেসের মধ্যে পার্থক্য করতে হবে। তার মাঝে পার্থক্য একটি বিশ্ব instance.getter_methodএবং instance.getter_method()। একটি আসলে আপনার মান পায় এবং অন্যটি পায় না।

স্মার্টটাক বা রুবি প্ররোচনার (আরও দেখা যায় যে এই বইটিতে ব্যবহৃত আইফেল ভাষা হ'ল) ​​একটি আরও খাঁটি OO ভাষার সাথে কাজ করার সময়, এটি পুরোপুরি বৈধ পরামর্শ হয়ে যায়। এই ভাষাগুলি স্পষ্টতই আপনার জন্য পদ্ধতিগুলি কল করবে। instance.attributeএবং মধ্যে কোন পার্থক্য হয়ে যায় instance.getter_method

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


1
যে বছরটিতে পরামর্শ দেওয়া হয়েছিল তা বিবেচনা করার বিষয়ে অত্যন্ত গুরুত্বপূর্ণ বিষয়। নীট: স্মলটালক এবং সিমুলা 60 এবং 70 এর দশকের, তাই 88 খুব সম্ভবত "প্রথম দিন" হয়।
লুসার droog

2

একজন ব্যবহারকারী হিসাবে আপনার কিছু জানার দরকার নেই যে কীভাবে প্রয়োগ করা হয়।

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


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

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

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

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

2
@ পেট্রিককোলিনস ওও প্রতিক্রিয়া বাস্তবায়ন নয় ইন্টারফেসের উপর নির্ভর করে। ইন্টারফেস সংজ্ঞা অংশ হিসাবে কর্মক্ষমতা গ্যারান্টি অন্তর্ভুক্ত না এমন একটি ইন্টারফেস ব্যবহার করবেন না (যেমন সি ++ 11 এর তালিকা উদাহরণস্বরূপ ও (1) গ্যারান্টিযুক্ত হচ্ছে ize ইন্টারফেস সংজ্ঞাতে এটি বাস্তবায়নের বিশদ সহ অন্তর্ভুক্ত নয়। আপনার কোডটি যদি আপনি চান তার চেয়ে ধীর হয় তবে আপনাকে দ্রুত পরিবর্তন করতে হবে (বাধাগুলি নির্ধারণের জন্য এটি প্রোফাইল দেওয়ার পরে)?
স্টোনমেটাল

2

ডকুমেন্টেশনের যে কোনও প্রোগ্রামার-ভিত্তিক টুকরা যা প্রোগ্রামারদের রুটিন / পদ্ধতির জটিলতার ব্যয় সম্পর্কে অবহিত করতে ব্যর্থ হয়।

  • আমরা সাইড এফেক্ট-মুক্ত পদ্ধতি উত্পাদন করতে চাইছি।

  • একটি পদ্ধতি চালু হওয়ার সময়ের জটিলতা এবং / বা মেমরি জটিলতা ছাড়া অন্য চালানো হয়ে থাকে O(1), memory- বা সময়-সীমাবদ্ধ পরিবেশে এটা পার্শ্ব প্রতিক্রিয়া আছে বিবেচনা করা যেতে পারে

  • অন্তত বিস্ময় নীতিকে এই ক্ষেত্রে, মেমরি নুড়ি বা সিপিইউ সময় নষ্ট - যদি একটি পদ্ধতি কিছু সম্পূর্ণরূপে অপ্রত্যাশিত নয় লঙ্ঘন করা হয়।


1

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

এটি পরিচালনা করার আরেকটি উপায় হতে পারে এমন একটি নতুন বৈশিষ্ট্য প্রবর্তন করা যার নাম থেকেই বোঝা যায় যে একটি দীর্ঘ গণনা হতে পারে (যেমন Person.ageCalculatedFromDB) এবং তারপরে Person.ageশ্রেণীর মধ্যে ক্যাশে থাকা কোনও মান ফিরে পাওয়া যায় তবে এটি সর্বদা উপযুক্ত নাও হতে পারে এবং অতিরিক্ত জটিল বলে মনে হয় জিনিস, আমার মতে।


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

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

দুটি ফলাফল যা পৃথক ফলাফল সরবরাহ করে তা হ'ল পৃথক ব্যবহারের ক্ষেত্রে যখন আপনি প্রতিবার একই উত্তর আশা করেন than
blrfl

0

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

বৈশিষ্ট্যগুলির যদি সঠিক সম্পর্ক না থাকে (উদাহরণস্বরূপ কারণ তারা floatবা doubleতার চেয়ে বেশি int) তবে কোন বৈশিষ্ট্যটি কোনও শ্রেণীর মান "সংজ্ঞায়িত" করে তা নথিভুক্ত করা প্রয়োজন। উদাহরণস্বরূপ, যদিও Leftপ্লাসটি Widthসমান হওয়ার কথা , তবুও Rightভাসমান-পয়েন্ট গণিতটি বেশিরভাগ ক্ষেত্রেই অক্ষু থাকে। উদাহরণস্বরূপ, একটি অনুমান করা Rectangleকোন ধরনের ব্যবহার Floatগ্রহণ Leftএবং Widthকন্সট্রাকটর প্যারামিটার হিসেবে নির্মাণ করা হয় Leftহিসেবে দেওয়া 1234567fএবং Widthযেমন 1.1ffloatযোগফলের সেরা উপস্থাপনাটি 1234568.125 [যা 1234568.13 হিসাবে প্রদর্শিত হতে পারে]; পরবর্তী ছোট floatহবে 1234568.0। যদি ক্লাসটি আসলে স্টোর করে LeftএবংWidth, এটি নির্দিষ্ট করা অনুসারে এটি প্রস্থের মানটির প্রতিবেদন করতে পারে। তবে, কন্সট্রাকটর নির্ণিত Rightউপর গৃহীত-ভিত্তিক Leftএবং Width, এবং পরে নির্ণিত Widthউপর ভিত্তি করে Leftএবং Right, এটা যেমন প্রস্থ প্রতিবেদন হবে 1.25fবদলে হিসাবে পাস-ইন 1.1f

পরিবর্তনীয় ক্লাসগুলির সাথে জিনিসগুলি আরও আকর্ষণীয় হতে পারে, যেহেতু আন্তঃসম্পর্কিত মানগুলির একটিতে পরিবর্তন অন্ততপক্ষে একে অপরের পরিবর্তনকে বোঝায়, তবে এটি সর্বদা পরিষ্কার নয় যে কোনটি। কিছু কিছু ক্ষেত্রে, এটা পদ্ধতি যেটি "সেট" যেমন একটি একক সম্পত্তি থাকার এড়াতে সেরা হতে পারে, কিন্তু এর পরিবর্তে পারেন যেমন করতে পদ্ধতি আছে SetLeftAndWidthবা SetLeftAndRight(যেমন, অথবা অন্য স্পষ্ট করুন বৈশিষ্ট্য কি নিদিষ্ট করা হচ্ছে এবং যা পরিবর্তন করা হয় MoveRightEdgeToSetWidth, ChangeWidthToSetLeftEdgeঅথবা MoveShapeToSetRightEdge) ।

কখনও কখনও কোনও শ্রেণি রাখা দরকারী হতে পারে যা কোন বৈশিষ্ট্যের মানগুলি নির্দিষ্ট করা হয়েছে এবং যা অন্যের কাছ থেকে গণনা করা হয়েছে তা ট্র্যাক করে। উদাহরণস্বরূপ, "সময়ের মধ্যে মুহূর্ত" শ্রেণিতে একটি পরম সময়, একটি স্থানীয় সময় এবং একটি সময় অঞ্চল অফসেট অন্তর্ভুক্ত থাকতে পারে। যেমন দুটি ধরণের তথ্য দেওয়া যেমন, অনেক তৃতীয় গণনা করতে পারে। যা জানাতথ্যের টুকরো গণনা করা হয়েছিল, তবে কখনও কখনও গুরুত্বপূর্ণ হতে পারে। উদাহরণস্বরূপ, ধরুন যে কোনও ইভেন্ট "17:00 ইউটিসি, সময় অঞ্চল -5, স্থানীয় সময় রাত 12:00" এ হিসাবে রেকর্ড করা হয়েছে এবং পরে আবিষ্কার হয়েছে যে সময় অঞ্চলটি-zone হওয়া উচিত ছিল। যদি কেউ জানেন যে ইউটিসি কোনও সার্ভারের বাইরে রেকর্ড করা ছিল, রেকর্ডটি "18:00 ইউটিসি, সময় অঞ্চল -6, স্থানীয় সময় রাত 12:00" এ সংশোধন করা উচিত; স্থানীয় সময় কেউ যদি একটি ঘড়ির কাঁটা বেঁধে রাখে তবে এটি "17:00 ইউটিসি, সময় অঞ্চল -6, স্থানীয় সময় সকাল 11:00" হওয়া উচিত। বিশ্বব্যাপী বা স্থানীয় সময়টিকে "আরও বিশ্বাসযোগ্য" হিসাবে বিবেচনা করা উচিত কিনা তা জেনেও, তবে কোন সংশোধন প্রয়োগ করা উচিত তা জানা সম্ভব নয়। যাইহোক, যদি রেকর্ডটি কোন সময় নির্দিষ্ট করা থাকে তা ট্র্যাক করে রাখে, সময় অঞ্চলে পরিবর্তনগুলি অন্য পরিবর্তন করার সময় সেই একা থাকতে পারে।


0

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

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

এখানে আমি দেখতে অনেক ধরণের জিনিস যাচ্ছি:

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

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

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

সুতরাং ফিগার যান।


0

"গণনা করুন বা না" বা "পারফরম্যান্স তথ্য" এর মতো বাস্তবায়নের বিশদ যুক্ত করা কোড এবং দস্তাবেজকে সিঙ্কে রাখা আরও জটিল করে তোলে

উদাহরণ:

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

একটি কোড রক্ষণাবেক্ষণকারী পক্ষে কোড ডকুমেন্টেশন থেকে সমস্ত গুরুত্বপূর্ণ ইনফোগুলি পাওয়া খুব ভাল, তবে আমি এমন ডকুমেন্টেশন পছন্দ করি না যা এমন কিছু দাবি করে যা আর বৈধ নয় (কোডের সাথে সিঙ্কের বাইরে)


0

গৃহীত উত্তরটি উপসংহারে আসার সাথে সাথে:

সুতরাং: ডকুমেন্ট কর্মক্ষমতা সমস্যা।

এবং স্ব-নথিভুক্ত কোড ভাল ডকুমেন্টেশন চেয়ে বলে মনে করা হয় এটা ধরা যায় পদ্ধতি নাম করা উচিত কোনো অস্বাভাবিক কর্মক্ষমতা ফলাফল রাষ্ট্র।

তাই এখনও Person.ageজন্য return current_year - self.birth_dateকিন্তু পদ্ধতি একটি লুপ ব্যবহার করে বয়স গণনা করতে (হ্যাঁ):Person.calculateAge()

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