জাভাতে স্টাইলটি কী আরও ভাল (ইনস্ট্যান্স ভেরিয়েবল বনাম রিটার্ন মান)


32

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

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

public class MyClass {
    private int var1;

    MyClass(){
        doSomething();
        doSomethingElse();
        doMoreStuff();
    }

    private void doSomething(){
        var1 = 2;
    }

    private void doSomethingElse(){
        int var2 = var1 + 1;
    }

    private void doMoreStuff(){
        int var3 = var1 - 1;
    }
}

অথবা কেবল স্থানীয় ভেরিয়েবলগুলি ইনস্ট্যান্ট করছে এবং সেগুলি আর্গুমেন্ট হিসাবে পাস করছে?

public class MyClass {  
    MyClass(){
        int var1 = doSomething();
        doSomethingElse(var1);
        doMoreStuff(var1);
    }

    private int doSomething(){
        int var = 2;
        return var;
    }

    private void doSomethingElse(int var){
        int var2 = var + 1;
    }

    private void doMoreStuff(int var){
        int var3 = var - 1;
    }
}

যদি উত্তরটি হয় যে তারা উভয়ই সঠিক, কোনটি বেশি দেখা / ব্যবহৃত হয়? এছাড়াও, আপনি যদি প্রতিটি বিকল্পের জন্য অতিরিক্ত উপকার / কনস সরবরাহ করতে পারেন তবে এটি খুব মূল্যবান।



1
এই ভেরিয়েবলগুলির জন্য থ্রেডের মধ্যে দ্বন্দ্বের সম্ভাবনার কারণেই কেউ এখনও উল্লেখ করেছে বলে আমি মনে করি না যে উদাহরণস্বরূপ ভেরিয়েবলগুলিতে মধ্যবর্তী ফলাফল স্থাপন করা সামঞ্জস্যকে আরও কঠিন করে তুলতে পারে।
এসডেনহ্যাম

উত্তর:


107

আমি অবাক হয়েছি এটি এখনও উল্লেখ করা হয়নি ...

এটি নির্ভর করে যদি var1আসলে আপনার বস্তুর রাজ্যের অংশ হয়

আপনি ধরে নিলেন যে এই দুটি পদ্ধতিরই সঠিক এবং এটি কেবল স্টাইলের বিষয়। আপনি ভুল.

এটি সম্পূর্ণরূপে কীভাবে সঠিকভাবে মডেল করবেন about

একইভাবে, privateউদাহরণস্বরূপ পদ্ধতিগুলি আপনার অবজেক্টের স্থিতি পরিবর্তনের জন্য বিদ্যমান । যদি আপনার পদ্ধতি এটি না করে তবে তা হওয়া উচিত private static


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

4
উত্তরে যুক্ত করা - যদি var1কয়েকটি পদ্ধতির প্রয়োজন হয় তবে রাষ্ট্রের অংশ না হয়ে থাকে তবে MyClassসময় লাগতে পারে var1এবং সেই পদ্ধতিগুলি অন্য শ্রেণিতে ব্যবহার করা যেতে পারে MyClass
মাইক পার্টরিজ

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

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

2
@ ক্যান্ডিওড ওরেঞ্জ দুটি মন্তব্য করার পরে আপনি কী বোঝাতে চেয়েছেন তা পরিষ্কার করে দিয়েছিলেন। আমি বলছি যে আপনি সহজেই প্রথম জবাব দিতে পারে। এছাড়াও, হ্যাঁ, আমি ভুলে গিয়েছিলাম যে কেবল অবজেক্টের চেয়ে আরও কিছু আছে; আমি একমত যে কখনও কখনও ব্যক্তিগত উদাহরণ পদ্ধতিগুলির একটি উদ্দেশ্য থাকে। আমি শুধু কিছু মনে করতে পারে না। সম্পাদনা: আমি ঠিক বুঝতে পেরেছিলাম আপনি আসলে ছিলেন না, আমাকে উত্তর দেওয়ার প্রথম ব্যক্তি। আমার খারাপ। আমি উত্তর পেয়েছিলাম কেন একটি উত্তর একটি কার্ট, এক বাক্য, উত্তর না দেওয়া, যখন পরেরটি আসলে বিষয়গুলি ব্যাখ্যা করে।
মনিকার লসুইট

17

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


7

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

আপনার প্রশ্নের জন্য এর অর্থ এটি নির্ভর করে যে পরিবর্তনশীল কোনও বস্তুর রাজ্যের অংশ কিনা is যদি হ্যাঁ, তবে এটি সেই সুযোগে, অর্থাৎ পুরো অবজেক্টে ব্যবহার করা ঠিক আছে। এই ক্ষেত্রে প্রথম বিকল্পের সাথে যান with যদি না হয় তবে দ্বিতীয় বিকল্পের সাথে যান কারণ এটি ভেরিয়েবলের দৃশ্যমানতা এবং এইভাবে সামগ্রিক জটিলতা হ্রাস করে।


