ওওপি নীতি এবং পদ্ধতির নাম


22
class Boxer:

    def punch(self, punching_bag, strength):
        punching_bag.punch(strength)


class PunchingBag:

    def punch(self, strength):
        print "Punching bag punched with strength", strength

boxer = Boxer()
punching_bag = PunchingBag()

boxer.punch(punching_bag, 2)

কোনও punchবক্সিংয়ের ক্ষেত্রে একটি ভাল পদ্ধতির নাম এটি সন্দেহ নেই । কিন্তু নাম punchখোঁচা ব্যাগের পদ্ধতির জন্যও কি ভাল? উভয় ক্ষেত্রেই আমি কমান্ড হিসাবে পাঞ্চ বলতে বোঝায় (অর্থাত পঞ্চ)।

উত্তর:


23

থাম্বের একটি ভাল নিয়ম হ'ল পদ্ধতির নামগুলি ক্রিয়াগুলি হওয়া বা এমন পূর্বাভাস দেওয়া উচিত যে আপনি যে বস্তুটিতে তাদের কল করেন ( selfস্ট্যান্ডার্ড পাইথন কনভেনশনে, thisবেশিরভাগ অন্যান্য ভাষায়) বিষয় হয়ে যায়।

এই নিয়ম অনুসারে, file.closeএকধরনের ভুল, যদি না আপনি মানসিক মডেলটির সাথে না যান যে ফাইলটি নিজেই বন্ধ হয়ে যায় বা fileঅবজেক্টটি ফাইলটি নিজেই উপস্থাপন করে না, বরং একটি ফাইল হ্যান্ডেল বা কিছু প্রক্সি অবজেক্ট sort

একটি খোঁচা ব্যাগ কখনও নিজেকে খোঁচা দেয় না, তবে এটি কোনওভাবেই punchingBag.punch()ভুল। be_punched()প্রযুক্তিগতভাবে সঠিক, তবে কুরুচিপূর্ণ। receive_punch()কাজ করতে পারে, বা handle_punch()। জাভাস্ক্রিপ্টে বেশ জনপ্রিয়, অন্য একটি পদ্ধতি হ'ল এই পদ্ধতি পদ্ধতি কলগুলিকে ইভেন্ট হিসাবে বিবেচনা করা এবং সেখানকার কনভেনশনটি ইভেন্ট নামটির সাথে যেতে হবে, এটি 'চালু' এর উপসর্গযুক্ত, যাতে এটি হবে on_punched()বা হবে on_hit()। বিকল্পভাবে, আপনি পূর্ববর্তী অংশগ্রহণকারীরা প্যাসিভ ভয়েস নির্দেশ করে এমন কনভেনশন গ্রহণ করতে পারেন এবং সেই সম্মেলনের মাধ্যমে পদ্ধতির নামটি ন্যায়সঙ্গত হবে punched()

আরেকটি দিক বিবেচনা করার বিষয় হ'ল পঞ্চিং ব্যাগটি আসলে কী আঘাত করেছে তা জানে: আপনি কী এটিকে ঘুষি মারেন, লাঠি দিয়ে প্রহার করুন বা একটি ট্রাক দিয়ে তার মধ্যে চলাচল করে তা কি কোনও পার্থক্য করে? তা হলে পার্থক্য কী? আপনি কি তর্কটিকে আর্গুমেন্টে সিদ্ধ করতে পারেন, বা বিভিন্ন ধরণের প্রাপ্ত শাস্তির জন্য আপনার কী আলাদা পদ্ধতি প্রয়োজন? জেনেরিক প্যারামিটার সহ একটি একক পদ্ধতি সম্ভবত সর্বাধিক মার্জিত সমাধান, কারণ এটি ডিগ্রি সংযুক্তিকে কম রাখে এবং এ জাতীয় পদ্ধতিটি বলা উচিত নয় punched()বা handle_punch()বরং আরও সাধারণ কিছু হতে পারে receive_hit()। এই জাতীয় পদ্ধতিতে জায়গায়, আপনি পঞ্চিং ব্যাগ নিজেই পরিবর্তন না করে এমন সব ধরণের অভিনেতা প্রয়োগ করতে পারেন যা পাঞ্চিং ব্যাগগুলিতে আঘাত করতে পারে।


4
@ আর্টুর: হ্যাঁ এবং না ফাইলগুলি জিজ্ঞাসা করা হলে (ধারণাগতভাবে বলতে) নিজেকে বন্ধ করতে পারে; অ্যারে নিজেকে বাছাই করতে পারে; কিন্তু খোঁচা ব্যাগগুলি তাদের খোঁচা দেয় না।
টিডামাররা

