পাইথনে আমি কীভাবে ক্লাস ডিজাইন করব?


143

আমার কোনও পাঞ্জার মধ্যে পাঞ্জা এবং পায়ের আঙ্গুলগুলি সনাক্ত করার জন্য আমার পূর্ববর্তী প্রশ্নগুলিতে সত্যিই দুর্দান্ত কিছু সহায়তা পেয়েছিল তবে এই সমস্ত সমাধানগুলি একবারে কেবলমাত্র একটি পরিমাপের জন্য কাজ করে।

এখন আমার কাছে ডেটা রয়েছে যা বন্ধ করে দিয়েছে:

  • প্রায় 30 কুকুর;
  • প্রত্যেকের 24 টি পরিমাপ থাকে (বেশ কয়েকটি উপগোষ্ঠীতে বিভক্ত);
  • প্রতিটি পরিমাপের কমপক্ষে 4 টি পরিচিতি রয়েছে (প্রতিটি পাঞ্জার জন্য একটি) এবং
    • প্রতিটি পরিচিতি 5 ভাগে বিভক্ত এবং
    • বিভিন্ন পরামিতি রয়েছে, যেমন যোগাযোগের সময়, অবস্থান, মোট বল ইত্যাদি etc.

বিকল্প পাঠ

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

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

সুতরাং এখন আমি কীভাবে ক্লাস তৈরি করব সে সম্পর্কে পরামর্শের সন্ধান করছি যা একটি বুদ্ধিমান ফ্যাশনে আমাকে আমার ডেটা ( একটি কুকুরের জিপড ডেটার লিঙ্ক) প্রক্রিয়াকরণ করতে দেয়


4
আপনি কোনও ডাটাবেস ব্যবহার করার বিষয়েও বিবেচনা করতে চাইতে পারেন (যেমন স্ক্লাইট: ডকস.পাইথন.আর.লিবেরি / এসকি্লাইট3 এইচটিএমএল )। আপনি এমন একটি প্রোগ্রাম লিখতে পারেন যা আপনার বিশাল ডেটা ফাইলগুলি পড়ে এবং এটি ডাটাবেস সারণিতে সারিগুলিতে রূপান্তর করে। তারপরে দ্বিতীয় স্তর হিসাবে আপনি এমন প্রোগ্রাম লিখতে পারেন যা আরও বিশ্লেষণ করতে ডাটাবেসের বাইরে ডেটা টেনে নিয়ে যায়।
unutbu

আপনি এখানে কিছু বলতে চাইছেন? আমি এটি করার পরিকল্পনা করছি, তবে প্রথমে আমি আরও
সুসংহত

উত্তর:


434