5

জাভাতে স্টাইলটি কী আরও ভাল (ইনস্ট্যান্স ভেরিয়েবল বনাম রিটার্ন মান)

আরও একটি স্টাইল রয়েছে - একটি প্রসঙ্গ / রাষ্ট্র ব্যবহার করুন।

public static class MyClass {
    // Hold my state from one call to the next.
    public static final class State {
        int var1;
    }

    MyClass() {
        State state = new State();
        doSomething(state);
        doSomethingElse(state);
        doMoreStuff(state);
    }

    private void doSomething(State state) {
        state.var1 = 2;
    }

    private void doSomethingElse(State state) {
        int var2 = state.var1 + 1;
    }

    private void doMoreStuff(State state) {
        int var3 = state.var1 - 1;
    }
}

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

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


3

এটি পার্শ্ব প্রতিক্রিয়া সম্পর্কে।

var1রাষ্ট্রের অংশ কিনা তা জিজ্ঞাসা করা এই প্রশ্নের মূল বিষয়টি বাদ দেয়। অবশ্যই যদি var1অবিরত থাকতে হয় তবে এটি একটি উদাহরণ হতে হবে। হয় দৃ pers়তা প্রয়োজন হয় বা না হয় কাজ করার জন্য পদ্ধতির তৈরি করা যেতে পারে।

পার্শ্ব প্রতিক্রিয়া পদ্ধতির

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

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

কার্যকরী পদ্ধতির

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

রাজ্যের অংশ বা না, আপনি এখনও উভয় পদ্ধতির ব্যবহার করতে পারেন।

এই উদাহরণগুলিতে 'var1' এতটাই এনপ্যাপুলেটেড ছাড়া আপনার ডিবাগারটি জানেন যে এটি বিদ্যমান। আমি অনুমান করছি আপনি ইচ্ছাকৃতভাবে এটি করেছিলেন কারণ আপনি আমাদের পক্ষপাতিত্ব করতে চান না। ভাগ্যক্রমে আমি কোন যত্ন নেই।

পার্শ্ব প্রতিক্রিয়া হওয়ার ঝুঁকি

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

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

পার্শ্ব প্রতিক্রিয়া উল্টো

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

কার্যকরী ব্যক্তিগত পদ্ধতির ক্ষতি The

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

শর্তসাপেক্ষে পোস্ট করুন

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

উপসংহার

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


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

2
এটি সত্যিই কোনও অর্থবোধ করে না। যদিও ওপি কার্যকরী দৃষ্টান্তে কোডটি লিখতে পারে (এবং এটি সাধারণত ভাল জিনিস হবে), এটি অবশ্যই প্রশ্নের প্রসঙ্গ নয়। ওপিকে বলার চেষ্টা করা হচ্ছে যে তারা দৃষ্টান্ত পরিবর্তন করে অবজেক্টের রাজ্য সংরক্ষণ করা এড়াতে পারে তা সত্যিই প্রাসঙ্গিক নয় ...
jpmc26

@ কেভিঙ্কলাইন ওপির উদাহরণটিতে কেবল একটি উদাহরণ পরিবর্তনশীল এবং 3 টি পদ্ধতি রয়েছে। মূলত, এটি ইতিমধ্যে একটি নতুন শ্রেণিতে উত্তোলন করা হয়েছে। উদাহরণটি কার্যকর কিছু করে না। আপনার ব্যক্তিগত সহায়ক পদ্ধতিগুলি একে অপরের সাথে কীভাবে যোগাযোগ করে তার সাথে শ্রেণীর আকারের কোনও সম্পর্ক নেই।
MagicWindow

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

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

1

প্রথম বৈকল্পিকটি আমার কাছে অ-স্বজ্ঞাত এবং সম্ভাব্য বিপজ্জনক বলে মনে হচ্ছে (যে কোনও কারণে কেউ আপনার ব্যক্তিগত পদ্ধতিটিকে জনসাধারণী করে তোলে তা কল্পনা করুন)।

আমি বরং পরিবর্তে শ্রেণি নির্মাণের উপর আপনার ভেরিয়েবলগুলি তাত্ক্ষণিকভাবে উপস্থাপন করব বা সেগুলি যুক্তি হিসাবে পাস করব pass পরেরটি আপনাকে কার্যকরী আইডিয়ামগুলি ব্যবহার করার এবং ধারণকৃত বস্তুর অবস্থার উপর নির্ভর না করার বিকল্প দেয়।


