ক্লাসে ক্ষেত্রগুলি ঘোষণা করা কি পিএইচপি-তে ক্ষতিকারক?


13

নিম্নলিখিত কোডটি বিবেচনা করুন, যেখানে আমি অতীতে কয়েকবার সত্যিকারের জন্য বাস্তবায়িত একটি জাগতিক প্রোগ্রামিং ত্রুটির কারণে সেটারটি ইচ্ছাকৃতভাবে ভাঙা হয়েছিল:

<?php

    class TestClass {

        private $testField;

        function setField($newVal) {
            $testField = $newVal;
            // deliberately broken; should be `$this->testField = $newVal`
        }

        function getField() {
            return $this->testField;
        }

    }

    $testInstance = new TestClass();
    $testInstance->setField("Hello world!");

    // Actually prints nothing; getField() returns null
    echo $testInstance->getField(); 

?>

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

পিএইচপি বিজ্ঞপ্তি: অপরিশোধিত সম্পত্তি: টেস্টক্লাস :: 13 টেস্টফিল্ড /var/www/test.php লাইনে 13

ঘোষণার সাথে, কোনও সতর্কতা নেই।

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

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

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


1
যুক্তিযুক্তভাবে দরকারী ? আপনি যে সুবিধাটি বলেছেন তা অত্যন্ত গুরুত্বপূর্ণ আমি সম্ভবত স্পষ্টভাবে কোডে কাজ করতে অস্বীকার করব যার স্পষ্ট সম্পত্তির কোনও ঘোষণা নেই।
মাইকেল 19

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

1
পিএইচপি ত্রুটি প্রতিবেদন (একটি নোটিশ স্তর) তৈরি করা হয়েছে যা আপনাকে প্রথমে ঘোষণা না দিয়ে কোনও ভেরিয়েবল ব্যবহার করে কিনা তা আপনাকে জানিয়ে দেবে।
ক্রাইওন হিংস্র

3
@ মার্ক অ্যামেরি আমি মনে করব যে কঠোর ইউনিট পরীক্ষা গ্রহণের জন্য সবচেয়ে গুরুত্বপূর্ণ জায়গাগুলির মধ্যে একটি ফ্র্যাটিক্যালিগ্রেড স্টার্টআপ হ'ল - যেহেতু আপনি সর্বদা কোড পরিবর্তন করেন, আপনি সম্ভবত সর্বদা এটি ভঙ্গ করছেন । কড়া পরীক্ষা এবং ফ্ল্যাট-আউট টিডিডি-র প্রকৃত উদ্দেশ্য এটিই। হ্যাঁ, আমি অনুমান করি যে আন্ডারস্কোরগুলি ব্যবহার করে আপনি ব্যক্তিগত স্টাফগুলি অ্যাক্সেস করছেন তা মনে রাখতে সহায়তা করতে পারে তবে আমার পক্ষে ভুল হওয়া থেকে আমাকে রক্ষা করতে নির্দিষ্ট কোডিং মান গ্রহণ করার ধারণাটি হতাশাব্যঞ্জক নয়। TRUE === $variableনিজেকে তুলনার পরিবর্তে ঘটনাক্রমে বরাদ্দ দেওয়া থেকে বিরত রাখার মতো কাজ ।
মাইকেল 19

1
@ মার্ক অ্যামেরি নোট করুন যে ভিজিবিলিটি কীওয়ার্ডগুলি স্বয়ংক্রিয় ডকুমেন্টেশন সরঞ্জামগুলি পার্স করেছে , সুতরাং তারা আপনাকে ম্যানুয়ালি দেবে এমন একটি মন্তব্যের চেয়ে আরও "ডকুমেন্টেশন মান" দেয়।
মাইকেল

উত্তর:


15

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

  • সংকলক ঘোষিত বৈশিষ্ট্যগুলি অনুকূল করতে পারে। যখন আপনি গতিশীলভাবে কোনও সম্পত্তি ঘোষণা করেন এটি একটি পারফরম্যান্স হিট কারণ সংকলকটিকে আপনার গতিশীল বৈশিষ্ট্যগুলি সংরক্ষণ করার জন্য একটি গতিশীল হ্যাশ টেবিল তৈরি করতে হবে।
  • আমি এটিতে 100% নই তবে আমি বিশ্বাস করি যে এপিসির মতো বাইটকোড অপ্টিমাইজারগুলি তেমন কার্যকর হবে না কারণ তাদের ক্লাসের পুরো ছবি থাকবে না। (এবং এপিসির মতো অপ্টিমাইজারগুলি অবশ্যই আবশ্যক )
  • আপনার কোডটি 1000x পড়া আরও শক্ত করে তোলে। মানুষ আপনাকে ঘৃণা করবে।
  • এটিকে 1000x আরও বেশি করে তোলে যে আপনি কোনও ভুল করবেন। (এটি getId বা getID ছিল? অপেক্ষা করুন, আপনি উভয় ব্যবহার করেছেন। ব্যর্থ।)
  • কোনও আইডিই স্বতঃপূরণ বা হিন্টিং টাইপ করে না।
  • ডকুমেন্টেশন জেনারেটর আপনার সম্পত্তি দেখতে পাবেন না।