একটি ক্লাস ডিজাইন কিভাবে।

  1. শব্দগুলো লিখুন. আপনি এটি করতে শুরু করেছেন। কিছু লোকেরা কেন সমস্যা হয় তা ভাবছেন না এবং ভাবছেন না।

  2. এই শব্দগুলি কী করবে সে সম্পর্কে আপনার বক্তব্যের সেটটিকে সাধারণ বিবৃতিতে প্রসারিত করুন। এর অর্থ হ'ল আপনি যে সমস্ত গণনা এই বিষয়গুলিতে করে যাবেন তা লিখুন। আপনার 30 টি কুকুরের সংক্ষিপ্ত তালিকা, 24 পরিমাপ, 4 টি পরিচিতি এবং যোগাযোগের জন্য বেশ কয়েকটি "পরামিতি" আকর্ষণীয় তবে গল্পের কেবল একটি অংশ। আপনার "প্রতিটি পাটির অবস্থান" এবং "একই পরিচিতির কুকুরের সমস্ত পাগুলি তুলনা করে কোন যোগাযোগটি কোন পাটির সাথে সম্পর্কিত তা নির্ধারণ করতে" অবজেক্ট ডিজাইনের পরবর্তী পদক্ষেপ।

  3. বিশেষ্যগুলিকে আন্ডারলাইন করুন। সিরিয়াসলি। কিছু লোক এর মান নিয়ে বিতর্ক করে তবে আমি দেখতে পেয়েছি যে প্রথমবারের ওও বিকাশকারীরা এটির জন্য সহায়তা করে। বিশেষ্যগুলিকে আন্ডারলাইন করুন।

  4. বিশেষ্যগুলি পর্যালোচনা করুন। "প্যারামিটার" এবং "পরিমাপ" এর মতো জেনেরিক বিশেষ্যগুলি আপনার সমস্যা ডোমেনে আপনার সমস্যার ক্ষেত্রে প্রযোজ্য নির্দিষ্ট, কংক্রিট বিশেষ্যগুলি দিয়ে প্রতিস্থাপন করা দরকার। বৈশিষ্টগুলি সমস্যাটি পরিষ্কার করতে সহায়তা করে। জেনেরিক্স কেবল এলিড বিবরণ।

  5. প্রতিটি বিশেষ্য ("যোগাযোগ", "পাউ", "কুকুর" ইত্যাদি) এর জন্য সেই বিশেষ্যটির বৈশিষ্ট্য এবং সেই পদক্ষেপে যে ক্রিয়াগুলি নিযুক্ত থাকে সেগুলি লিখুন। এটি শর্ট-কাট করবেন না। প্রতিটি বৈশিষ্ট্য। উদাহরণস্বরূপ "ডেটা সেটে 30 টি কুকুর রয়েছে" গুরুত্বপূর্ণ।

  6. প্রতিটি বৈশিষ্ট্যের জন্য, চিহ্নিত করুন যে এটি কোনও সংজ্ঞাযুক্ত বিশেষ্য, বা স্ট্রিং বা ফ্লোট বা অপ্রতিরোজনীয় কিছু জাতীয় "আদিম" বা "পারমাণবিক" ডেটা জাতীয় কিছু to

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

  8. এই মুহুর্তে, আপনি বিশেষ্যকে শ্রেণীর সংজ্ঞায় রূপান্তর করতে শুরু করতে পারেন। কিছু যৌথ বিশেষ্য হ'ল তালিকাগুলি, অভিধান, টিপলস, সেট বা নামফলক এবং আপনার খুব বেশি কাজ করার দরকার নেই। অন্যান্য শ্রেণিগুলি জটিল জটিল, ডাইরেক্ট জটিল ডেটা বা কিছু আপডেট / মিউটেশনের কারণে যা সম্পাদিত হয়।

ইউনিটেস্ট ব্যবহার করে বিচ্ছিন্নভাবে প্রতিটি শ্রেণি পরীক্ষা করতে ভুলবেন না।

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


24

নিম্নলিখিত পরামর্শগুলি (@ এস.লোটের পরামর্শের অনুরূপ) বইটি থেকে শুরু করা হয়, বিগনিং পাইথন: নোভিস থেকে পেশাদার

  1. আপনার সমস্যার বর্ণনা লিখুন (সমস্যাটি কী করা উচিত?)। সমস্ত বিশেষ্য, ক্রিয়া এবং বিশেষণকে আন্ডারলাইন করুন।

  2. বিশেষ্যগুলির মধ্যে দিয়ে যান, সম্ভাব্য ক্লাসগুলি সন্ধান করছেন।

  3. সম্ভাব্য পদ্ধতিগুলির সন্ধান করে ক্রিয়াপদের মধ্য দিয়ে যান।

  4. সম্ভাব্য গুণাবলী সন্ধান করে বিশেষণগুলির মধ্য দিয়ে যান

  5. আপনার ক্লাসে পদ্ধতি এবং বৈশিষ্ট্যগুলি বরাদ্দ করুন

ক্লাসটি পরিমার্জন করতে, বইটিও পরামর্শ দেয় যে আমরা নিম্নলিখিতগুলি করতে পারি:

  1. আপনার কেস কীভাবে ব্যবহার করা যেতে পারে তার উদাহরণস্বরূপ ব্যবহারের একটি সেট লিখুন (বা স্বপ্ন দেখুন)) কার্যকরীভাবে সমস্ত কভার করার চেষ্টা করুন।

  2. প্রতিটি প্রয়োজনের ক্ষেত্রে ধাপে ধাপে চিন্তা করুন, আমাদের প্রয়োজনীয় যে সমস্ত কিছু আবশ্যক তা নিশ্চিত করে নিন।


আমাদের যে ধরণের বাক্যগুলি লেখার কথা ছিল সেগুলির কয়েকটি উদাহরণ থাকা ভাল।
এন্ডোলিথ

14

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

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

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

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

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


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

3

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

dog.footstep(0)