2
ঠিক আছে, যদি আমাদের খোঁচা ব্যাগটি উন্মাদ গতিতে দেয়ালে আঘাত করে, তবে এটি কি সেই প্রাচীর যা এটিকে ঘুষি মারল, নাকি ব্যাগটি ঘুষি মারছিল যা নিজেই আঘাত পেয়েছিল এবং আসলে নিজেই?

1
@tdammers: আপনার সাধারণকরণের পরামর্শটি একটি ইন্টারফেসও ডেকে আনতে পারে Hitable
জেনস পাইগসা

2
@ আর্টুর: আমি মনে করি এটিই যেখানে ওওপি অনুমান যে প্রতিটি বাক্যে একটি প্রাকৃতিক বিষয় রয়েছে এবং এই ধারণাটি প্রোগ্রামিংয়ের ক্ষেত্রে প্রযোজ্য, ভেঙে যায়।
টিডামাররা

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

6

আমি মনে করি এটি একটি ধারণামূলক সমস্যা (আমরা বিশ্ব সম্পর্কে কীভাবে চিন্তা করি)। এটি ঠিক আছে:

  • দেখুন, দরজাটি বন্ধ হয়ে যাচ্ছে। door.close()
  • বাহ, কাগজটি নিজেই ভাঁজ করছে। paper.fold()
  • কি খারাপ অবস্থা?! ডেস্কে থাকা ফাইলটি সবেমাত্র বন্ধ হয়ে গেছে, কেউই আশেপাশে নেই। file.close()

এটি বলা অদ্ভুত:

  • জিমের সেই পাঞ্চিং ব্যাগটি সবেমাত্র খোঁচা দিয়েছে। bag.punch()

প্রথম স্থানে (যেমন অস্ত্র) দিয়ে নিজেকে ঘুষি দেওয়ার জন্য কিছু থাকা দরকার। আপনি সম্ভবত বলবেন:

  • খোঁচা ব্যাগটি নিজের মতো করে চলতে শুরু করেছে যেন কেউ এটিকে ঘুষি মারত। punching_bag.move()

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


2

এটা স্বাদের বিষয়, আমি মনে করি। Punching bagএর punch()পদ্ধতি সঙ্গে অন্তত সামঞ্জস্যপূর্ণ file.close()বা frame.move()নিজেই পদক্ষেপ সম্মুখীন অর্থে। বৃহত্তর প্রশ্ন হতে, কেন হবে Boxerআছে punch(something)এ সব পদ্ধতি?


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

বেশ কয়েকটি অবজেক্টের মধ্য দিয়ে যাওয়ার সময়, দুটি ক্ষেত্রে রয়েছে: আপনি আবদ্ধ প্রসঙ্গ (স্ব) ব্যবহার করেন, এবং আপনি তা করেন না। আপনি যদি করেন তবে আপনার পদ্ধতিগুলি হওয়া উচিত Coach.sayPunchToBoxer(), Boxer.punchNearestBag()এবং Bag.punch()। নাহলে আপনি অনুমান করতে হবে যে আপনি প্রতিবার কল করলে কী ঘটবে Coach.punch()। সাধারণ নিয়মটি হ'ল: যদি পদক্ষেপটির নামে পদক্ষেপের নামটি নির্দিষ্ট না করা হয়, তবে গ্রাহক হ'ল সেই বস্তু।

ওয়েল, আমি মনে করি এটিও ঠিক আছে: কোচ.সায়_পঞ্চ (বক্সার, ঘুষি_বাগ), বক্সার.পঞ্চ (পাঞ্চিং_বাগ)। অর্থাত্ রিসিভার পদ্ধতিটির নামে নয় তবে পরামিতিগুলিতে।
ক্লাইমে

1
অবশ্যই, আমি বোঝাতে চাইছিলাম অ্যাকশন রিসিভার কল স্টেটমেন্ট থেকে অনুমানযোগ্য হওয়া উচিত।

2

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

আমার প্রবণতা punch(boxer, object, strength)হ'ল বিপরীত পদ্ধতিটি রাখা এবং নামকরণ করা punched। আপনি এটিকে handle_punchবা এটির মতো কিছু কল করতে পারেন তবে এটি এখনও কোনও স্পষ্ট নয় যে এটি কোনও পাঞ্চ কমান্ড হ'ল কিনা বা বিজ্ঞপ্তিটি যে এটি পাঞ্চ হয়েছে।


বক্সার সম্পর্কে পাঞ্চ এবং হ্যান্ডেলপঞ্চের মতো কিছু উভয়েরই দরকার (এটি defendএই বিশেষ ক্ষেত্রে হবে) about তবে খোঁচা ব্যাগটি কখনই এর মতো দ্বিদ্বিতীয় হতে পারে না। আর ইতিমধ্যেই এই file.close () হচ্ছে ...
জলবায়ু

