গণিত বৈশিষ্ট্য বনাম সুইফট ফাংশন


26

বলুন যে আমার একটি ক্লাস আছে নীচে Event:

class Event {
    private var attendees: [Person] = []

    // Case 1
    //*******
    // Should I use a func…
    func countOfAttendees() -> Int {
        return attendees.count
    }

    // …or a var
    var countOfAttendees: Int {
        return attendees.count
    }

    // Case 2
    //*******
    // Should I use a func…
    func countOfPaidAttendees() -> Int {
        return attendees.filter({$0.hasPaid}).count
    }

    // …or a var
    var countOfPaidAttendees: Int {
        return attendees.filter({$0.hasPaid}).count
    }
}

উপরে উল্লিখিত 2 টি ক্ষেত্রে ফাংশন বা গণিত বৈশিষ্ট্যগুলি ব্যবহার করা কি ভাল অনুশীলন ?


2
stackoverflow.com/questions/24035276/… ... সংক্ষেপে: 'আপনার ফাংশনগুলি ফাংশন হতে দিন এবং আপনার বৈশিষ্ট্যগুলি সম্পত্তি হতে দিন' '
রবার্ট হার্ভে

উত্তর:


14

ইউনিফর্ম অ্যাক্সেস নীতি অনুসরণ করুন ,

মডিউল দ্বারা প্রদত্ত সমস্ত পরিষেবাগুলি অভিন্ন স্বরলিপি দ্বারা উপলব্ধ হওয়া উচিত, যা সেগুলি স্টোরেজ বা গণনার মাধ্যমে প্রয়োগ করা হয়েছে তা বিশ্বাসঘাতকতা করে না does

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

এবং যদি আমি কোনও সঞ্চিত সম্পত্তিটিকে একটি গণিত হিসাবে পরিবর্তন করি তবে আমাকে এর শেষদিকে পেরেনস যুক্ত করতে হবে না এবং অ্যাপটিতে এটি যে কোনও জায়গায় ব্যবহৃত হয়েছে।


আমি মূলত @ অ্যান্টনের জটিলতার উত্তর নিয়ে গিয়েছিলাম, কিন্তু অনুশীলনে আমি বুঝতে পেরেছি যে এটিই আমি এটি… ডিফল্টরূপে সম্পত্তি করি।
অ্যাশলে মিলস

17

আমি বলব এটি গণনা বনাম ব্যবহারের ফ্রিকোয়েন্সি এর জটিলতার উপর নির্ভর করে।

  • যদি এটি O(1)/ হয় *, তবে গণিত সম্পত্তি ব্যবহার করুন।
  • যদি এটি O(N)+/ হয় rare-use, তবে ফাংশনটি ব্যবহার করুন।
  • যদি এটি O(N)+/ হয় frequent-use, ভবিষ্যতে জটিলতার জন্য ক্ষতিপূরণ দেওয়ার জন্য আপনি ক্যাচিং বা অন্যান্য "স্মার্ট" কৌশলগুলি ব্যবহার করার সিদ্ধান্ত নিতে পারেন কিনা তা ভাবুন, যদি "হ্যাঁ" হয় তবে সম্পত্তিটি ব্যবহার করুন, যদি "না-না-না, এটি কেবল ভারী" হয় তবে ফাংশনটি ব্যবহার করুন ।

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

9

আমি সম্প্রতি কোটলিন শিখতে শুরু করেছি এবং কখন গণনীয় বৈশিষ্ট্যগুলি ব্যবহার করতে হবে সে সম্পর্কে তাদের দুর্দান্ত দর্শন রয়েছে:

বৈশিষ্ট্য বনাম সম্পত্তি

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

অন্তর্নিহিত অ্যালগরিদম যখন একটি ফাংশন উপর একটি সম্পত্তি পছন্দ করুন:

  • নিক্ষেপ করে না
  • একটি O (1) জটিলতা রয়েছে
  • গণনা করা সস্তা (বা প্রথম রানেই ক্যাশেড)
  • অনুরোধের উপর একই ফল দেয়

- https://kotlinlang.org/docs/references/coding-conventions.html


'নিক্ষেপ করা হয় না' সুইফটের পক্ষেও গুরুত্বপূর্ণ কারণ সম্পত্তিগুলি নিক্ষেপ করতে পারে না (এখনও?)
আলেজানড্র্যাম্প

"একটি ও (1) জটিলতা" ডকুমেন্টেশন থেকে সরিয়েছে
মাহমুদ শাহউদ

7

সুইফটে, প্যারামিটার এবং গণিত বৈশিষ্ট্য ব্যতীত ফাংশনগুলির প্রায় একই ক্ষমতা থাকে (কোনও পার্থক্য হতে পারে যে প্যারামিটার ব্যতীত একটি ফাংশনটিও বন্ধ হয়ে যায়, যখন একটি গণিত সম্পত্তি হয় না)।

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