এখন, এটি হতে পারে আপনার ক্ষেত্রে আপনার কাঁচা ডেটা ফাইলটি পড়তে হবে এবং পাদদেশের অবস্থানগুলি গণনা করতে হবে। এই সমস্ত পদক্ষেপ () ফাংশনে লুকানো থাকতে পারে যাতে এটি কেবল একবার ঘটে। কিছুটা এইরকম:

 class Dog:
   def __init__(self):
     self._footsteps=None 
   def footstep(self,n):
     if not self._footsteps:
        self.readInFootsteps(...)
     return self._footsteps[n]

[এটি এখন এক ধরণের ক্যাশে করার ধরণ। প্রথমবার যখন এটি যায় এবং পাদদেশের তথ্য পড়েন, পরবর্তী সময়ে এটি কেবল স্ব থেকে প্রাপ্ত হয় __ফুট পদক্ষেপ]]

তবে হ্যাঁ, ঠিক ওও ডিজাইন পাওয়া কঠিন হতে পারে। আপনি আপনার ডেটাতে যে জিনিসগুলি করতে চান সেগুলি সম্পর্কে আরও চিন্তা করুন এবং এটি আপনাকে জানায় যে কোন ক্লাসে আপনাকে কী পদ্ধতি প্রয়োগ করতে হবে।


2

আপনার বিশেষ্যগুলি, ক্রিয়াগুলি, বিশেষণগুলি লেখার পক্ষে একটি দুর্দান্ত পদ্ধতি, তবে আমি কোন ডেটা লুকিয়ে রাখতে হবে এমন প্রশ্ন জিজ্ঞাসা করে ক্লাস ডিজাইনের কথা ভাবতে পছন্দ করি ?

কল্পনা করুন যে আপনার একটি Queryবস্তু এবং একটি Databaseবস্তু রয়েছে:

Queryঅবজেক্ট আপনার তৈরি সাহায্য এবং একটি ক্যোয়ারী সংরক্ষণ করবে - দোকান, কী এখানে, যেমন একটি ফাংশন সাহায্য করতে পারে আপনি এক ঠিক যেমন সহজে তৈরি হয়। হতে পারে আপনি থাকতে পারে: Query().select('Country').from_table('User').where('Country == "Brazil"')। সিনট্যাক্সে ঠিক তেমন কিছু যায় আসে না - এটাই আপনার কাজ! - কীটি হ'ল অবজেক্টটি আপনাকে কোনও কিছু আড়াল করতে সহায়তা করছে , এক্ষেত্রে কোনও ক্যোয়ারী সংরক্ষণ এবং আউটপুট দেওয়ার জন্য প্রয়োজনীয় ডেটা। বস্তুটির শক্তি এটি ব্যবহারের সিনট্যাক্স থেকে আসে (এক্ষেত্রে কিছু চতুর শৃঙ্খলিত) এবং এটি কাজ করার জন্য এটি কী সঞ্চয় করে তা জানার দরকার নেই। ডান হয়ে গেলে Queryঅবজেক্টটি আরও একটি ডাটাবেসের অনুসন্ধান করতে পারে। এটি অভ্যন্তরীণভাবে একটি নির্দিষ্ট বিন্যাস সংরক্ষণ করবে তবে আউটপুট দেওয়ার সময় সহজেই অন্যান্য ফর্ম্যাটগুলিতে রূপান্তর করতে পারে (পোস্টগ্রিস, মাইএসকিউএল, মঙ্গোডিবি)।

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

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

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

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


2

আপনার লিঙ্কযুক্ত কোডটি স্কিম করার পরে, আমার কাছে মনে হচ্ছে আপনি এই মুহুর্তে একটি কুকুর শ্রেণি নকশা না করাই ভাল । বরং আপনার পান্ডাস এবং ডেটাফ্রেম ব্যবহার করা উচিত । একটি ডেটাফ্রেম কলাম সহ একটি সারণী। আপনি dataframe যেমন কলাম আছে হবে: dog_id, contact_part, contact_time, contact_location, ইত্যাদি পান্ডাস লোকচক্ষুর অন্তরালে Numpy অ্যারে ব্যবহার করে, এবং এটি আপনার জন্য অনেক সুবিধা পদ্ধতি রয়েছে:

  • উদাহরণস্বরূপ একটি কুকুর নির্বাচন করুন: my_measurements['dog_id']=='Charly'
  • তথ্য সংরক্ষণ করুন: my_measurements.save('filename.pickle')
  • pandas.read_csv()পাঠ্য ফাইলগুলি ম্যানুয়ালি পড়ার পরিবর্তে ব্যবহার করার কথা বিবেচনা করুন ।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.