একটি প্রোডাক্ট সাপোর্ট করার জন্য একটি ডিজাইন সিস্টেম বানানো সহজ নয় — এটি একসাথে রবাস্ট এবং ফ্লেক্সিবল হতে হবে স্কেলেবিলিটির জন্য। চ্যালেঞ্জিং হলেও, অনেক সুন্দর রিসোর্স ব্যবহারিক প্রিন্সিপল এবং পদ্ধতি শেয়ার করেছে যা টিমগুলাকে ভিজ্যুয়ালি এবং প্রোগ্রাম্যাটিক্যালি একটি ভালো সিস্টেম বানাতে সাহায্য করে। তাদের কাঁধে দাঁড়িয়ে, এই আর্টিকেল SwiftUI-এ একটি ভালো সিস্টেম বানানোর উপর ফোকাস করে একটি অলঙ্ঘিত জমিনে অবদান রাখার চেষ্টা করে।
কেন আমি এই আর্টিকেল লিখছি
নিউ ইয়র্কের ITP-এ আমার প্রথম সমরে, আমি লাইন ব্রেক স্টুডিওতে iOS ডেভেলপার ইন্টার্ন হিসেবে কাজ করার সুযোগ পেয়েছিলাম। আমাকে যা কাজটি দেওয়া হয়েছিল সেটি হলো দুটি ধাপে একটি ডিজাইন সিস্টেম বানানো: প্রথমে ভিজ্যুয়ালি Sketch-এ, তারপর প্রোগ্রাম্যাটিক্যালি SwiftUI-এ। নতুন ফ্রেমওয়ার্কে পরীক্ষা-নিরীক্ষা এবং এর সাথে ডিজাইন সিস্টেম বানানোর অভিজ্ঞতা চমৎকার ছিল, কিন্তু পথে পথে বাগও ছিল। তাই আমরা আমাদের অভিজ্ঞতা কমিউনিটির সাথে শেয়ার করতে চাই, আশা করি আপনার ডেভেলপমেন্ট প্রসেস সহজ হবে।
SwiftUI কী
অ্যাপল WWDC ২০১৯-এ এই ব্যাপক নতুন ফ্রেমওয়ার্কটি রিলিজ করেছিল, যা বছরের একেবারে সেরা একটি। একটি ওয়েব ডেভেলপারের দৃষ্টিকোণ থেকে, SwiftUI-এ প্রজেক্ট ডেভেলপমেন্ট অভিজ্ঞতা পরাম্পরিক ফ্রন্ট-এন্ড স্ট্যাক ও ফ্রেমওয়ার্কের কাছাকাছি।
এটি নিঃসন্দেহে একটি চমৎকার পদক্ষেপ কারণ প্রোগ্রামিং ইন্টারফেস এবং স্টেট ম্যানেজমেন্ট আগের চেয়ে আপারেটিভভাবে সহজ হয়েছে। এবং এই উন্নতির সেরা অংশ হলো UIKit এবং SwiftUI সুস্পষ্টভাবে ইন্টিগ্রেট করা যায়। SwiftUI-এর বেসিক শিখতে অ্যাপলের অফিসিয়াল টিউটোরিয়ালগুলো খুব সহায়ক।
ডেমো প্রজেক্ট
ডেমোстарশনের জন্য, আমি লাইন ব্রেক স্টুডিওতে বানানো ডিজাইন সিস্টেমের একটি সিম্পলিফাইড ভার্সন রেখেছি। এটি বাটন কম্পোনেন্টের একটি সেট যা বিভিন্ন ফর্মে আছে, যেগুলো দুটি নিম্ন-স্তরের পার্টের উপরে বিল্ড করা: টাইপোগ্রাফি এবং colorPalette।

