توسعه دهندگان هم کاربر هستند. بخش ۱

در پست قبلی به اهمیت کارکرد درست رابط کاربری و API اشاره کردیم. در اینجا به ۵ رهنمود در طراحی یک رابط کاربری و API اشاره میکنیم : قابل رویت بودن وضعیت سیستمانطباق بین سیستم و دنیای واقعیکنترل و آزادی عمل کاربرانرعایت استانداردها و اصول کاربریجلوگیری از بروز خطا۱- قابل رویت بودن وضعیت سیستم سیستم بایستی به کاربران بوسیله بازخورد درست در زمان مناسب بایستی وضعیت سیستم را اطلاع دهد.رابط کاربری :‌ زمانی که کاربر عملی را آغاز میکند که مدت زمان زیادی طول میکشد، بایستی آنها را در مورد پیشرفت کار مطلع کنیم.برای اینکه نشان دهیم عکس بارگیری میشود، میتوانیم یک progressbar و یک اعلان(notification) همراه درصد پیشرفت به کاربر نمایش دهیم. کاربر بایستی بداند که بابت چه چیزی منتظر است.?API: API بایستی راههای استعلام وضعیت کنونی یک عملیات را فراهم کند. برای مثال کلاس AnimatedVectorDrawable برای اینکه اطمینان حاصل شود که انیمیشن در حال اجرا هست یا نه این راه را فراهم کرده است : Boolean isAnimationRunning = avd.isRunning();۲- انطباق بین سیستم و دنیای واقعیاپلیکیشن بایستی به زبان کاربر صحبت کند. بدین معنی که مفاهیم و کلماتی که به کار میبرد بایستی برای کاربر آشنا باشد، نه کلماتی خود سیستم استفاده میکند.?API: زمانی که در یک API به دنبال یک کلاس میگردیم، بایستی نام آن کلاس به گونه ای باشد که کاربر به راحتی به آن دست یابد، چون کاربر ممکن است پیش زمینه ای درباره این API و دیگر APIهای در این زمینه نداشته باشد. برای مثال زمانی که توسعه دهنده از picasso یا glide استفاده میکند، به دنبال متدی که ‘load’ یا ‘download’ نام داشته باشد، میگردد.۳- کنترل و آزادی عمل کاربرامکان بازگشت از عمل انجام شده کاربران به آنها بدهید.رابط کاربری : برای کارهایی که گاها باعث ابهام در ذهن کاربر میشوند و کاربر ممکن است ناخواسته آن را انجام داده باشد، همانند پاک کردن یا آرشیو کردن یک ایمیل، پیامی به او نشان دهید که میتواند این عملیات را بازگرداند.?API ها نیز بایستی به توسعه دهنده اجازه متوقف کردن یا ریست کردن عملیات را بدهند و به راحتی API را به حالت نرمال خود بازگرداند.API: برای مثال، Retrofit با متد cancel، این اطمینان را حاصل میکند که درخواست ارسالی به سرور در شرایطی که دسترسی به شبکه نیست و یا هنوز درخواست اجرا نشده است، درخواست را متوقف کند. همچنین اگر با NotificationManager کار کنید، میبینید که این API برای شما هر دو متد create و cancel را فراهم کرده است.۴- رعایت استانداردها و اصول کاربریکاربر اپلیکیشن شما نباید با مواردی مواجه شود که یک معنی یا مفهوم را میرسانند.رابط کاربری: کاربرانی که با برنامه شما کار میکنند، قبلا با برنامه های دیگر نیز تعامل داشته اند و از برنامه شما نیز انتظار دارند همان رفتارها را در شرایط مشابه نشان دهد. فاصله گرفتن از این استانداردها ، کاربر را به سمت اشتباه و بروز دادن خطا سوق میدهد.همواره بر طبق اصول پلتفرم و المان های رابط کاربری آن پیش روید، در این صورت کاربران به سرعت آنها را شناسایی میکنند و با آن تعامل میکنند. همچنین در برنامه خود نیز در شرایط مشابه از کلمات و آیکون های یکسان استفاده کنید. برای مثال زمانی که کاربر میتواند المان های متفاوتی را در اپلیکیشن شما ویرایش کند، از یک آیکون ویرایش استفاده کنید.? API: تمام قسمت های یک API بایستی بر طبق اصول طراحی شوند.از نام گذاری اصولی برای متدهای خود استفاده کنیددر مثال زیر ما interface داریم که دو راه برای قراردادن observer برای دو نوع متفاوت مشخص کرده است:public interface MyInterface {void registerContentObserver(ContentObserver observer);void addDataSetObserver(DataSetObserver observer);}کاربران این interface از خود میپرسند که فرق بین این دو متد در چیست؟ در بهترین حالت آنها مجبور میشوند با دقت مستندات این API یا نحوه پیاده سازی آن را بخوانند تا متوجه شوند که این دو متد کاملا شبیه هم رفتار میکنند.private List<ContentObserver> contentObservers;private List<DataSetObserver> dataSetObservers;public void registerContentObserver(ContentObserver observer) {contentObservers.add(observer);}public void addDataSetObserver(DataSetObserver observer){dataSetObservers.add(observer);}از اسامی مشابه برای متد هایی که یک کار را انجام میدهند، استفاده کنید. همچنین میتوانید از متضاد ها برای نام گذاری متد ها استفاده کنید‌ : get/set - add/remove - subscribe/unsubscribe - show/dismissدر ترتیب پارامترهای متد ها دقت کنیدزمانی که متدی را overload میکنید، اطمینان حاصل کنید که همان ترتیبی را رعایت میکنید که در سایر متد ها نیز هست. در غیر این صورت کاربران API زمان زیادی را باید صرف پیدا کردن تفاوت بین متد های overload شده، کنند.void setNotificationUri( ContentResolver cr,Uri notifyUri);void setNotificationUri( Uri notifyUri,ContentResolver cr,int userHandle);از متدها و توابع با توالی پارامترهای از نوع مشابه اجتناب کنیداگر چه android studio کار کردن با توابع دارای توالی پارامترهای یک نوع را ساده کرده است، اشتباههای ترتیبی بروزشان بسیار ساده و پیدا کردنشان بسیار سخت است.?به عنوان راه حل میتوانید از builder pattern برای بوجود نیامدن همچین مشکلاتی استفاده کنید.متدها نبایستی بیش از ۴ پارامتر ورودی داشته باشند.هرچه تعداد پارامترهای یک متد بیشتر باشد، پیچیدگی آن نیز بیشتر است، زیرا کاربر بایستی ارتباط آن با متد و ارتباط آن با دیگر پارامتر ها را درک کند. بدین منظور که هر یک پارامتری که بیشتر میشود، پیچیدگی متد به صورت نمایی افزایش می یابد. زمانی که متدی بیش از ۴ پارامتر دارد، میتوانید بعضی از آنها را داخل کلاسی دیگر جای دهید یا از builder ها استفاده کنید.مقدار بازگشتی متد بر روی پیچیدگی آن تاثیر میگذارد.زمانی که متد، مقداری را بازمیگرداند، توسعه دهنده نیاز دارد بداند، آن مقدار نشان دهنده ی چیست، چگونه آن را ذخیره کند و …. زمانی که مقداری بازگشتی استفاده نشود، تاثیری بر پیچیدگی متد نخواهد داشت.برای مثال زمانی که یک رکورد به پایگاه داده میخواهیم اضافه کنید، Room میتواند هم Long و هم void برگرداند. زمانی که کاربر API میخواهد مقداری بازگردد، ابتدا بایستی بداند این مقدار به چه منظور است و چگونه آن را ذخیره کند. زمانی که نیازی به مقدار بازگشتی نباشد، میتوان از متد void استفاده کرد.@InsertLong insertData(Data data);@Insertvoid insertData(Data data);۵- جلوگیری از بروز خطاطراحی بایست به نحوی باشد که از بروز مشکل یا خطا در ابتدای کار جلوگیری کند.رابط کاربری: معمولا کاربران از کاری که دارند انجام میدهند حواسشان پرت میشود و این وظیفه شما است که از بوجود آمدن مشکل و خطا بر اثر بی حواسی کاربران با پیشنهاد دادن راههایی که به آنها کمک کند در راه درست بمانند و لغزش کمتری پیش آید، جلوگیری کند. برای مثال شما میتوانید قبل از عملیاتی که باعث از بین بردن اطلاعات یا عملیات گذشته می شود، از آنها تاییدیه بخواهید یا به آنها گزینه های از پیش تعریف شده پیشنهاد دهید.برای مثال google photos از اینکه شما آلبومی را به اشتباه نکنید با یک dialog تاییدیه از عمل شما اطمینان حاصل میکند. همچنین اپلیکیشن inbox به شما این قابلیت را میدهد که چک کردن ایمیلی را تنها با یک کلیک به تعویق بیاندازید.?API بایستی کاربر را به سمت درست استفاده کردن از آن سوق دهد. از مقادیر پیش فرض هرجا که ممکن است استفاده کنید.کار کردن با APIها بایستی بسیار راحت باشد و احتمال اشتباه و استفاده غلط در آنها بسیار کم باشد. میتوانید برای کمک کردن به کاربران خود، از مقادیر پیش فرض استفاده کنید. برای مثال زمانی که یک پایگاه داده Room میسازید، یکی از مقادیر پیش فرض، این اطمینان را می دهد که داده های شما همواره حفظ میشوند، حتی اگر نسخه پایگاه داده شما بالا رود. این به کاربر قابلیت استفاده بهتر از برنامه ای را که از Room استفاده میکند را میدهد.همچنین Room متدی فراهم کرده است که میتواند این رفتار را تغییر دهد: fallbackToDestructiveMigration که پایگاه داده را به کلی از بین میبرد و با هر نسخه ای که عوض میشود از نو آن را میسازد. البته اگر Migration در نظر نگرفته شده باشد.