এআরসি'র অধীনে সম্পত্তি: সর্বদা বা কেবল সর্বজনীন?


9

রবার্ট ম্যাকনালির দু'বছর আগে কিছুটা কম আগে "দ্য কোড কমান্ডমেন্টস: অবজেক্টিভ-সি কোডিংয়ের সেরা অনুশীলন" নামক একটি নিবন্ধ পড়ার পরে , আমি আমার উদ্দেশ্য-সি শ্রেণীর প্রতিটি ডেটা সদস্যের জন্য সম্পত্তি ব্যবহার করার অভ্যাসটি গ্রহণ করেছি ( ২০১২ সালের মে হিসাবে তৃতীয় আদেশটি)। ম্যাকনলি এগুলি করার জন্য এই কারণগুলি তালিকাভুক্ত করে (আমার জোর):

  1. বৈশিষ্ট্য অ্যাক্সেস বিধিনিষেধ প্রয়োগ করে (যেমন পঠনযোগ্য)
  2. বৈশিষ্ট্য মেমরি পরিচালনা নীতি প্রয়োগ করে (শক্তিশালী, দুর্বল)
  3. বৈশিষ্ট্যগুলি স্বচ্ছভাবে কাস্টম সেটার এবং গেটারগুলি বাস্তবায়নের সুযোগ সরবরাহ করে।
  4. কাস্টম সেটটার বা গেটরস সহ বৈশিষ্ট্যগুলি থ্রেড-সুরক্ষা কৌশল প্রয়োগ করতে ব্যবহার করা যেতে পারে।
  5. উদাহরণ ভেরিয়েবলগুলি অ্যাক্সেস করার একক উপায় থাকার ফলে কোডের পঠনযোগ্যতা বৃদ্ধি পায়।

আমি আমার বেশিরভাগ সম্পত্তি ব্যক্তিগত বিভাগগুলিতে রেখেছি, সুতরাং 1 এবং 4 নম্বরটি সাধারণত আমি ইস্যু করে না এমন বিষয় হয় না। 3 এবং 5 টি আর্গুমেন্টগুলি আরও 'নরম', এবং সঠিক সরঞ্জাম এবং অন্যান্য ধারাবাহিকতায় তারা অ-ইস্যুতে পরিণত হতে পারে। সুতরাং অবশেষে, আমার কাছে এই যুক্তিগুলির মধ্যে সবচেয়ে প্রভাবশালী ছিল 2 নম্বর, মেমরি পরিচালনা। আমি তখন থেকেই এটি করে আসছি।

@property (nonatomic, strong) id object; // Properties became my friends.

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

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

@implementation GTWeekViewController
{
    UILongPressGestureRecognizer *_pressRecognizer;
    GTPagingGestureRecognizer *_pagingRecognizer;
    UITapGestureRecognizer *_tapRecognizer;
}

একটি পরীক্ষা হিসাবে আমি এটি আরও কিছুটা কঠোরভাবে করে চলেছি, এবং সমস্ত কিছুর জন্য সম্পত্তি থেকে দূরে সরে যাওয়ার কিছু ভাল ইতিবাচক পার্শ্ব প্রতিক্রিয়া রয়েছে।

  1. ডেটা সদস্য কোড প্রয়োজনীয়তা ( @property/ @synthesize) সঙ্কুচিত হয়ে কেবল আইভার ঘোষণায়।
  2. আমার বেশিরভাগ self.somethingরেফারেন্স ঠিক পর্যন্ত পরিষ্কার করা হয়েছে _something
  3. কোন ডেটা সদস্যরা ব্যক্তিগত (আইভারস) এবং কোনগুলি সর্বজনীন (সম্পত্তি) তা সহজেই পার্থক্যযোগ্য।
  4. শেষ অবধি, এটি 'অনুভূত' এর চেয়ে বেশি এরকম কারণটি ছিল অ্যাপল যে উদ্দেশ্যে উদ্দেশ্যে করা সম্পত্তি ছিল, তবে এটি বিষয়গত অনুমান।

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

সম্পাদনা: ম্যাকনলি টুইটারে ওজন রেখে বলেছিলেন : "আমি মনে করি সম্পত্তিগুলির সাথে স্টিকিংয়ের মূল কারণটি হ'ল: সমস্ত কিছু করার একটি উপায়, যা সবকিছু করে (কেভিসি / কেভিও সহ।)"

উত্তর:


5

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

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

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

  2. foo.somethingসিনট্যাক্স তর্কসাপেক্ষে অনেক বেশী ভালো _something। সম্পত্তি অ্যাক্সেস সিনট্যাক্স অবশ্যই কাঠামোর সদস্যদের অ্যাক্সেসের জন্য সি এর ডট সিনট্যাক্সের মতো দেখতে এবং কাজ করার জন্য ডিজাইন করা হয়েছে। আপনি কোন অবজেক্টে অ্যাক্সেস করছেন সে সম্পর্কে স্পষ্ট হওয়া (সে সে selfবা অন্য কিছু হোক ) সহায়ক। (কিছু লোক - আমি নয়! self->somethingএই কারণে আইভার অ্যাক্সেসের পক্ষে ।) আইভারদের জন্য শীর্ষস্থানীয় আন্ডারস্কোর কনভেনশনটি ভাল, তবে এটি সমস্ত উদ্দেশ্য-সি কোড দ্বারা নিয়মিত ব্যবহার হয় না।

  3. একই শ্রেণীর অন্যান্য অবজেক্টগুলিতে (যা "ব্যক্তিগত" অ্যাক্সেসের অধীনে অনুমোদিত) এবং সাবক্লাসগুলির দ্বারা অ্যাক্সেসের জন্য (যেমন সি ++ এর "সুরক্ষিত") বৈশিষ্ট্যগুলি আরও ভাল পছন্দ বলে মনে হয় ties সুতরাং 'বৈশিষ্ট্যগুলি == সর্বজনীন' ধারণাটি কিছুটা ঝাপসা।

  4. আমার বোধগম্যতা হ'ল বৈশিষ্ট্যগুলি মেমরি পরিচালনা সহজ করার এবং কিছু অন্যান্য সুবিধা সরবরাহ করার উদ্দেশ্যে তৈরি হয়েছিল। আপনি যেমনটি বলেছেন, মেমরি পরিচালনার সুবিধা হ্রাস পাওয়ার সাথে সাথে সম্পত্তিগুলি কম জোরালো বলে মনে হচ্ছে।

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

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


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

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

-1

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


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