পাইথনে, আমি কখন কোনও পদ্ধতির পরিবর্তে কোনও ফাংশন ব্যবহার করব?


118

পাইথনের জেন বলে যে জিনিসগুলি করার একমাত্র উপায় থাকা উচিত- তবুও আমি কখন কোন পদ্ধতি ব্যবহার করতে পারি এবং কখন কোন পদ্ধতি ব্যবহার করব সে সম্পর্কে সিদ্ধান্ত নিতে সমস্যাটি দেখি।

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

এখানে কিছু সম্পর্কিত প্রশ্ন আমি দেখেছি:

আমি যে উত্তর পেয়েছি সেগুলি মূলত বেয়াদবি ছিল:

পাইথন কিছু কার্যকারিতার জন্য যেমন পদ্ধতিগুলি ব্যবহার করে (যেমন list.index ()) তবে অন্যগুলির জন্য ফাংশন (যেমন লেন (তালিকা))?

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

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

আকর্ষণীয় হলেও, উপরোক্ত বিষয়গুলি কী কৌশল অবলম্বন করবে সে সম্পর্কে সত্যিকার অর্থে খুব বেশি কিছু বলা যায় না।

এটি অন্যতম কারণ - কাস্টম পদ্ধতির সাহায্যে বিকাশকারীরা getLength (), দৈর্ঘ্য (), getleth () বা যেকোনো একটি পৃথক পদ্ধতির নাম চয়ন করতে পারবেন। পাইথন কঠোর নামকরণ কার্যকর করে যাতে সাধারণ ফাংশন লেন () ব্যবহার করা যায়।

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

সর্বশেষে, নিজে গুডো থেকে :

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

class container:
  ...
  def len(self):
    raise NotImplemented

যদিও এটি সম্পর্কে আরও কিছু চিন্তাভাবনা করা হচ্ছে, আমি দেখতে পাচ্ছি না যে সমস্ত সিনট্যাকটিক ক্রিয়াকলাপগুলি কেবলমাত্র একটি নির্দিষ্ট এবিসি-তে যথাযথভাবে সাধারণভাবে নামকরণের পদ্ধতিটি গ্রহণ করবে না। " <", উদাহরণস্বরূপ, সম্ভবত " object.lessthan" (বা সম্ভবত " comparable.lessthan") প্রার্থনা করবে । সুতরাং আর একটি সুবিধা হ'ল পাইথনকে এই ম্যাঙ্গেল-নামের বিজোড়তা থেকে দূরে রাখার ক্ষমতা যা আমার কাছে এইচসিআইয়ের উন্নতি বলে মনে হয়

হুঁ। আমি নিশ্চিত নই যে আমি রাজি (চিত্র :-)।

"পাইথন যুক্তি" এর দুটি বিট রয়েছে যা আমি প্রথমে ব্যাখ্যা করতে চাই।

প্রথমত, আমি এইচসিআই কারণে ( def __len__()অনেক পরে এসেছি ) x.len () এর চেয়ে বেশি লেন (এক্স) বেছে নিয়েছি । দুটি আন্তঃসংযোগযুক্ত কারণ রয়েছে, উভয়ই এইচসিআই:

(ক) কিছু ক্রিয়াকলাপের জন্য, উপসর্গ শিরোনাম পোস্টফিক্সের চেয়ে ভাল পড়ে - উপসর্গ (এবং ইনফিক্স!) অপারেশনগুলির গণিতে একটি দীর্ঘ traditionতিহ্য রয়েছে যা স্বাক্ষরগুলি পছন্দ করে যেখানে ভিজ্যুয়ালগুলি কোনও সমস্যা সম্পর্কে গণিতবিদকে ভাবতে সহায়তা করে। সহজ, যা দিয়ে আমরা মত একটি সূত্র পুনর্লিখন তুলনা x*(a+b)মধ্যে x*a + x*bএকটি কাঁচা OO যেমন পণ্য স্বরলিপি ব্যবহার করে একই জিনিস করছেন জবরজঙ্গতা করতে।

