I want to understand basic, abstract and correct architectural approach for networking applications in iOS: কোনও অ্যাপ্লিকেশন আর্কিটেকচার তৈরির জন্য কোনও "সেরা", বা "সবচেয়ে সঠিক" পন্থা নেই। এটি একটি খুব সৃজনশীল কাজ। আপনার সর্বদা সবচেয়ে সহজ এবং প্রসারিত আর্কিটেকচারটি বেছে নেওয়া উচিত, যা কোনও বিকাশকারী, যারা আপনার প্রকল্পে বা আপনার দলের অন্য বিকাশকারীদের জন্য কাজ শুরু করে তাদের পক্ষে পরিষ্কার হবে, তবে আমি সম্মত হই যে, "ভাল" এবং "খারাপ" হতে পারে "আর্কিটেকচার।
আপনি বলেছেন: গেটওয়ে , লেয়ার সুপারটাইপ , বিশেষ কেস ,collect the most interesting approaches from experienced iOS developers :, আমার ধারণাটি আমার কাছে সবচেয়ে আকর্ষণীয় বা সঠিক নয় বলে মনে হয় না তবে আমি এটি বেশ কয়েকটি প্রকল্পে ব্যবহার করেছি এবং এতে সন্তুষ্ট। এটি আপনি উপরে উল্লিখিতগুলির একটি হাইব্রিড পদ্ধতি এবং আমার নিজের গবেষণামূলক প্রচেষ্টার উন্নতিও রয়েছে। বিল্ডিং পদ্ধতির সমস্যাগুলির মধ্যে আমি আকর্ষণীয়, যা বেশ কয়েকটি সুপরিচিত নিদর্শন এবং প্রতিমাগুলির সমন্বয় করে। আমি মনে করি ফাউলারের প্রচুর এন্টারপ্রাইজ নিদর্শনগুলি মোবাইল অ্যাপ্লিকেশনগুলিতে সফলভাবে প্রয়োগ করা যেতে পারে। এখানে সর্বাধিক আকর্ষণীয়গুলির একটি তালিকা রয়েছে, যা আমরা কোনও আইওএস অ্যাপ্লিকেশন আর্কিটেকচার তৈরি করার জন্য আবেদন করতে পারি ( আমার মতে ): পরিষেবা স্তর , কাজের ইউনিট , রিমোট ফ্যাসাদ , ডেটা ট্রান্সফার অবজেক্ট , ডোমেন মডেল । আপনার সর্বদা সঠিকভাবে একটি মডেল স্তর ডিজাইন করা উচিত এবং অধ্যবসায়ের বিষয়ে সর্বদা ভুলবেন না (এটি আপনার অ্যাপের কার্যকারিতা উল্লেখযোগ্যভাবে বাড়িয়ে তুলতে পারে)। আপনি Core Dataএই জন্য ব্যবহার করতে পারেন । তবে আপনাকে ভুলে যাওয়া উচিত নয় , এটি Core Dataকোনও ওআরএম বা একটি ডাটাবেস নয়, তবে এটির একটি ভাল বিকল্প হিসাবে অধ্যবসায়ের সাথে একটি অবজেক্ট গ্রাফ ম্যানেজার। সুতরাং, খুব প্রায়ই Core Dataআপনার প্রয়োজনের জন্য খুবই ভারী হতে পারে এবং আপনি এই ধরনের নতুন সমাধান তাকান পারেন অধিরাজ্য ও Couchbase লাইট , অথবা আপনার নিজের লাইটওয়েট বস্তুর ম্যাপিং / অধ্যবসায় স্তর, বিল্ড কাঁচা SQLite বা উপর ভিত্তি করে LevelDB। এছাড়াও আমি আপনাকে ডোমেন চালিত ডিজাইন এবং সিকিউআরএসের সাথে নিজেকে পরিচিত করার পরামর্শ দিচ্ছি ।
প্রথমে, আমি মনে করি, নেটওয়ার্কিংয়ের জন্য আমাদের আরও একটি স্তর তৈরি করা উচিত , কারণ আমরা ফ্যাট কন্ট্রোলার বা ভারী, অভিভূত মডেলগুলি চাই না। আমি সেগুলিতে বিশ্বাস করি নাfat model, skinny controller জিনিসগুলিতে । কিন্তু আমি বিশ্বাস করি যে skinny everything, পদ্ধতি কারণ বর্গ চর্বি হওয়া উচিত, কি কখনো। সমস্ত নেটওয়ার্কিংকে সাধারণত ব্যবসায় যুক্তি হিসাবে বিমূর্ত করা যায়, ফলস্বরূপ আমাদের আরও একটি স্তর থাকা উচিত, যেখানে আমরা এটি রাখতে পারি। পরিষেবা স্তর যা আমাদের প্রয়োজন:
It encapsulates the application's business logic, controlling transactions
and coordinating responses in the implementation of its operations.
আমাদের MVCরাজ্যে Service Layerডোমেন মডেল এবং নিয়ন্ত্রণকারীদের মধ্যে মধ্যস্থতার মতো কিছু is এই পদ্ধতির এমভিসিএস নামে একটি পরিবর্তনের অনুরূপ প্রকরণ রয়েছে যেখানে এStore আসলে আমাদের Serviceস্তর রয়েছে। Storeমডেল দৃষ্টান্ত এবং হ্যান্ডলগুলি নেটওয়ার্কিং, ক্যাশে ইত্যাদি আমি যে আপনি উল্লেখ করতে চান vends করা উচিত নয় আপনার সেবা স্তর সব আপনার নেটওয়ার্কিং এবং ব্যবসা লজিক লিখুন। এটি একটি খারাপ নকশা হিসাবে বিবেচনা করা যেতে পারে। অ্যানিমিক এবং ধনী ডোমেন মডেলগুলি আরও তথ্যের জন্য দেখুন । কিছু পরিষেবা পদ্ধতি এবং ব্যবসায়িক যুক্তি মডেলটিতে পরিচালনা করা যায়, সুতরাং এটি "ধনী" (আচরণ সহ) মডেল হবে।
আমি সর্বদা দুটি গ্রন্থাগার ব্যবহার করি: এএফ নেটওয়ার্কিং ২.০ এবং রিঅ্যাকটিভ কোকোয়া । আমি মনে করি যে এটি কোনও আধুনিক অ্যাপ্লিকেশনটির জন্য অবশ্যই আবশ্যক যা নেটওয়ার্ক এবং ওয়েব-পরিষেবাগুলির সাথে যোগাযোগ করে বা জটিল ইউআই যুক্তিযুক্ত।
স্থাপত্য
প্রথমে আমি একটি সাধারণ APIClientশ্রেণি তৈরি করি , এটি এএফএইচটিটিপিএসসেশন ম্যানেজারের একটি সাবক্লাস । এটি অ্যাপ্লিকেশনটির সমস্ত নেটওয়ার্কিংয়ের একটি ওয়ার্কহর্স: সমস্ত পরিষেবা শ্রেণিগুলিতে এটিতে সত্যিকারের REST অনুরোধগুলি প্রেরণ করা হয়। এটিতে এইচটিটিপি ক্লায়েন্টের সমস্ত কাস্টমাইজেশন রয়েছে যা আমার বিশেষ অ্যাপ্লিকেশনটিতে প্রয়োজন: এসএসএল পিনিং, ত্রুটি প্রক্রিয়াকরণ এবং NSErrorবিশদ ব্যর্থতার কারণ এবং সমস্তটির বিবরণ সহ সরল বস্তু তৈরি করাAPI সাথে এবং সংযোগ ত্রুটির (যেমন ক্ষেত্রে নিয়ামক সঠিক বার্তা প্রদর্শন করতে সক্ষম হবেন) ব্যবহারকারী), অনুরোধ এবং প্রতিক্রিয়া সিরিয়ালাইজার, HTTP শিরোনাম এবং অন্যান্য নেটওয়ার্ক-সম্পর্কিত স্টাফ সেট করে। তারপর আমি কথাটি subservices বা সঠিকভাবে সব API অনুরোধে ভাগ, microservices : UserSerivces, CommonServices, SecurityServices,FriendsServicesএবং তাই, সেই অনুসারে তারা ব্যবসায়িক যুক্তি প্রয়োগ করে। এই মাইক্রোসার্ভেসগুলির প্রতিটি পৃথক শ্রেণি। তারা, একসাথে, একটি গঠন Service Layer। এই ক্লাসগুলিতে প্রতিটি এপিআই অনুরোধের জন্য পদ্ধতি থাকে, ডোমেন মডেলগুলি প্রসেস করে এবং সর্বদা RACSignalপার্স করা প্রতিক্রিয়া মডেল বা NSErrorকলারকে একটি ফেরত দেয়।
আমি উল্লেখ করতে চাই যে আপনার যদি জটিল মডেল সিরিয়ালাইজেশন যুক্তি থাকে - তবে এর জন্য আরও একটি স্তর তৈরি করুন: ডেটা ম্যাপারের মতো কিছু তবে সাধারণ যেমন জেএসএন / এক্সএমএল -> মডেল ম্যাপার। যদি আপনার ক্যাশে থাকে: তবে এটিকে একটি পৃথক স্তর / পরিষেবা হিসাবে তৈরি করুন (আপনার ব্যবসায়ের যুক্তি কেচিংয়ের সাথে মিশ্রিত করা উচিত নয়)। কেন? কারণ সঠিক ক্যাচিং স্তরটি তার নিজস্ব গটছগুলির সাথে বেশ জটিল হতে পারে। বৈধ, অনুমানযোগ্য ক্যাচিং যেমন লোকেদের উপর ভিত্তি করে অনুমানগুলি সহ এককভাবে ক্যাচিং পেতে লোকে জটিল যুক্তি প্রয়োগ করে। আপনি আরও বুঝতে কার্লোস নামক এই সুন্দর লাইব্রেরি সম্পর্কে পড়তে পারেন । এবং ভুলে যাবেন না যে কোর ডেটা আপনাকে সমস্ত ক্যাশে সম্পর্কিত সমস্যাটিতে সত্যই সহায়তা করতে পারে এবং আপনাকে কম যুক্তি লেখার অনুমতি দেবে। এছাড়াও, যদি আপনার কাছে NSManagedObjectContextসার্ভারের অনুরোধগুলির মডেলগুলির মধ্যে কিছু যুক্তি থাকে তবে আপনি ব্যবহার করতে পারেনসংগ্রহস্থল প্যাটার্ন, যা যুক্তিকে পৃথক করে যা ডেটাটি পুনরুদ্ধার করে এবং মডেলটিতে কাজ করে এমন ব্যবসায়িক যুক্তি থেকে সত্তা মডেলটিতে এটি ম্যাপ করে। সুতরাং, আপনার কাছে কোর ডেটা ভিত্তিক আর্কিটেকচার থাকার পরেও রেপোজিটরি প্যাটার্নটি ব্যবহার করার পরামর্শ দিচ্ছি। সংগ্রহস্থলের প্রয়োগ করতে পারেন বিমূর্ত জিনিস, মত NSFetchRequest, NSEntityDescription, NSPredicateএবং তাই মত প্লেইন পদ্ধতি উপর getবা put।
পরিষেবা স্তরটিতে এই সমস্ত ক্রিয়াকলাপের পরে, কলার (ভিউ কন্ট্রোলার) প্রতিক্রিয়া সহ কিছু জটিল অ্যাসিনক্রোনাস স্টাফ করতে পারে: আদিমদের সহায়তায় সিগন্যাল ম্যানিপুলেশনস, চেইনিং, ম্যাপিং ইত্যাদি ReactiveCocoa, বা কেবল এটিতে সাবস্ক্রাইব করুন এবং ফলাফলটিতে ফলাফল দেখান । আমি উদ্বুদ্ধ নির্ভরতা ইনজেকশন এই সব সেবা শ্রেণীর আমার মধ্যে APIClient, যা সংশ্লিষ্ট মধ্যে একটি বিশেষ সেবা কল অনুবাদ করবে GET, POST, PUT, DELETE, ইত্যাদি বিশ্রাম শেষবিন্দু করার অনুরোধ। এই ক্ষেত্রে APIClientসব কন্ট্রোলার পরোক্ষভাবে পাস করা হয়েছে, আপনি এই একটি ওভার parametrised সঙ্গে স্পষ্ট করে তুলতে পারে APIClientসেবা ক্লাস। আপনি যদি বিভিন্ন কাস্টমাইজেশন ব্যবহার করতে চান তবে এটি অর্থবোধ করতে পারেAPIClientনির্দিষ্ট পরিষেবা ক্লাসের জন্য, তবে আপনি যদি কিছু কারণে অতিরিক্ত অনুলিপি চান না বা আপনি নিশ্চিত হন যে আপনি সর্বদা একটি নির্দিষ্ট উদাহরণ (স্বনির্ধারণ ব্যতীত) ব্যবহার করবেন APIClient- এটি একটি সিঙ্গলটন করুন, তবে করবেন না, দয়া করে না 'টি সিলেটন হিসাবে পরিষেবা ক্লাস তৈরি করে।
তারপরে ডিআই সহ প্রতিটি ভিউ কন্ট্রোলার তার প্রয়োজন মতো পরিষেবা শ্রেণিকে ইনজেকশন দেয়, উপযুক্ত পরিষেবা পদ্ধতিগুলিকে কল করে এবং ইউআই যুক্তির সাথে তাদের ফলাফলগুলি রচনা করে। নির্ভরতা ইনজেকশনের জন্য আমি ব্লাডম্যাগিক বা আরও শক্তিশালী ফ্রেমওয়ার্ক টাইফুন ব্যবহার করতে চাই । আমি কখনও সিলেটলেটস, গড APIManagerWhateverক্লাস বা অন্যান্য ভুল জিনিস ব্যবহার করি না । কারণ আপনি যদি আপনার ক্লাসকে কল করেন তবে WhateverManagerএটির উদ্দেশ্যটি আপনি জানেন না তার থেকে এটি ইঙ্গিত করে এবং এটি একটি খারাপ ডিজাইনের পছন্দ । সিঙ্গলেটগুলিও একটি বিরোধী-প্যাটার্ন এবং বেশিরভাগ ক্ষেত্রে (বিরল ব্যতীত) একটি ভুল সমাধান। নিম্নলিখিত একক তিনটি মানদণ্ড সন্তুষ্ট হলেই সিঙ্গলটন বিবেচনা করা উচিত:
- একক উদাহরণের মালিকানা যথাযথভাবে অর্পণ করা যায় না;
- অলস সূচনাটি কাম্য;
- বৈশ্বিক অ্যাক্সেস অন্যথায় সরবরাহ করা হয় না।
আমাদের ক্ষেত্রে একক উদাহরণের মালিকানা কোনও সমস্যা নয় এবং আমরা আমাদের গড ম্যানেজারকে পরিষেবাগুলিতে বিভক্ত করার পরে আমাদের বিশ্বব্যাপী অ্যাক্সেসের দরকারও নেই, কারণ এখন কেবলমাত্র এক বা একাধিক নিবেদিত নিয়ামকদের একটি নির্দিষ্ট পরিষেবা প্রয়োজন (যেমন UserProfileনিয়ন্ত্রণকারী প্রয়োজন)UserServices এবং তাই) ।
আমাদের সর্বদা SOLID এS নীতির প্রতি শ্রদ্ধা করা উচিত এবং উদ্বেগের বিভাজন ব্যবহার করা উচিত , সুতরাং আপনার সমস্ত পরিষেবা পদ্ধতি এবং নেটওয়ার্ক কলগুলি একটি শ্রেণিতে রাখবেন না, কারণ এটি পাগল, বিশেষত যদি আপনি একটি বৃহত এন্টারপ্রাইজ অ্যাপ্লিকেশন বিকাশ করেন। এজন্য আমাদের নির্ভরতা ইনজেকশন এবং পরিষেবাগুলির পদ্ধতির বিষয়টি বিবেচনা করা উচিত। আমি এই পদ্ধতিকে আধুনিক এবং পোস্ট-ওও হিসাবে বিবেচনা করি । এই ক্ষেত্রে আমরা আমাদের অ্যাপ্লিকেশনটিকে দুটি ভাগে বিভক্ত করেছি: নিয়ন্ত্রণ যুক্তি (নিয়ন্ত্রণকারী এবং ইভেন্ট) এবং পরামিতিগুলি।
এক ধরণের পরামিতি সাধারণ "ডেটা" পরামিতি হবে। এটিই আমরা ফাংশনগুলির চারপাশে পাস, হেরফের, সংশোধন, অবিরাম থাকা ইত্যাদি These এগুলি সত্তা, সমষ্টি, সংগ্রহ, কেস ক্লাস। অন্য ধরণের হবে "পরিষেবা" পরামিতি। এগুলি এমন ক্লাস যা ব্যবসায় যুক্তিকে আবদ্ধ করে, বাহ্যিক সিস্টেমের সাথে যোগাযোগের অনুমতি দেয়, ডেটা অ্যাক্সেস সরবরাহ করে।
উদাহরণস্বরূপ এখানে আমার স্থাপত্যের একটি সাধারণ কর্মপ্রবাহ রয়েছে। ধরা যাক আমাদের একটি আছে FriendsViewControllerযা ব্যবহারকারীর বন্ধুদের তালিকা প্রদর্শন করে এবং আমাদের বন্ধুদের থেকে অপসারণের বিকল্প রয়েছে have আমি আমার FriendsServicesক্লাসে একটি পদ্ধতি তৈরি করি যার নাম:
- (RACSignal *)removeFriend:(Friend * const)friend
Friendকোনও মডেল / ডোমেন অবজেক্টটি কোথায় (বা Userতাদের যদি একই বৈশিষ্ট্য থাকে তবে এটি কেবল একটি বস্তু হতে পারে )। Underhood এই পদ্ধতি পার্স Friendথেকে NSDictionaryতাদেরকে JSON প্যারামিটার friend_id, name, surname, friend_request_idইত্যাদি। আমি সর্বদা এই ধরণের বয়লারপ্লেটের জন্য এবং আমার মডেল স্তরের (পিছনে এবং পিছনে পার্সিং, জেএসএন-তে নেস্টেড অবজেক্ট হায়ারারচি পরিচালনা করে এবং অন্যান্য) জন্য মেন্টল লাইব্রেরিটি সর্বদা ব্যবহার করি । পার্স পরে কল APIClient DELETEপ্রকৃত বিশ্রাম অনুরোধ এবং আয় করতে পদ্ধতি Responseমধ্যে RACSignalকলারের কাছে (FriendsViewController আমাদের ক্ষেত্রে) ব্যবহারকারী বা যাই হোক না কেন জন্য উপযুক্ত বার্তা প্রদর্শন করে।
আমাদের অ্যাপ্লিকেশনটি যদি খুব বড় একটি হয় তবে আমাদের যুক্তি আরও স্পষ্ট করে আলাদা করতে হবে। উদাহরণস্বরূপ, এটির সাথে সর্বদা মিশ্রিত করা Repositoryবা মডেল যুক্তি যুক্ত করা ভাল নয় Service। আমি যখন আমার পদ্ধতির বর্ণনা দিয়েছিলাম তখন আমি বলেছিলাম যে removeFriendপদ্ধতিটি Serviceস্তরে থাকা উচিত , তবে আমরা যদি আরও পেডেন্টিক হব তবে আমরা লক্ষ্য করতে পারি যে এটি আরও ভাল Repository। আসুন রিপোজিটরিটি কী তা মনে রাখা যাক। এরিক ইভান্স এটিকে তাঁর বই [ডিডিডি] থেকে সুনির্দিষ্ট বিবরণ দিয়েছিল:
একটি সংগ্রহস্থল একটি ধারণামূলক সেট হিসাবে নির্দিষ্ট ধরণের সমস্ত অবজেক্টকে উপস্থাপন করে। এটি আরও বিস্তৃত অনুসন্ধানের ক্ষমতা ব্যতীত সংগ্রহের মতো কাজ করে।
সুতরাং, একটি Repositoryমূলত একটি মুখবন্ধ যা ডেটা / অবজেক্টগুলিতে অ্যাক্সেস সরবরাহ করতে সংগ্রহ শৈলী শব্দার্থক (যোগ করুন, আপডেট করুন, সরান) ব্যবহার করে। কেন যখন তোমার মত কিছু আছে এটা getFriendsList, getUserGroups, removeFriendআপনি এটা করতে পারেন Repositoryকারণ সংগ্রহ মত শব্দার্থবিদ্যা প্রশংসনীয় এখানে পরিষ্কার করা হয়। এবং কোড এর মতো:
- (RACSignal *)approveFriendRequest:(FriendRequest * const)request;
অবশ্যই এটি একটি ব্যবসায়ের যুক্তি, কারণ এটি প্রাথমিক CRUDক্রিয়াকলাপের বাইরে এবং দুটি ডোমেন অবজেক্ট ( Friendএবং Request) সংযুক্ত করে, এজন্যই এটি স্তরতে রাখা উচিত Service। এছাড়াও আমি লক্ষ করতে চাই: অপ্রয়োজনীয় বিমূর্ততা তৈরি করবেন না । এই সমস্ত পদ্ধতির বুদ্ধিমানের সাথে ব্যবহার করুন। কারণ আপনি যদি আপনার অ্যাপ্লিকেশনটিকে বিমূর্ততা দিয়ে অভিভূত করেন তবে এটির দুর্ঘটনাজনিত জটিলতা বৃদ্ধি পাবে এবং জটিলতা আরও সমস্যার সৃষ্টি করবে সফ্টওয়্যার সিস্টেমে অন্য যে কোনও কিছুর চেয়ে software
আমি আপনাকে একটি "পুরাতন" অবজেক্টিভ-সি উদাহরণ বর্ণনা করেছি তবে এই পদ্ধতিকে আরও অনেক উন্নতির সাথে সুইফট ভাষার পক্ষে খুব সহজেই মানিয়ে নেওয়া যেতে পারে, কারণ এতে আরও কার্যকর বৈশিষ্ট্য এবং কার্যকরী চিনি রয়েছে। আমি এই লাইব্রেরিটি ব্যবহার করার জন্য অত্যন্ত পরামর্শ দিচ্ছি: মোয়া । এটি আপনাকে আরও মার্জিত APIClientস্তর তৈরি করতে দেয় (আপনার স্মরণে আমাদের ওয়ার্কহর্স)। এখন আমাদের APIClientসরবরাহকারী একটি প্রকারের প্রোটোকল অনুসারে এক্সটেনশান এবং ডেস্ট্রাকচারিং প্যাটার্ন মেলাকে কাজে লাগাতে একটি মান ধরণের (এনাম) হবে। সুইফ্ট এনামগুলি + প্যাটার্নের মিলটি ক্লাসিক ফাংশনাল প্রোগ্রামিংয়ের মতো বীজগণিত ডেটা টাইপ তৈরি করতে দেয় । আমাদের মাইক্রোসার্ভিসেসগুলি এই উন্নত APIClientসরবরাহকারীটিকে যথারীতি উদ্দেশ্যমূলক-সি পদ্ধতির মতো ব্যবহার করবে । পরিবর্তে মডেল স্তরের জন্য Mantleআপনি অবজেক্টম্যাপার লাইব্রেরিটি ব্যবহার করতে পারেনঅথবা আমি আরও মার্জিত এবং ক্রিয়ামূলক আরগো গ্রন্থাগার ব্যবহার করতে চাই ।
সুতরাং, আমি আমার সাধারণ স্থাপত্য পদ্ধতির বর্ণনা দিয়েছি, যা কোনও অ্যাপ্লিকেশনের জন্য মানিয়ে নেওয়া যেতে পারে, আমি মনে করি। অবশ্যই আরও অনেক উন্নতি হতে পারে। আমি আপনাকে ফাংশনাল প্রোগ্রামিং শেখার পরামর্শ দিচ্ছি, কারণ আপনি এটি থেকে প্রচুর উপকৃত হতে পারেন, তবে এটির সাথে খুব বেশি দূরেও যান না। অতিরিক্ত, ভাগ করা, বৈশ্বিক পরিবর্তনীয় অবস্থা নির্মূল করা, অপরিবর্তনীয় ডোমেন মডেল তৈরি করা বা বাহ্যিক পার্শ্ব-প্রতিক্রিয়া ছাড়াই খাঁটি ফাংশন তৈরি করা সাধারণত একটি ভাল অভ্যাস এবং নতুন Swiftভাষা এটিকে উত্সাহ দেয়। তবে সর্বদা মনে রাখবেন, ভারী খাঁটি কার্যকরী নিদর্শনগুলি সহ বিভাগ-তাত্ত্বিক পদ্ধতির সাথে আপনার কোডটি ওভারলোড করা একটি খারাপ ধারণা, কারণ অন্যান্য বিকাশকারীরা আপনার কোডটি পড়তে এবং সমর্থন করবে এবং তারা হতাশ বা ভয়ঙ্কর হতে পারেprismatic profunctorsএবং আপনার অপরিবর্তনীয় মডেল এ জাতীয় ধরণের জিনিস। একই জিনিস ReactiveCocoa: RACifyআপনার কোড খুব বেশি করবেন না , কারণ এটি সত্যিই দ্রুত অপঠনযোগ্য হয়ে উঠতে পারে, বিশেষত নতুনদের জন্য। এটি যখন আপনার লক্ষ্যগুলি এবং যুক্তিগুলি সত্যিই সরল করতে পারে তখন এটি ব্যবহার করুন।
তাই read a lot, mix, experiment, and try to pick up the best from different architectural approaches,। আমি আপনাকে দিতে পারি এটি সেরা পরামর্শ।