প্রজেক্টটি GitHub-এ পাবলিক, এবং আমি ডেভেলপমেন্টের জন্য Xcode 11 Beta 5 ব্যবহার করছি। ডিজাইন সিস্টেম ম্যানেজমেন্ট হাব হিসেবে একটি Airtable বেস (ওয়ার্কফ্লো ম্যানেজমেন্ট সম্পর্কে আরও পড়ুন)ও পাবলিক রেফারেন্সের জন্য।
ডিজাইন সিস্টেম বানানোর প্রিন্সিপল
কোডে ডিজাইন সিস্টেম ডিজাইনার এবং ডেভেলপারের মধ্যে একটি মিডলওয়্যার। সিস্টেমের ডেভেলপার ভিজ্যুয়াল ফর্মে ডিজাইন সিস্টেম থেকে ইনপুট নেয়, এবং আরও ডেভেলপমেন্টের জন্য ঐডেন্টিক্যাল API প্রোডিউস করে। এই সিস্টেম কোডে পুরা করার জন্য নিচের দুটি প্রিন্সিপল রিকগনাইজ করা উচিত:
১. টোকেন দিয়ে যোগাযোগ করুন
মৌলিকভাবে, প্রোগ্রামে ডিজাইন সিস্টেম রাখার উদ্দেশ্য ভালো কোড ম্যানেজমেন্ট বা ডেভেলপমেন্ট এফিশিয়েন্সি নয়, বরং নিশ্চিত করা যে ভিউ ডিজাইন ফাইলগুলোর সাথে কনসিস্টেন্ট। সেই লক্ষ্যে, কোনো নির্দিষ্ট কালার, ফন্ট, সাইজ বা ভিজ্যুয়াল এলিমেন্টকে সিগনিফাই করার জন্য টোকেন ব্যবহার করা ডেভেলপার, ডিজাইনার এবং ম্যানেজারের মধ্যে যোগাযোগের গুণগত মান রক্ষা করার জন্য অত্যন্ত গুরুত্বপূর্ণ।

২. হায়ারার্কির লেভেল
EightShapes-এর আর্টিকেলে নির্দেশ করা হয়েছে যে আমরা "প্রথমে অপশন দেখান, তারপর ডিসিশন নিন", কারণ "অপশন ছাড়া ডিসিশন নেওয়া যায় না।"

এই ধরনের অর্ডারিং আর্কিটেকচার বিভিন্ন লেভেলের মধ্যে কাপলিং-এর ডিগ্রি কমিয়ে দেয়, যা সম্ভাব্য রিভিশনের জন্য বেশি ফ্লেক্সিবিলিটি এবং ডাইনামিক্স প্রদান করে। আমি লেভেলগুলো নিচ থেকে উপরের দিকে এই ক্রমে স্ট্রাকচার করি: ম্যাটেরিয়াল → বেস → টোকেন। কিন্তু টিম যেভাবে কনফর্টেবল সেভাবেই করা যায়।
কোডে নেমে পড়া
নিচের সেকশনটি আমাদের অভিজ্ঞতায় ভিত্তি করে হাইলাইট করা কিছু পয়েন্টের তালিকা। পূর্ণ কোডের জন্য GitHub রিপো দেখুন। যেকোনো ফিডব্যাক বা সমালোচনা উন্নতির জন্য স্বাগত।
১. হায়ারার্কি লেভেলের আর্কিটেকচার
নিম্ন লেভেলের ম্যাটেরিয়ালকে স্ট্যাক করে হigest লেভেলের টোকেন কনস্ট্রাক্ট করার দুটি পদ্ধতি আছে:
enumব্যবহার করুন টাইপ সেফটি এবং কোড লিটারেসির জন্য
গ্রুপিং র্যাপার বা ফাংশনে প্যারামিটার হিসেবে কোডে enum ব্যবহারের সুবিধা ইতিমধ্যে ভালোভাবে স্বীকৃত। এখানে লেভেল অফ হায়ারার্কি ইমপ্লিমেন্টেশনের একটি পয়েন্ট উল্লেখ করা যোগ্য।
আমরা সবসময় র Voltaire raw values, ফন্ট সাইজ (CGFloat) এবং ফন্ট নাম (String) নিম্নতম লেভেলে স্টোর করি, কারণ আমরা সেটির সাথে গুলিয়ে ফেলতে চাই না। কিন্তু raw value অবশ্যই enum-এ লিটেরেল হতে হবে, তাই আমরা অন্য enum-এ থেকে একটি মান দিয়ে একটা case অ্যাসাইন করতে পারি না।
এই সমস্যাটি সমাধান করার জন্য, আমরা একটি getValue ফাংশন ইমপ্লিমেন্ট করি, যা প্রয়োজনে switch কেসে raw value রিটার্ন করে।
structব্যবহার করুন সহজ স্ট্রাকচারের জন্য
এনাম চমৎকার হলেও, কিছু কেসে আমাদের তার ইউনিক ফিচার প্রয়োজন নেই। উদাহরণস্বরূপ, যেহেতু Xcode ডাইনামিক কালার প্রসেস করার ভারী কাজ নিজে করে, এবং API এন্ডপয়েন্টে কোনো প্যারামিটার অপশন প্রয়োজন নেই, আমরা সিম্পল দুই লেভেলের স্ট্রাক্ট দিয়ে কালার প্যালেট সেট আপ করতে পারি।
২. API এন্ডপয়েন্টের স্পষ্ট ও সরল নামকরণ
নেমিং কনভেনশন আলোচনা ও বিতর্কের একটি ব্যাপক টপিক। বেসিক Swift কনভেনশনের পাশাপাশি, আমরা শুধু দুটি নিয়ম মেনে চলি: ১) কোনো এক্রোনিম নয় এবং ২) সিম্পল রাখুন। উদাহরণস্বরূপ, টাইপোগ্রাফি এবং কালার সিস্টেম ব্যবহার করতে নতুন এন্ডপয়েন্ট তৈরি না করে, আমরা Font এবং Color স্ট্রাক্ট থেকে এক্সটেনশন তৈরি করি। এই পদ্ধতি ডেভেলপারদের অপরিচিত API নাম মেমোরাইজ করার esfuer কমিয়ে দেয়।
৩. দুটি মোডে ডাইনামিক্যালি কালার সেট ম্যানেজ করুন
ডার্ক মোড এখন ইন্ডাস্ট্রি স্ট্যান্ডার্ড, এবং iOS এবং Android উভয় টিমই এই ফিচার ইমপ্লিমেন্ট করেছে। এটি ইউজারদের জন্য ভালো ট্রেন্ড, কিন্তু ডিজাইনার এবং ডেভেলপারদের কিছু চ্যালেঞ্জ নিয়ে আসতে পারে, যার মধ্যে কালার সেট ম্যানেজ ও নামকরণ, বিশেষত গ্রে স্কেল موارد।