(খ) আমি যখন কোডটি পড়ি যখন জানায় যে len(x)আমি জানি যে এটি কোনও কিছুর দৈর্ঘ্যের জন্য জিজ্ঞাসা করছে। এটি আমাকে দুটি জিনিস বলে: ফলাফলটি একটি পূর্ণসংখ্যা এবং যুক্তিটি এক ধরণের ধারক। বিপরীতে, যখন আমি পড়ি x.len(), আমাকে ইতিমধ্যে জানতে হবে যে xকোনও ধরণের কনটেইনার একটি ইন্টারফেস বাস্তবায়ন করে বা একটি শ্রেণীর সাথে উত্তরাধিকার সূত্রে প্রাপ্ত len()। আমাদের মাঝে মাঝে যে বিভ্রান্তি রয়েছে সেটার সাক্ষ্য দিন যখন ম্যাপিং বাস্তবায়ন না করে এমন কোনও শ্রেণীর একটি পদ্ধতি get()বা keys()পদ্ধতি থাকে বা কোনও ফাইল যা ফাইল নয় তার একটি write()পদ্ধতি থাকে।

একই কথা অন্যভাবে বলছি, আমি বিল্ট-ইন অপারেশন হিসাবে 'লেন' দেখছি । আমি এটি হারাতে ঘৃণা করব। আপনি এটি বোঝাতে চেয়েছিলেন বা না তা আমি নিশ্চিত করে বলতে পারি না, তবে 'ডিফ লেন (স্ব): ...' অবশ্যই মনে হচ্ছে আপনি এটিকে কোনও সাধারণ পদ্ধতিতে কমিয়ে আনতে চান। আমি দৃ strongly়ভাবে -1 এ।

পাইথন যুক্তির দ্বিতীয় বিটটি আমি ব্যাখ্যা করার প্রতিশ্রুতি দিয়েছিলাম যে কারণটি দেখার জন্য আমি বিশেষ পদ্ধতিগুলি বেছে নিয়েছি __special__এবং কেবলমাত্র নয় special। আমি অপারেশন প্রচুর anticipating হয় যে শ্রেণীর ওভাররাইড করতে চাইতে পারেন, কিছু মান (যেমন __add__অথবা __getitem__), কিছু তাই মান না (যেমন জরান এর __reduce__একটি দীর্ঘ সময়ের জন্য এ সব সি কোডে কোন সমর্থন ছিল)। আমি চাইনি যে এই বিশেষ ক্রিয়াকলাপগুলি সাধারণ পদ্ধতির নামগুলি ব্যবহার করুন, কারণ তখনকার প্রাক-বিদ্যমান ক্লাসগুলি বা সমস্ত বিশেষ পদ্ধতির জন্য একটি এনসাইক্লোপেডিক স্মৃতিবিহীন ব্যবহারকারীদের দ্বারা লেখা ক্লাসগুলি দুর্ঘটনাক্রমে সংজ্ঞা সংজ্ঞায়িত করতে দায়বদ্ধ হবে যার প্রয়োগটি তারা বোঝাতে চাইছিল না সম্ভবত বিপর্যয়কর পরিণতি সহ। ইভান ক্রিশিয়া তার বার্তায় এই আরও সংক্ষিপ্ততার ব্যাখ্যা দিয়েছিলেন, যা আমি এই সমস্ত লেখার পরে এসেছি।

- - গুয়েডো ভ্যান রসম (হোম পেজ: http://www.python.org/~guido/ )

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

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

টিএলডিআর: ফাংশন বনাম পদ্ধতিগুলি কখন ব্যবহার করা উচিত তা সিদ্ধান্ত নেওয়ার কৌশলটি কী ব্যাখ্যা করতে পারে?


2
মেহ, আমি সবসময় একেবারে স্বেচ্ছাচারী হিসাবে ভেবেছিলাম। হাঁসের টাইপিং অন্তর্নিহিত "ইন্টারফেস" এর জন্য অনুমতি দেয়, এটি আপনার X.frobবা X.__frob__মুক্ত-স্থিতি থাকা থেকে খুব বেশি পার্থক্য হয় না frob
বিড়াল প্লাস প্লাস

2
যদিও আমি বেশিরভাগ ক্ষেত্রে আপনার সাথে একমত, নীতিগতভাবে আপনার উত্তর পাইথোনিক নয়। স্মরণ করুন, "অস্পষ্টতার মুখে অনুমান করার প্রলোভনটি অস্বীকার করুন।" (অবশ্যই, সময়সীমাগুলি এটিকে পরিবর্তন করতে পারে তবে আমি মজা / স্ব-উন্নতির জন্য এটি করছি))
Ceasar Bautista