0

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

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

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


0

আসুন একটি উদাহরণ চেষ্টা করুন যা কিছু করে। আমাকে ক্ষমা করুন যেহেতু এটি জাভাস্ক্রিপ্ট জাভা নয়। পয়েন্টটি একই হওয়া উচিত।

পরিদর্শন https://blockly-games.appspot.com/pond-duck?lang=en , জাভাস্ক্রিপ্ট ট্যাব ক্লিক করুন, এবং এই আটকান:

hunt = lock(-90,1), 
heading = -135;

while(true) {
  hunt()  
  heading += 2
  swim(heading,30)
}

function lock(direction, width) {
  var dir = direction
  var wid = width
  var dis = 10000

  //hunt
  return function() {
    //randomize() //Calling this here makes the state of dir meaningless
    scanLock()
    adjustWid()
    if (isSpotted()) {
      if (inRange()) {
        if (wid <= 4) {
          cannon(dir, dis)
        }
      }
    } else {
      if (!left()) {
        right()
      }
    }
  }

  function scanLock() {
    dis = scan(dir, wid);
  }

  function adjustWid() {
    if (inRange()) {
      if (wid > 1)
        wid /= 2;
    } else {
      if (wid < 16) {
        wid *= 2; 
      }
    }
  }

  function isSpotted() {
    return dis < 1000;
  }

  function left() {
    dir += wid;
    scanLock();
    return isSpotted();
  }

  function right() {
    dir -= wid*2;
    scanLock();
    return isSpotted()
  }

  function inRange() {
    return dis < 70;
  }

  function randomize() {
    dir = Math.random() * 360
  }
}

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

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

অবশ্যই, এখন আমরা dirসুযোগের মধ্যে এখন নেমে যেতে পারব কিন্তু পাসিং এবং সেটিং সহ আমাদের সিউডো কোডের মতো কোডের জঞ্জাল না দিয়ে not

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

এটি তারা দুঃস্বপ্নের মতো স্প্যাগেটিতে পরিণত করতে পারে না তা বলার অপেক্ষা রাখে না। তবে কি পারছে না?

শুভ হাঁসের শিকার


1
অভ্যন্তরীণ / বাহ্যিক ফাংশনগুলি ওপি যা বর্ণনা করে তার থেকে আলাদা একটি দৃষ্টান্ত। - আমি একমত যে অভ্যন্তরীণ ফাংশনগুলিতে বাইরের ফাংশন থেকে বিতর্কিত স্থানীয় আর্গুমেন্টের মধ্যে স্থানীয় ভেরিয়েবলের মধ্যে বাণিজ্য বন্ধ করা ব্যক্তিগত ক্লাসের প্রাইভেট ভেরিয়েবলগুলির সাথে অনুরূপ ব্যক্তিগত ফাংশনগুলিতে পাস হওয়া আরগুমেন্টসকে অনুরূপ। তবে আপনি যদি এই তুলনাটি করেন তবে অবজেক্টের আজীবন ফাংশনের একক রানের সাথে মিল থাকবে, সুতরাং বাইরের ফাংশনে ভেরিয়েবলগুলি স্থির অবস্থার অংশ।
তাইমির

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

1
এটি অবিচল থাকলেও আপনি যখনই প্রতিবার অবজেক্টটি নিষ্পত্তি করবেন তখন আপনি এটিতে পদক্ষেপ নিচ্ছেন।
তাইমির

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

1
@ এসডেনহ্যাম আমি যুক্তি দিচ্ছি যে কোনও শ্রেণির গুণাবলী এবং একটি অপারেশনের মধ্যবর্তী ফলাফলের মধ্যে পার্থক্য রয়েছে। তারা সমতুল্য নয়। তবে একটি অন্যটিতে সঞ্চিত থাকতে পারে। এটি অবশ্যই হবে না। প্রশ্নটি হ'ল এটি কখনও হওয়া উচিত কিনা। হ্যাঁ শব্দার্থক এবং আজীবন সমস্যা আছে। আর্টির সমস্যাগুলিও রয়েছে। আপনি এগুলি যথেষ্ট গুরুত্বপূর্ণ বলে মনে করেন না। সেটা ঠিক আছে. তবে অবজেক্ট স্টেট ব্যতীত অন্য যে কোনও কিছুর জন্য ক্লাস স্তরটি ব্যবহার করা ভুল মডেলিংকে মডেলিংয়ের একটি উপায়ের জন্য জোর দিচ্ছে। আমি পেশাদার কোড বজায় রেখেছি যা এটি অন্যভাবে করেছে।
candied_orange
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.