আপনার শ্রেণীর সংজ্ঞায় আপনার সম্পত্তি ঘোষণা না করার সমস্যার সাথে তুলনা করার সময় আপনি যে সমস্যাটি বর্ণনা করেছেন তা আসলে একটি ছোটখাটো । এখানে একটি ভাল সমাধান।

আপনার সম্পত্তিগুলির জন্য খেলাপি ডিফল্ট ঘোষণা করতে অভ্যস্ত হন।

private $testField = null;
private $testField = '';
private $testField = 0;
private $testField = []; //array()
private $testField = false;

বস্তুগুলি সংরক্ষণ করা হবে এমন বৈশিষ্ট্য ব্যতীত, এটি আপনার সঞ্চিত বেশিরভাগ বেস প্রকারকে আবরণ করবে। বস্তুগুলি সংরক্ষণ করা হবে এমন বৈশিষ্ট্যগুলি আপনার নির্মাত্রে সেট করা যেতে পারে।

ক্লাস ডিজাইনের জন্য একটি ভাল নিয়ম হ'ল আপনার অবজেক্টটি তৈরি হওয়ার পরে এবং আপনার কনস্ট্রাক্টর চালানোর পরে আপনার কোনও সম্পত্তি "অপরিজ্ঞাত" থাকা উচিত নয়।


আপনার 5 টি ডাউনসাইডের প্রতিক্রিয়া: 1 (পারফরম্যান্স): আপনি কি এর জন্য কোনও উত্স পেয়েছেন? 2 (পঠনযোগ্যতা): আমি নিশ্চিত বুঝতে পারছি না; প্রস্তাবটি ছিল ঘোষণাপত্রের মন্তব্য করার জন্য, কেবল সেগুলি সরিয়ে দেওয়া নয়, তাহলে কী পাঠযোগ্যতা নষ্ট হবে? সামান্য কম বন্ধুত্বপূর্ণ সিনট্যাক্স হাইলাইট এবং প্রতিবেশী মন্তব্য থেকে পৃথক সম্ভাব্য অসুবিধা, আমার ধারণা? 3: এই আমি একদম বুঝতে পারি না; আপনি কি স্পষ্ট করতে পারেন? 4 (আইডিই): পর্যাপ্ত পরিমাণে - আমার কাছে কোনও আইডিই দিয়ে পিএইচপি কোড করার অভিজ্ঞতা নেই এবং একটিগ্রহের টাইপ ইঙ্গিত সম্পর্কে জানতাম না। 5 (ডক জেনারেটর): পর্যাপ্ত পরিমাণে - এর মধ্যে কখনও ব্যবহার করা হয়নি।
মার্ক আমেরিকা

আমি তাদের মন্তব্য করার বিষয়ে আপনার লাইনটি দেখতে পাইনি। নির্বিশেষে, উপরোক্ত বিষয়গুলি এখনও প্রয়োগ হয় - আপনি কীভাবে জানেন যে কোনটি সক্রিয় বা আইনত মন্তব্য করেছেন ??
জারোদ নেটটলেস

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

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

তুমি ঠিক হতে পারো. আমি আজ একটি বাগটি অনুসন্ধান করতে কয়েক ঘন্টা ব্যয় করেছি যা পুরোপুরি এই টাইপোর ফলে ঘটেছে এবং হঠাৎ করে বুঝতে পেরে হতাশ হয়ে পড়েছিলাম যে যদি আমি কেবল ক্ষেত্রের ঘোষণাগুলি না ব্যবহার করি তবে আমি একটি বিজ্ঞপ্তি পেয়েছি এবং আমার ত্রুটিটি কোথায় ছিল তা সঙ্গে সঙ্গেই জানা গেল (যা আমি সবসময় ভাবতাম যে এই পরিস্থিতিতে যে কোনওভাবেই ঘটবে; আমি ঘোষণাগুলি ক্ষেত্রটি শূন্য করতে শুরু করি না)। সেই অভিজ্ঞতার তাত্ক্ষণিক অ্যাক্সেসযোগ্যতা সম্ভবত আমার রায়কে এড়িয়ে চলেছে যে এটি পুনরুক্তি হওয়ার সম্ভাবনা, বা এর বিরুদ্ধে রক্ষা করার পক্ষে কতটা সার্থক।
মার্ক অ্যামেরি

2

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

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

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