چطوری خودمون رو از شر ساختن داده‌های Fake راحت کنیم ؟

استاندارد

یه چیز که خیلی خیلی من رو توی روند انجام پروژه‌ها اذیت میکرد همزمان نبودن پیاده‌سازی بخش کلایت و سرور بود . بطور مثال ما تو جلسات فنی ساختار داده‌ها و وب‌سرویسهایی که لازم بود رو با وب‌سرویس نویس مشخص میکردیم ولی به هر دلیلی این وب‌سرویس‌ها تو زمان پیاده‌سازی کلاینت‌ها آماده نمیشد یا با تاخیر آماده میشدند و این موضوع باعث این میشد که من برای پیاده‌سازی بخش‌هایی از کلاینت مجبور بشم تا توابعی رو در داخل اپلیکیشن بنویسم که داده‌های غیر واقعیی با ساختار درست و مشخص شده رو تولید کنه ، تا امکان تست اولیه کدهام در روند پیاده‌سازی رو داشته باشم .
چون این کار همیشه برای من جزو کارهای حوصله سر بر و کسل کننده بود ، باعث شد کمی جستجو کنم تا ببینم راه حلی برای انجام دادن این کار به صورت غیر حوصله سر بر هست یا نه . که خوشبختانه راه حلی به اسم JsonServer  وجود داشت .
JsonServer یک REST API برای تولید داده‌های غیر واقعیی بر روی localhost هست که با استفاده از یک فایل Json که بهش داده میشه کار میکنه . کافی این فایل Json دقیقا ساختار داده‌ای پروژه‌تون رو داشته باشه تا شما بتونید با توابع GET , POST , PUT , DELET , PATCH که json server در اختیارتون میذاره ، با صرف کمترین زمان از وب‌سرویس‌های مورد نظرتون داخل اپلیکیشنتون استفاده کنید . تو ادامه با یه مثال سعی میکنم نحوه عملکرد json server رو براتون بیشتر توضیح بدم .

اول بریم سر نصب این برنامه ، اگه با مک یا لینوکس کار میکنید و node رو روی سیستمتون ندارید ، برای قدم اول لازمه node روی سیستمتون نصب کنید .
دستور نصب node در ترمینال با پکیج منیجر homebrew برای مک : brew install node

بعد از اون میرسیم به نصب خود json-server ، برای این کار فقط کافی که تو ترمینالتون دستور زیر رو اجرا کنید و کمی هم صبر و تحمل به خرج بدید .
دستور نصب  npm install -g json-server  :  json server

خب بریم سر نحوه استفاده :

فرض کنید که برای موجودت‌های Profile و Products نیاز به یکسری وب‌سرویس داریم . فایل json به اسم db.json که در زیر نوشته شده ، شامل لیستی از چند Profile و یک لیست از Products ها هست .

کاری که ما  باید انجام بدیم اینه که این فایل رو به عنوان پارامتر به json-server بفرستیم تا اون بقیه کارا رو برای ما انجام بده . پس به دایرکتوریی که فایل json مون تو اون قرار داره میریم و دستور json-server db.json رو توی ترمینالمون اجرا میکینم . بعد از این مرحله میتونیم با استفاده از متد GET بر روی ادرس localhost:3000/profile لیست profile های مورد نظرمون رو دریافت کنیم . همچنین میتونیم با فرستادن شماره id در ریکوئست ، پروفایل مورد نظرمون رو در جواب دریافت کنیم  ، مثال localhost:3000/profile/1 . همینطور با استفاده از متدهای دیگه مثل ‌PUT , DELETE , POST هم میتونیم عملیاتهای اضافه ، حذف و تغییر رو بر روی داده‌های موجود تو فایل json مون اعمال کنیم . لازمه که این رو هم بگم که این تغییراتی رو که ما در فایل json به وسیله json-server اعمال میکنیم فقط در صورتی اعمال خواهند شد که قبل از بستن اون ، دستور s رو در ترمینال اجرا کنیم .

تو این پست بخش کوچیکی از قابلیتای json-server رو براتون گقتم ، اگه میخواید راجع‌به بقیه کارهایی که این برنامه در اختیارتون میذاره بدونید میتونید به صفحه این پروژه توی گیت‌هاب یه سر بزنید .

نکته : اگه از genymotion برای تست‌هاتون استفاده میکنید یادتون باشه به جای http://localhost:3000  از http://10.0.3.2:3000 استفاده کنید .

همه چیز درباره annotation ها

استاندارد

