একটি শ্রেণি পদ্ধতি থেকে "স্ব-স্বদেশ ফেরানোর" উদ্দেশ্য?


46

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

class Foo(object):

  def __init__(self):
    self.myattr = 0

  def bar(self):
    self.myattr += 1
    return self

2
এবং এইভাবে সমস্ত jQuery রচিত হয় কত সুন্দর। প্রায় প্রতিটি ফাংশন একটি jQuery অবজেক্ট ফিরিয়ে দেয়
CaffGeek

11
আপনি কেন এমনভাবে লেখা কোডকে বিশ্বাস করবেন না?
sepp2k

উত্তর:


65

এটি শৃঙ্খলার অনুমতি দেয়।

উদাহরণ স্বরূপ:

var Car = function () {
    return {
        gas : 0,
        miles : 0,
        drive : function (d) {
            this.miles += d;
            this.gas -= d;
            return this;
        },
        fill : function (g) {
            this.gas += g;
            return this;
        },
    };
}

এখন আপনি বলতে পারেন:

var c = Car();
c.fill(100).drive(50);
c.miles => 50;
c.gas => 50;

20
রেকর্ডের জন্য, এই জাতীয় শৃঙ্খলা সাধারণত সাবলীল ইন্টারফেস সহ কোডে দেখা যায় ।
মিথ্যা রায়ান

10

@ লাইয়ান রায়ান এবং @ ফ্র্যাঙ্ক শিয়েরার উল্লেখ অনুসারে, এটিকে "সাবলীল ইন্টারফেস" বলা হয় তবে সেই প্যাটার্নটি সত্যই দীর্ঘকাল ধরে রয়েছে।

এই প্যাটার্নটির বিতর্কিত অংশটি হ'ল ওওতে আপনার পরিবর্তনীয় অবস্থা রয়েছে, সুতরাং একটি শূন্য পদ্ধতিতে একধরনের অন্তর্নিহিত রিটার্ন মান থাকে this- অর্থাত, আপডেট হওয়া অবস্থায় থাকা অবজেক্টটি একধরণের রিটার্ন মান।

সুতরাং পরিবর্তনীয় স্থিতিযুক্ত ওও ভাষায়, এই দুটি কম বা বেশি সমতুল্য:

a.doA()
a.doB()
a.doC()

...উল্টোদিকে

a.doA().doB().doC()

অতএব আমি শুনেছি অতীতে লোকেরা সাবলীল ইন্টারফেসগুলি প্রতিরোধ করে কারণ তারা প্রথম রূপ পছন্দ করে। "সাবলীল ইন্টারফেস" এর জন্য আমি শুনেছি এমন অন্য নামটি হ'ল "ট্রেন রেক";)

আমি বলি "আরও বা কম সমতুল্য", কারণ সাবলীল ইন্টারফেসগুলি একটি কুঁচকে যুক্ত করে। তাদের "এটি ফিরিয়ে" দিতে হবে না। তারা "নতুন ফিরে আসতে" পারে। এটি ওওর মধ্যে অপরিবর্তনীয় জিনিসগুলি অর্জন করার একটি উপায়।

সুতরাং আপনার একটি ক্লাস এ থাকতে পারে যা (সিউডোকোড) করে

function doA():
    return new A(value + 1)

function doB():
    return new A(value * 2)

function doC():
    return new A(sqrt(value))

এখন, প্রতিটি পদ্ধতি প্রাথমিক অবজেক্টটি অপরিবর্তিত রেখে, একেবারে নতুন অবজেক্ট প্রদান করে। এবং এটি আপনার কোডটিতে সত্যিকার অর্থে খুব বেশি পরিবর্তন না করে স্থাবর পদার্থে প্রবেশের এক উপায়।


ঠিক আছে তবে যদি আপনার পদ্ধতিগুলি ফিরে আসে new(...), এটি মেমরি ফাঁস করবে।
smci

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

@ 8 বিট্রি: আমরা পাইথনের কথা বলছি, এই প্রশ্নটি 8 বছর আগে পাইথনকে ট্যাগ করেছিল। পাইথন জিসি দুর্দান্ত নয় তাই প্রথম স্থানে মেমরি ফাঁস না করা ভাল। __init__বারবার কল করা ওভারহেডের পরিচয় দেয়।
স্মি

8

