কোন কারণে আপনি সুইফটে প্রতিটি প্রতিনিধিটির জন্য একটি পৃথক শ্রেণির এক্সটেনশন ব্যবহার করবেন?


13

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

শ্রেণিবদ্ধকরণের ভিতরে ডেলিগেট কলব্যাকগুলি:

extension LogsViewController : UIPopoverPresentationControllerDelegate {
    func adaptivePresentationStyleForPresentationController(controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle {
        ...
    }
}

এটি শ্রেণীর মধ্যে অন্তর্ভুক্ত থাকার বিপরীতে:

শ্রেণীর ভিতরে প্রতিনিধি কলব্যাকগুলি:

class LogsViewController : UITableViewController, UIPopoverPresentationControllerDelegate {
    func adaptivePresentationStyleForPresentationController(controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle {
        ...
    }
}

আমি একই সময়ে এটি আশ্চর্যজনক এবং আকর্ষণীয় পেয়েছি। "লগসভিউকন্ট্রোলার এক্সটেনশন.সুইফ্ট" নামে লগসভিউ কনট্রোলার শ্রেণিতে কেবল এক্সটেনশনের জন্য তাঁর উত্সর্গীকৃত একটি ফাইল রয়েছে এবং প্রতিটি প্রতিনিধি প্রোটোকলের জন্য আলাদা এক্সটেনশন রয়েছে: ইউআইটিবেলভিউ ডেটাসোর্স, ইউআইএসপ্লিটভিউডেলিগেট ইত্যাদি ie

একাধিক শ্রেণীর এক্সটেনশন প্রতিটি ডাব্লু / ডেলিগেট কলব্যাকের নিজস্ব ফাইলের মধ্যে:

extension LogsViewController: UISplitViewControllerDelegate {
    ... callbacks
}

extension LogsViewController : UIPopoverPresentationControllerDelegate {
    ... callbacks
}

কেন?

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


1
আপনি এর মতো প্রচুর কাঠামো লিখতে পারেন যা মৌলিকভাবে ওও নীতিগুলি দ্বারা সমর্থিত তবে তবুও অতিরিক্ত বিবেচনার জন্য দোষী।
রবার্ট হার্ভে 21

1
@ রবার্টহারভে সত্য, তবে আপনি কি বোঝাতে চাইছেন যে আমি যে উদাহরণ কোডটি এখানে দেখিয়েছি তা অত্যধিক মাত্রায় কাজ করার একটি রূপ? আইওএস বিকাশে ডেলিগেশন একটি সাধারণ প্যাটার্ন। এছাড়াও, আপনি ক্লাস এক্সটেনশনগুলি ব্যবহার করেন বা এর মধ্যে কোডটি পরিবর্তন না করেন, তাই এটি পুনরায় (/ ওভার) -এনজিরিয়ারিংয়ের পরিবর্তে কোড পুনর্গঠনের মতো হবে
মোরবিধাক

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

উত্তর:


15

আমি জানি না আপনি কেন বলেছেন এটি কেন্দ্রীভূতির স্তরকে যুক্ত করে। Youতিহ্যবাহী অর্থের চেয়ে আপনি আলাদা কিছু বোঝাতে পারেন, কারণ এটি করে কোনও অতিরিক্ত নির্দেশনা তৈরি হয় না। তবে কেন করবেন?

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

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

এবং যে কোনও হারে, লোকেরা প্রায়শই ফ্যাট ভিউ কন্ট্রোলারদের সম্পর্কে অভিযোগ করে এবং এইভাবে কোনও ভিউ কন্ট্রোলারকে ভেঙে ফেলা হয় এটি দৃশ্যকে নিয়ামককে আরও পাতলা করে না, এমনকি এটি আরও সুসংহত রাখতে সহায়তা করে।


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

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

2

ড্যানিয়েল যেমন ইন্ডিয়ারেশনের বিষয়ে বলেছিলেন, এর কোনও স্তর নেই।
আমি তাকে সম্মত করি এবং আমি প্রোটোকল এক্সটেনশনের অতিরিক্ত শক্তিশালী বৈশিষ্ট্য যুক্ত করতে চাই যা আমি সম্প্রতি জানতাম।

বলুন যে আপনার কাছে didCopyTextউদাহরণস্বরূপ একটি প্রোটোকল রয়েছে । আপনি এটি প্রয়োগ করবেন:

protocol didCopyText {
  var charachtersCount: Int {get}
  func addToClipboardWith(text: String)
}

প্রোটোকল ঘোষণায় সুইফটে, বৈশিষ্ট্য এবং পদ্ধতিগুলি প্রয়োগ করা হয় না, আপনি প্রতিটি শ্রেণীর didCopyTextপ্রয়োগগুলি একই রূপায়ণে এই প্রোটোকলটির সাথে সঙ্গতিপূর্ণ বর্ধিত সংখ্যার সাথে লিখতে চান , এটি কেবল অগোছালো হয়ে শেষ হবে পুনরাবৃত্তি কোড। প্রোটোকল এক্সটেনশানগুলি এখানে আসে।

protocol didCopyText {
var charachtersCount: Int {
    get {
     // implementation
    }
}
func addToClipboardWith(text: String) {
      // implementation
 }
}

প্রোটোকলের বৈশিষ্ট্য ও পদ্ধতি বাস্তবায়নের সাথে। এখন, যে কোনও শ্রেণি এই প্রোটোকলটিতে সম্মতি জানায়, একই বাস্তবায়ন ব্যবহার করবে।


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

1

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

তবে, আপনি যদি প্রতিটি প্রোটোকলের জন্য একটি এক্সটেনশান যুক্ত করেন এবং প্রতিটি এক্সটেনশনে আপনি সেই এক প্রোটোকলের জন্য প্রয়োজনীয় ফাংশনগুলি বাস্তবায়ন করেন যা আপনার কোডটিকে অনেক বেশি পাঠযোগ্য করে তোলে।

যদি এই এক্সটেনশনগুলি সত্যই বড় না হয় তবে আমি সম্ভবত তাদের আলাদা আলাদা ফাইলে রাখব না।

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