পাইথন সম্পর্কে এটি আমার পছন্দ নয়। আমার মনে হয় আপনি যদি স্ট্রিংয়ের মতো টাইপিং টাইপ করার জন্য চাপ প্রয়োগ করতে চলেছেন তবে কেবল এটি একটি পদ্ধতি তৈরি করুন। এটি পেরেন এবং সময় সাপেক্ষে বন্ধ করে রাখা বিরক্তিকর।
ম্যাট

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

1
"পাইথনের জেন জানিয়েছে যে জিনিসগুলি করার একমাত্র উপায় থাকা উচিত" ব্যতীত এটি।
জেনেটে

উত্তর:


84

আমার সাধারন নিয়মটি হ'ল - বস্তুতে বা বস্তু দ্বারা অপারেশন করা হয়?

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

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

class duck: 
    def __init__(self):pass
    def eat(self, o): pass 
    def crap(self) : pass
    def die(self)
    ....

"অবজেক্টস হ'ল রিয়েল জিনিস" উপমা অনুসারে, বস্তু যা কিছু করতে পারে তার জন্য শ্রেণিক পদ্ধতি যুক্ত করা "সঠিক"। সুতরাং বলুন আমি একটি হাঁসকে হত্যা করতে চাই, আমি কি হাঁসের সাথে একটি। কিল () যুক্ত করব? না ... আমি যতদূর জানি প্রাণীরা আত্মহত্যা করে না। তাই যদি আমি হাঁসকে হত্যা করতে চাই তবে আমার এই করা উচিত:

def kill(o):
    if isinstance(o, duck):
        o.die()
    elif isinstance(o, dog):
        print "WHY????"
        o.die()
    elif isinstance(o, nyancat):
        raise Exception("NYAN "*9001)
    else:
       print "can't kill it."

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

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

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


সুতরাং সংক্ষেপে, অ-সদস্য ফাংশনগুলি অপরিবর্তনীয় বস্তুগুলিতে পরিচালনা করে, পরিবর্তনীয় বস্তু সদস্য-ফাংশন ব্যবহার করে? (বা এটি কী কঠোরতর সাধারণীকরণ? এটি নির্দিষ্ট কাজের জন্য কেবল কারণ অপরিবর্তনীয় ধরণের কোনও রাজ্য থাকে না))
সিয়াসার বাউটিস্তা

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

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

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

1
খাওয়া (স্ব), জঞ্জাল (স্ব), মরা (স্ব)। hahahaha
Wapiti

27

আপনি যখন চান তখন একটি ক্লাস ব্যবহার করুন:

1) প্রয়োগের বিশদ থেকে কলিং কোডটি বিচ্ছিন্ন করুন - বিমূর্ততা এবং এনক্যাপসুলেশনের সুবিধা গ্রহণ করা ।

2) যখন আপনি অন্যান্য সামগ্রীর জন্য বিকল্প হতে চান - বহুবর্ষের সুবিধা গ্রহণ করছেন ।

3) আপনি যখন অনুরূপ বস্তুর জন্য কোডটি পুনরায় ব্যবহার করতে চান - উত্তরাধিকারের সুযোগ গ্রহণ করে ।

কলগুলির জন্য এমন একটি ফাংশন ব্যবহার করুন যা বিভিন্ন বিভিন্ন অবজেক্টের ধরণের মধ্যে বোঝায় - উদাহরণস্বরূপ, বিল্টিন লেন এবং রেপ ফাংশনগুলি বিভিন্ন ধরণের অবজেক্টের জন্য প্রযোজ্য।

বলা হচ্ছে, পছন্দটি মাঝে মাঝে স্বাদে নেমে আসে। সাধারণ কলগুলির জন্য সবচেয়ে সুবিধাজনক এবং পাঠযোগ্য কি তা বিবেচনা করুন। উদাহরণস্বরূপ, কোনটি ভাল হবে (x.sin()**2 + y.cos()**2).sqrt()বা sqrt(sin(x)**2 + cos(y)**2)?


8