বেশিরভাগ ভাষা 'রিটার্ন সেল্ফ' প্রবচন সম্পর্কে সচেতন এবং যদি এটি কোনও লাইনে না ব্যবহৃত হয় তবে তা এড়িয়ে চলে ignore তবে এটি লক্ষণীয় যে পাইথনে, ফাংশনগুলি Noneডিফল্টরূপে ফিরে আসে ।

আমি যখন সিএস স্কুলে ছিলাম তখন আমার প্রশিক্ষক ফাংশন, পদ্ধতি, রুটিন এবং পদ্ধতির মধ্যে পার্থক্য সম্পর্কে বিশাল চুক্তি করেছিলেন; অনেকগুলি হাতে-কল্পনা প্রবন্ধের প্রশ্নগুলি আমার হাতে মেকানিকাল পেন্সিলগুলি গরম হয়ে উঠছিল with

এটিকে বলার অপেক্ষা রাখে না, স্ব-স্বদেশকে ফিরিয়ে আনা শ্রেণিবদ্ধ পদ্ধতিগুলি হস্তক্ষেপের চূড়ান্ত উপায় but

চেইনিং, যেমনটি তারা লিখেছিল, কেবলমাত্র শেষের ক্রিয়াকলাপের উত্তরটি পরবর্তীটির মধ্যে রেখে দিচ্ছে, এবং পাইথনের রানটাইম সেই ধরণের জিনিসটিকে অনুকূল করতে পারে। তালিকা অনুধাবন এটি এর অন্তর্নির্মিত ফর্ম। (খুব শক্তিশালী!)

পাইথনে এটি এত গুরুত্বপূর্ণ নয় যে প্রতিটি পদ্ধতি বা ফাংশন জিনিস ফিরিয়ে দেয়, এজন্য ডিফল্ট কোনওটিই নয়।

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

যদি কোনও পদ্ধতি ব্যর্থ হতে পারে তবে এটি সাফল্য বা ব্যর্থতা ফিরিয়ে আনতে হবে বা পরিচালনা করতে ব্যতিক্রম বাড়াতে হবে।

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

প্রকার-সীমাবদ্ধ ভাষাগুলি চিৎকার করে চিৎকার করে এবং বিরতি দেয় যখন আপনি এটি করার চেষ্টা করেন তবে ব্যাখ্যা করা ভাষাগুলি (পাইথন, লুয়া, লিস্প) অনেক বেশি গতিশীল।


4

স্মলটাল্কে, প্রতিটি পদ্ধতি যা স্পষ্টভাবে কিছু ফিরিয়ে দেয় না, তার অন্তর্নিহিত "রিটার্ন স্ব" থাকে।

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


আকর্ষণীয় ... এর মধ্যে Python, প্রতিটি পদ্ধতি যা স্পষ্টভাবে কিছু প্রত্যাবর্তন করে না, তার অন্তর্নিহিত "রিটার্ন নয়" থাকে has
চাকরি

2

কোনও বস্তুর প্রত্যাবর্তনের প্রসেস ( return self)

  • উদাহরণ:

    print(foo.modify1().modify2())
    
    # instaed of
    foo.modify1()
    foo.modify2()
    print(foo)
    
  • প্রোগ্রামিং সম্প্রদায়ের আরও জনপ্রিয় স্টাইল (আমার মনে হয়)।

কোনও বস্তুর রূপান্তরকরণের প্রসেস (না return self)

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

গাইডের তর্ক আমার কাছে বাধ্য করেছে। বিশেষত যে অংশটির বিষয়ে তিনি কথা বলেন "পাঠক অবশ্যই প্রতিটি পদ্ধতির সাথে নিবিড়ভাবে परिचित হতে হবে" অর্থাত্ এটি আপনাকে একটি স্ব-শৃঙ্খলা বা আউটপুট শৃঙ্খলা বা একটি কম্বো অন্তর্ভুক্ত রয়েছে তা বোঝার আগে আপনাকে এটি নির্ধারণ করতে বাধ্য করে শৃঙ্খলা
নাথ

@ নাট স্ট্রিং প্রসেসিং অপারেশনগুলি কীভাবে বাকি অপারেশন থেকে মৌলিকভাবে আলাদা?
x

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

@ ম্যাট আমি ঠিক মনে করেছি পাইথনের স্ট্রিং অবিচ্ছেদ্য। এটি আমার প্রশ্নের পুরো উত্তর দেয়।
x

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