গ্রে স্কেল কালার ডাইনামিক্যালি চিন্তা ও যোগাযোগ করার জন্য, সাদা, হালকা, কালো বা গাঢ় শব্দগুলো কাজ করে না। কারণ যদি আমরা একটি ডাইনামিক কালার #000000 (HEX-এ কালো) কে light color scheme-এ কালো বা গাঢ় বলি, তবে dark color scheme-এ এই নির্দিষ্ট কালারটি #FFFFFF (HEX-এ সাদা) হওয়া উচিত, সেটিকে কী বলবেন? defaultDark নাকি lightDark?

পারাম্পরিক পদ্ধতিতে গ্রে স্কেল ডাইনামিক কালার সেটের নামকরণ খুব কনফিউজিং। এই বিভ্রান্তি এড়াতে, আমরা একটি কালার সেটকে light এবং dark স্কিমে ম্যানেজ করার জন্য theme এবং contrast ব্যবহার করি।

লক্ষ্য করুন, একটি গ্রে স্কেল কালার সবসময় বিপরীত কালার মোডে রিভার্স হতে হয় না। এসব পরিস্থিতিতে যেখানে হালকা কালার হালকা থাকে এবং গাঢ় কালার গাঢ় থাকে, আমরা সেটিকে সহজে হালকা বা গাঢ় নামে ডাকি।
এই নামকরণ পদ্ধতির ধারণা পাওয়ার পর, Xcode-এ কালার প্যালেটের এই আর্কিটেকচার ম্যানেজ করা সহজ। একটি কালার সেট তৈরি করতে, শুধু একটি নতুন Asset Catalog ফাইল তৈরি করুন → একটি নতুন Color Set যোগ করুন → এবং Appearances-কে Any, Light, Dark-এ পরিবর্তন করুন।