এখানে থাম্বের একটি সহজ নিয়ম: কোডটি যদি কোনও জিনিসের একক উদাহরণে কাজ করে তবে একটি পদ্ধতি ব্যবহার করুন। আরও ভাল: কোনও পদ্ধতি হিসাবে এটি কোনও ফাংশন হিসাবে লেখার জন্য বাধ্যতামূলক কারণ না থাকলে ব্যবহার করুন।

আপনার নির্দিষ্ট উদাহরণে, আপনি এটি দেখতে এটি দেখতে চাই:

chessboard = Chessboard()
...
chessboard.get_king_moves()

এটা ভাবেন না। পয়েন্ট না আসা পর্যন্ত সর্বদা পদ্ধতিগুলি ব্যবহার করুন যেখানে আপনি নিজেকে বলে থাকেন "এটিকে কোনও পদ্ধতি তৈরি করা কোনও অর্থবোধ নয়", এই ক্ষেত্রে আপনি কোনও ফাংশন করতে পারেন।


2
আপনি ব্যাখ্যা করতে পারেন কেন আপনি ফাংশনগুলির চেয়ে পদ্ধতিগুলিতে ডিফল্ট হন? (এবং আপনি যদি ব্যাখ্যা করতে পারেন যে যদি সেই নিয়মটি স্ট্যাক এবং সারি / পপ এবং ধাক্কা পদ্ধতিগুলির ক্ষেত্রে এখনও উপলব্ধি করে?)
সিয়াসার বাউটিস্তা

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

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

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

-1 এই উত্তর হিসাবে সম্পূর্ণরূপে নির্বিচারে হল: আপনি মূলত প্রকট যে X দ্বারা ওয়াই চেয়ে ভাল চেষ্টা করছেন অভিমানী যে এক্স ওয়াই চেয়ে ভাল
gented

7

আমি সাধারণত একজন ব্যক্তির মতো কোনও বিষয় মনে করি।

বৈশিষ্ট্যগুলি হ'ল ব্যক্তির নাম, উচ্চতা, জুতার আকার ইত্যাদি are

পদ্ধতি এবং ফাংশনগুলি অপারেশন যা ব্যক্তি সম্পাদন করতে পারে।

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

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

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


তবে আপনি যে কোনও বৃদ্ধ ব্যক্তির উচ্চতা পরিমাপ করতে পারেন, সুতরাং সেই যুক্তি দিয়ে তা হওয়া উচিত, তাই height(person)না person.height?
এন্ডোলিথ

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

@ অন্যদিকে, যদি ব্যক্তিটি এমন একটি বাচ্চা হয় যা বেড়ে ওঠে এবং উচ্চতা পরিবর্তন করে, তবে কোনও পদ্ধতি কোনও ফাংশন নয়, এটির যত্ন নিতে দেওয়া স্পষ্ট হবে be

এটি সত্য না। আপনার যদি হয় are_married(person1, person2)? এই ক্যোয়ারীটি খুব সাধারণ এবং সুতরাং এটি কোনও পদ্ধতি নয় একটি ফাংশন হওয়া উচিত।
পিথিকোস

@ পিথিকোস শিওর, তবে এর মধ্যে একটি অবজেক্টের (ব্যক্তি) উপর সঞ্চালিত কেবল একটি গুণ বা কর্মের চেয়েও বেশি কিছু জড়িত, বরং দুটি বস্তুর মধ্যে সম্পর্ক।
Thriveth

4

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

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

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

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


0

আপনি এটি বলতে পারেন, "অস্পষ্টতার মুখে অনুমান করার প্রলোভনটি অস্বীকার করুন"।

তবে এটি একটি অনুমানও নয়। আপনি নিশ্চিত যে উভয় পদ্ধতির ফলাফল একই যে তারা আপনার সমস্যার সমাধান করে।

আমি বিশ্বাস করি লক্ষ্যগুলি অর্জনের একাধিক উপায় থাকা কেবল একটি ভাল জিনিস। আমি আপনাকে विनम्रভাবে বলতে চাই, অন্য ব্যবহারকারীরা যেমন ইতিমধ্যে করেছিলেন, ভাষার ক্ষেত্রে যে কোনও "স্বাদে ভাল" / আরও স্বজ্ঞাত বোধ করেন ।

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