একটি বড় পার্থক্য: আপনি যদি ফাংশনটি বা গণনা করা সম্পত্তিটি দু'বার কল করেন তবে কি হবে? গণনা করা সম্পত্তির জন্য আমি আশা করি যে x = সম্পত্তি; y = সম্পত্তি x = সম্পত্তি হিসাবে ঠিক একই আচরণ করে; y = x বাদে এটি একটি সামান্য বিট গতিতে চলতে পারে। ফাংশনগুলির জন্য, আচরণটি আলাদা থাকলে আমি অবাক হব না।


4

ব্যবহার করুন countOfAttendeesএবং countOfPaidAttendees()


একটি গণিত ভেরিয়েবল হ'ল এটি যা প্রতিবার অ্যাক্সেস করার সময় গণনা করা মান দেয়। এটি একটি মান সংরক্ষণ করে না। অভ্যন্তরীণভাবে এটি একটি ফাংশন হিসাবে প্রয়োগ করা হয়।

একটি ফাংশন সঙ্গে পার্থক্য কি?

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

আপনার যখন একটি পরিবর্তনশীল ব্যবহার করা উচিত

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

কোনও ফাংশনের চেয়ে ভেরিয়েবল পছন্দ করার অপ্রাসঙ্গিক কারণ

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

সম্পদ

থেকে  WWDC 2014 - 204 কি কোকো এ নতুন  > 24:40 যখন একটি @property ব্যবহার করতে

যে কোনও কিছুর জন্য সম্পত্তি ব্যবহার করুন যা কোনও বস্তুর মূল্য বা স্থিতি বা অন্যান্য বস্তুর সাথে এর সম্পর্ক সম্পর্কিত। খারাপ প্রার্থীরা:

  • পদ্ধতিগুলি যেগুলি করে: লোড, পার্স, টগল,…। তাদের নামে ক্রিয়াপদ রয়েছে।
  • জেনারেটর: init, অনুলিপি, গণিত,…। এই পদ্ধতিগুলি আদর্শবান নয়।
  • রাষ্ট্র পরিবর্তন করে এমন পদ্ধতিগুলি: পরেরঅবজেক্ট।

এরিকা সাদুন  > গণিত সম্পত্তি বনাম পদ্ধতিগুলি দ্বারা সুইফ্ট স্টাইল থেকে From 

একটি সম্পত্তি একটি উদাহরণের অন্তর্নিহিত গুণকে প্রকাশ করে, যখন কোনও পদ্ধতি কোনও ক্রিয়া করে।

  • পদ্ধতিগুলির পরামিতি রয়েছে; বৈশিষ্ট্য না। পার্শ্ব প্রতিক্রিয়া সহ যে কোনও কলের জন্য পদ্ধতিগুলি পছন্দ করুন। যদি কোনও পদ্ধতি কিছু করে (উদাহরণস্বরূপ, এটি লোড, পার্স, টগলস বা প্রিন্ট করে) বা ক্রিয়াকলাপের নাম থাকে তবে এটি কোনও সম্পত্তি হওয়া উচিত নয়।
  • আপনি যে মানগুলি পেতে পারেন এবং / অথবা সেট করতে পারেন তার জন্য বৈশিষ্ট্যগুলি পছন্দ করুন।
  • বৈশিষ্ট্যগুলিতে কোনও প্রকারের উদাহরণের একটি অর্থপূর্ণ অন্তর্নিহিত গুণ প্রকাশ করা উচিত।
  • বৈশিষ্ট্যগুলি আপনাকে উইলসেট এবং ডিডসেটের মাধ্যমে পর্যবেক্ষক যুক্ত করতে দেয়। সঞ্চিত উদাহরণ বৈশিষ্ট্যের থেকে পৃথক, সঞ্চিত ধরণের বৈশিষ্ট্যগুলিকে সর্বদা একটি ডিফল্ট মান দেওয়া উচিত।

থেকে  Kotlin কোডিং নিয়মাবলী> ফাংশন বৈশিষ্ট্য বনামউপরে ড্যানিয়েলের উত্তর দেখুন ।

প্রাসঙ্গিক তথ্য ছাড়া অন্য সংস্থানসমূহ:


3

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

এই প্রসঙ্গে গণিত মান নির্ধারণের চেষ্টা করার কোনও অর্থ হবে না (এবং ভাগ্যক্রমে আইডিই আমাদের এড়াতে সহায়তা করে) তবে আমি যদি এমন কিছু নির্ধারিত করার চেষ্টা করি যা মান হিসাবে দেখায় তবে?

event.countOfAttendees = 0; // not possible

ফানক ব্যবহার করার সময় ফোনকারী জানেন যে আপনি সরাসরি কোনও মূল্য নিয়ে কাজ করছেন না:

event.countOfAttendees()

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

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