৪. environment সেটিংস
SwiftUI ফ্রেমওয়ার্কের একটি চমৎকার ফিচার হলো environment মডিফায়ার, যা টার্গেট ভিউয়ে environment values কন্ট্রোল করার ক্ষমতা দেয়। ডিজাইন সিস্টেম বানানোর কথা বললে, এই ক্ষমতা অ্যাপের ফন্ট রুট লেভেলে পরিবর্তন করার সুবিধাজনক পদ্ধতি প্রদান করে। এবং environmentValue ব্যবহারের আরেকটি সুবিধা হলো ডেভেলপমেন্টে লাইট এবং ডার্ক কালার স্কিম পরিবর্তন ও টেস্ট করা।
৫. buttonStyle এবং বাটন লেবেল
UIKit-এর পুরনো দিনের তুলনায়, SwiftUI-এ রিঅয়ূজেবল বাটন কনস্ট্রাক্ট করা আপারেটিভভাবে সহজ। Button ভিউ দুটি অংশ থেকে গঠিত: action ক্লোজার (বাটন চাপায় ফায়ার হওয়া ইভেন্ট) এবং label (বাটনের বডি)। ভিউটি তারপর buttonStyle মডিফায়ারের সাথে চেইন করা যায়। রিঅয়ূজেবল বাটন বানানোর বিস্তারিত জানতে Alejandro-এর টিউটোরিয়াল পড়ুন, যা ব্যাপক এবং উপকারী।
আমাদের কাস্টমাইজড বাটন কম্পোনেন্টে, প্রথম ধাপ হলো দুটি স্ট্রাক্ট তৈরি করা: TokenButtonLabel এবং TokenButtonStyle। এই দুটি স্ট্রাক্ট ডিজাইন ফাইলে থাকা বাটনের টাইপ অনুযায়ী প্রোগ্রাম করা হয়েছে। উদাহরণস্বরূপ, লেবেলের শুধু দুটি টাইপ আছে: আইকন এবং টেক্সট। প্রতিটি টাইপের একটি অনুরূপ init ফাংশন আছে ভিন্ন প্যারামিটার সহ নতুন ইনস্ট্যান্সের জন্য।
অন্যদিকে, বাটন স্টাইলের চারটি প্রধান টাইপ আছে: সার্কেল আইকন, আইকন, ক্যাপসুল এবং টেক্সট। ButtonStyle প্রোটোকল ফলো করতে হলে একটি makeBody ফাংশন ইমপ্লিমেন্ট করতে হয়। এই ফাংশন আমাদের একটি configuration প্রপার্টি দেয়, যা নেটিভ isPressed ভ্যালু দিয়ে মনিটর করে যে বাটন চাপা হয়েছে কিনা।
শেষে, TokenButtonLabel এবং TokenButtonStyle-র উপরে স্ট্যাক করে, বাটন কম্পোনেন্ট API-এর এন্ডপয়েন্ট হবে TokenButton — একটি গ্রুপিং যা বাটনের কন্টেন্ট এবং স্টাইল একসাথে র্যাপ করে, ভিজ্যুয়াল ডিজাইন সিস্টেমের বাটন টাইপের সাথে কনফর্ম করে।
৬. AnyView র্যাপার হিসেবে
ButtonStyle প্রোটোকল দ্বারা আনা makeBody ফাংশন নিয়ে কাজ করার সময়, আমরা View-এর সাথে কাজ করার একটি উপকারী টিপ খুঁজে পেলাম। একটি ভিউ ভেরিয়েবলে স্টোর করতে, টাইপ অ্যানোটেশন AnyView হিসেবে ইঙ্গিত করা যেতে পারে, যা SwiftUI-এ ভিউগুলোর একটি জেনারেল কন্টেইনার হিসেবে কাজ করে।
আমাদের কেসে, যেহেতু আমরা সব টাইপের বাটনের জন্য configuration.label-এ opacity মডিফায়ার যোগ করতে চাই, প্রতিটি switch কেসে বারবার করা না করেই, এটা একসাথে চেইন করা বেশি মানে রাখে। আমরা AnyView-এর সুবিধা নিচের মত করে নিতে পারি:
৭. mutating ফাংশন দিয়ে ভিউ মডিফায়ার বানান
বাটন স্টাইল ডাইনামিক্যালি আপডেট করতে, আমরা আমাদের নিজস্ব মডিফায়ার বানাতে পারি। প্রথমে ভিউতে কাস্টোমাইজড মিউটেবল স্টেট প্রপার্টি ইনস্ট্যানশিয়েট করুন, তারপর একটি mutating ফাংশন তৈরি করুন যা টার্গেট স্টেট প্রপার্টি আপডেট করার পর Self টাইপ রিটার্ন করে।
৮. ঝামেলার বর্ডার স্টাইল
SwiftUI-এর একটি ড্রব্যাক হলো সার্কেল শেপকে সার্কুলার বর্ডার দিয়ে স্টাইল করা একদম सीধা নয়। আমি কিছুক্ষণ লড়েছি, এবং শেষে StackOverflow-এ সমাধান পেলাম। একটি clipShape এবং একটি overlay মডিফায়ার প্রয়োজন এটা কাজ করার জন্য।
উপসংহার
SwiftUI হলো অ্যাপল কর্তৃক একটি অবিশ্বাস্য উন্নতি। ত্রুটি থাকা সত্ত্বেও, এটি দিয়ে একটি রবাস্ট এবং ফ্লেক্সিবল ডিজাইন সিস্টেম বানানো, এবং অধিকন্তু জটিল iOS UI বানানো আগের চেয়ে অনেক বেশি এফিশিয়েন্ট। আশা করি এই আর্টিকেল যেকোনো iOS টিম যারা UI বানাতে চান তাদের জন্য সহায়ক হবে, এবং যেকোনো ফিডব্যাকের জন্য সবসময় ওপেন!
আরও পড়ুন vinceshao.com-এ / টুইটার বা লিঙ্কডইনে ফলো করুন