at-symbol-1113fg-v1-65

قطعا هممون تو روند کد نویسیمون بارها و بارها از annotation ها استفاده کردیم ، گاهی از annotaion های پیش فرضی که خود جاوا در اختیارمون گذاشته مثل override@ یا depricate@ یا از annotation هایی که فریمورک یا کتابخونه‌ای که باهاش کار میکنیم در اختیارمون قرار میده .

از بحث اینکه چه جاهایی از اونا استفاده کردیم و میکنیم بگذریم، میرسیم به اینکه اصن annotation ها چی هستن و چجوری میتونیم یه annotation دلخواه برای استفاده خودمون بنویسیم ؟

annotation  توی داکیمونت oracle به عنوان یک فرم از meta data معرفی شده که اطلاعاتی درباره برنامه رو وارد کدهامون میکنه ولی خودش جزیی از برنامه نیست . از annotation ها میشه در زمان اجرای برنامه یا در زمان توسعه استفاده کرد همینطور compiler از annotation ها برای تشخیص مواردی مثل متدهای override شده ، خطا ها و هشتارها استفاده میکنه . ولی نکته مهم اینکه annotation ها چطور کار میکنن ؟ در ادامه با یه مثال و ساختن یه annotation دلخواه سعی میکنم جواب این سوال رو توضیح بدم .

سناریویی که پیش رو داریم  :

فرض کنید میخوایم به وسیله annotation ها در کلاس‌های entity  فیلدهایی که باید در دیتابیس ذخیره بشن ، کلید اصلی و فیلدهای not null رو مشخص کنیم  و با توجه به این اطلاعات جداول مورد نیازمون رو بسازیم .

روند انجام :

در مرحله اول لازمه با توجه به نیازهایی که گفته شد یه annotation دلخواه برای خودمون بسازیم .

برای ساخت یک annotation باید اسم کلاس ( اسم annotation ) رو بعد از interface@ قرار بدیم و مواردی مثل جایی که قراره این annotation مورد استفاده قرار بگیره ( متد ، فیلد ، کلاس ) ، زمانی که annotation مورد استفاده قرار میگیره و … رو مشخص کنیم .

در کد بالا به وسیله (Target(ElementType.FIELD مشخص میشه که هدف این annotation قرار گرفتن در سطح فیلدها هست و (Retention(RetentionPolicy.RUNTIME@ نشون میده که این annotation در زمان اجرای کدها مورد استفاده قرار میگیره .

isPrimary این امکان رو به ما میده که بتونیم فیلد مورد نظرمون رو برای قرارگرفتن به عنوان کلید اصلی مشخص کنیم . همینطور با قرار دادن dbColumn برابر false میتونیم مشخص کنیم که نمیخوایم این فیلد رو به عنوان ستون در دیتابیسمون ذخیره کنیم .

در مرحله بعد میرسیم به استفاده از این annotation هامون تو کلاس Users که در ادامه خواهیم ساخت .

با توجه به کد بالا فیلد id قراره به عنوان primary key ما مورد استفاده قرار بگیره . و فیلد email توی جدول ذخیره نشه .

خب میرسیم به مرحله آخر ، حالا تنها کاری که لازمه انجام بدیم استفاده از اطلاعاتی هست که به وسیله annotation ها داخل کلاسمون قرار دادیم .

کلاس بالا از SQLiteOpenHelper ارث برده و توی اون متد createTable کار پردازش annotation ها و ساخت query مناسب برای ساختن جداول رو بر عهده داره . توی این متد ابتدا فیلدهایی که نباید در جدول ذخیره شوند مورد برسی قرار میگیرند سپس با توجه به کلید اصلی بود یا not null بودن هر فیلد query مورد نظر تغییر میکند و در اخر هم query ساخته شده به وسیله کد (sqLiteDatabase.execSQL(script اجرا خواهد شد و جدول مورد نظر ساخته میشه. همنطور باید بگم توی این متد به وسیله کد  (field.isAnnotationPresent(DbColumn.class مشخص میکنیم که آیا برای فیلد مورد نظر annotation دلخواه ما وجود داره یا نه و به وسیله (field.getAnnotation(DbColumn.class میتونیم annotation قرار گرفته برای فیلد مورد نظر رو بگیریم .

مثال بالا جهت نمایش نحوه کارکرد annotation ها نوشته شده ، اگه شما هم کاربردها و ایده‌های جالبی برای استفاده ازشون پیدا کردید خوشحال میشم به منم بگید .