এই দুটি কোডের মধ্যে কোনটি 'ভাল'? স্থানীয় পরিবর্তনশীল বা শ্রেণি ভেরিয়েবল বানানো?


11

আমি আরও গেম তৈরি করছি এবং আরও বোকা প্রশ্ন জিজ্ঞাসা করছি।

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

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

এখানে আমি যে বোঝাতে চাইছিলাম তা এখানে:

public class Player : MonoBehaviour {

private void FixedUpdate()
{
    Rigidbody rb = GetComponent<Rigidbody>();

    float v = Input.GetAxis("Vertical");

    rb.AddForce(v * rb.transform.forward * Const.walkForce);
}
}

বা ...

public class Player : MonoBehaviour {
Rigidbody rb;

private void Awake()
{
    rb = GetComponent<Rigidbody>();
}

private void FixedUpdate()
{
    float v = Input.GetAxis("Vertical");

    rb.AddForce(v * rb.transform.forward * Const.walkForce);
}
}

4
কোড রিভিউ এসই এর জন্য এটি আরও প্রশ্নের মতো মনে হচ্ছে।
অরফেভস

1
আপনি ভাসা ভাস শ্রেণীর সম্পত্তিও তৈরি করতে পারেন।
চাদ

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

কোডের স্নিপেট 'কোড' নয়। 'কোন কোডটি ভাল' 'সম্পর্কে জিজ্ঞাসা করা আপনাকে শৌখিন্যের মতো দেখায়।
মাইলস রাউট

1
আমি একজন অপেশাদার তাই মাইকে ধন্যবাদ মাইলস
বিগ টি ​​লেরিটি

উত্তর:


25

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

এটি কারণ একটি সংকীর্ণ স্কোপ কোডের সেই জায়গাগুলির সংখ্যা হ্রাস করে যেখানে আপনাকে সেই ডেটা সম্পর্কে তর্ক করতে হবে, এবং এইভাবে আপনি এটি সম্পর্কে ভুলভাবে যুক্তিযুক্ত কারণগুলির সংখ্যা হ্রাস করতে পারেন (যা বাগগুলি বাড়ে)।

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

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

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

সুতরাং, সংক্ষেপে বলা যায়: সাধারণভাবে, জিনিসগুলিকে যতটা সম্ভব স্থানীয় করে তোলার ক্ষেত্রে ডিফল্ট, তবে এই ক্ষেত্রে সম্ভবত rbকোনও সদস্য তৈরি করা যুক্তিসঙ্গত হয় যাতে আপনি একবারে একবার অনুসন্ধান সম্পাদন করতে পারেন Awakeএবং প্রতিটি কলই তা করা থেকে বিরত থাকতে পারেন FixedUpdate


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

1
@SuperMegaBroBro GetComponent হয় বেশ দ্রুত - আপনি হার্ড লুকআপ তুলনীয় গতি আছে কোন ধরনের উপার্জন চাপা থাকতে চাই। যদি আপনার পারফরম্যান্স ডেটা না থাকে যা এটির প্রস্তাব দেয় তবে এটি "জিনিসগুলিকে স্থানীয় রাখুন" পদ্ধতির সাথে আঁকুন। আপনি পরে সর্বদা এটি অপ্টিমাইজ করতে পারেন। উত্তরগুলি দেখুন unityউইনটি.কিউশনস / ১৮৫১64//২ ভুলে যাবেন না যে ক্যাচিংও বিনামূল্যে নয় - আপনি যদি GetComponentআপনার গেমের প্রতিটি একক ক্যাচ করেন তবে এটি সম্ভবত নেট ক্ষতি হবে। পরিমাপ করা. অপ্টিমাইজেশানগুলি এটির জন্য উপযুক্ত কিনা তা চিহ্নিত করুন। দুর্দান্ত গেমটি তৈরিতে ফোকাস করুন :)
লুয়ান

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

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

2

জোশ পেট্রির উত্তর খুব ভাল - এখানে পরিপূরক দৃষ্টিভঙ্গি রয়েছে।

আপনি যদি এমন কোড দিয়ে কাজ করেন যা আপনি ডোমেনটি মোটামুটি ভালভাবে বুঝতে পেরেছেন তবে আপনি ভেরিয়েবলগুলি যেভাবে বোঝায় তা স্কোপ করতে পারেন।

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

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

তাই সব সব,

  1. আপনি যদি আপনার ঘোষণার স্থান নির্ধারণে আত্মবিশ্বাসী হন তবে এটি যেখানে তা বোঝায় তা এটিকে স্কোপ করুন।

  2. আপনি যদি আত্মবিশ্বাসী না হন তবে স্থানীয় শুরু করুন এবং কোডের পুনঃব্যবহারের শোধ পেলে রিফ্যাক্টরটি নিশ্চিত করুন।

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


2
এছাড়াও প্রাকৃতিকভাবে অর্ডার করা জিনিসগুলি যেমন অ্যাপ্লিকেশনটিতে এটি সম্পর্কিত হয় তবে প্রত্যেকেরই Personসদস্য থাকা উচিত , কোডটি আরও ভালভাবে বুঝতে আরও প্রায়ই অন্যান্য বিকাশকারীকে ( আপনি 6 মাস পরে বেশিরভাগ বার ) সহায়তা করেন। এই ক্ষেত্রে, আপনার সদস্য হিসাবে সদস্য হওয়া যুক্তিযুক্ত বলে মনে হয় এবং আমি আরও বলি, এমনকি যদি এটি আরও খারাপ পারফরম্যান্স বোঝায়। ভিডিও-গেমস একটি প্রাসঙ্গিক বিন্দু বিবেচনা করা হয়, কিন্তু আমি মনে করি কোডে , পরিষ্কার করা প্রায়ই আরো গুরুত্বপূর্ণhand RigidbodyPlayer
alseether

1
ভাল উত্তর ধন্যবাদ বলছি। আমি সকলের মতো শোনার চেষ্টা করছি না, তবে টিবিএইচ উত্তরগুলি ইতিমধ্যে আমি যা ভাবছিলাম তা পুনরায় নিশ্চিত করে দিয়েছি, তাই একবারের জন্য আমি খুব খুশি এবং আমার গেমগুলিতে কিছুটা সুন্দর অগ্রগতি অর্জন করছি। এই মুহুর্তে আমি যথাযথ অ্যানিমেশন এবং সমস্ত কিছু দিয়ে 3 ডি ফুটবল গেমটি তৈরি করছি, সত্যিকারের অগ্রগতি অর্জন করছি: ডি শীঘ্রই আমি কীভাবে এটি 2 খেলোয়াড় বানাতে পারি এবং অনলাইনে মাল্টপ্লেয়ার বলতে সাহস করব: ডি মজাদার লোকেরা এবং আবার ধন্যবাদ!
বিগ টি ​​ল্যারিটি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.