defendএকটি আদেশ। এটি এমন একটি সম্ভাব্য ক্রিয়া যা কোনও বস্তুর প্রতিক্রিয়া হিসাবে গ্রহণ করতে পারে punched, তবে আপনি চাইবেন না যে অন্য বস্তুগুলি defendসরাসরি ডাকে ।
ব্যবহারকারী 2313838

2

আপনার পদ্ধতি অবশেষে খুব সংযুক্ত কোডে নিয়ে যাবে।

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

আমি বরং এটি একটি বক্সার হিসাবে মডেল করব যা একটি মুষ্ট্যাঘাত তৈরি করে (অন্য কোনও বস্তু যাতে পাঞ্চের বৈশিষ্ট্য বল, উপস্থিতি, দিক ইত্যাদি) থাকে।

তারপরে একটি পঞ্চিং ব্যাগ এমন কোনও পদ্ধতির সাথে রাখুন যেমন অনপঞ্চ যা এই পাঞ্চ অবজেক্টটি পায় তা নিজেরাই পাঞ্চের প্রভাব গণনা করতে পারে।

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

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


1

এই সমস্যাটিকেই আমি "অবজেক্ট / বিষয়" বিভ্রান্তি বলি এবং এটি বেশ প্রচলিত।

বাক্য যেখানে সাধারণত একটি আছে বিষয় যে এরূপ করে ক্রিয়া লক্ষ্যে উপর বস্তু

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

এর অর্থ এই যে পদ্ধতিগুলি তাদের উপর পরিচালিত হয়, তারা ক্রিয়াটির লক্ষ্য যারা এই ক্রিয়াটি করে না। সে কারণেই আমরা তাদের "বস্তুগুলি" "বিষয়গুলি" বলি না!

আপনি যখন বলছেন যে File.closeএটি ফাইলটি নিজেই বন্ধ হয় না, এটি বর্তমান চলমান থ্রেড যা ফাইলটি বন্ধ করে দেয়। যদি আপনি বলেন Array.sort, বর্তমান চলমান থ্রেড অ্যারে বাছাই করে। যদি আপনি বলেন HttpServer.sendRequest, বর্তমান চলমান থ্রেডটি অনুরোধটি সার্ভারে প্রেরণ করে (বিপরীতে নয়!)। একইভাবে বলা PunchingBag.punchমানে চলমান চলমান থ্রেড ব্যাগটিকে খোঁচা দেয়।

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

তবে মাঝে মাঝে পঞ্চিং ব্যাগের ক্ষেত্রে প্যাচিং নিজেই বলতে পারা যায়, যেখানে প্রতিটি জিনিসের নিজস্ব থ্রেড থাকে আপনি রেসের পরিস্থিতি এড়াতে এবং মেসেজটি পাসওয়ার্ড হিসাবে পদ্ধতি কলগুলি প্রয়োগ করতে চাইতে পারেন: আপনি ব্যাগটি punchবার্তা প্রেরণ করে খোঁচা দেন , এটি থ্রেড পাঞ্চ করে it's তারপরে নিজেই আপনাকে punch successfulবার্তাটি ফেরত পাঠায় তবে এটি কেবল একটি বাস্তবায়ন বিশদ।


0

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

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

যদিও, আমি পদ্ধতিগুলির নাম রাখব কীভাবে এটি আমার ব্যাখ্যা। এটি সমস্ত স্বাদের বিষয় এবং আপনি কোন মানদণ্ড অনুসরণ করছেন।


3
isPunchedসত্যই বিভ্রান্তিমূলক (কমবেশি ফ্রেমওয়ার্ক নামকরণের স্কিমের উপর নির্ভর করে)।

এটি স্বাভাবিক যে পদ্ধতিটি সেই অবজেক্টটিতে প্রয়োগ করা হয়, যার উপরে এটি বলা হয়। ঠিক কী হয়েছে punch()?

ঠিক আছে, আমি পুরোপুরি বুঝতে পেরেছি যে ক্রিয়া দিকটি নির্দিষ্ট করা দরকার তবে আমি মনে করি ওওপি এবং এর দর্শন সম্পর্কে এমন কিছু আছে যা এটি অপ্রয়োজনীয় করে তোলে। কিছু প্রকার বিমূর্ততা যা সেই বিখ্যাত ব্যাখ্যার সাথে সংযুক্ত যা বস্তু একে অপরকে "বার্তা প্রেরণ করে"।
ক্লাইমে

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

-2

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


-3

বক্সার পাঞ্চিংবাগ -> বক্সার.পঞ্চ ঘুষি দেয় ches

পাঞ্চিংব্যাগ বক্সার দ্বারা ঘুষি মারে -> পাঞ্চিংব্যাগ.জেট_পঞ্চ


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