
طبق آماری که گوگل در سال ۲۰۱۶ منتشر کرد، ٪۵۳ از بازدیدکنندگان، یک وبسایت را در صورتی که لود آن بیش از ۳ ثانیه طول بکشد رها میکنند! این آمار، ابوالفضل را به این فکر فرو برده که سرعت لود یک وبسایت به چه اندازه روی حس رضایت کاربران آن وبسایت تأثیر دارد. او که حالا هشتگ #SpeedMatters را در شبکههای اجتماعی ترند کرده، به این فکر افتاده که سرعت لود برنامهاش را با استفاده از cache بالا ببرد. او برای این کار نیاز به یک دولوپر دیگر دارد و از شما کمک خواسته است.
جزئیات پروژه
پروژهی اولیه را از این لینک دانلود کنید. ساختار فایلهای پروژه بهصورت زیر است:
cache
├── models
│   ├── CacheData.java
│   ├── Comment.java
│   ├── ExportCacheDTO.java
│   └── Photo.java
├── services
│   ├── Cache.java
│   └── CacheItem.java
└── Application.java
شما باید کلاس Cache را طوری کامل کنید تا خواستههایی را که در ادامه مطرح میشود را برآورده کند.
ساختار اولیهی این کلاس بهصورت زیر است:
package services;
import java.util.ArrayList;
import java.util.List;
public class Cache {
    private static final int TTL = 2;
    private List<CacheItem> data = new ArrayList<>();
    public List<CacheItem> getAll() {
        return data;
    }
}
همانطور که مشخص است، cache ما قرار است آیتمهای مختلفی را توسط کلاس CacheItem درون خود نگه دارد. این آیتمها فعلاً شامل دو کلاس Photo و Comment میشوند. همچنین این آیتمها زمان مجازی دارند که توسط پراپرتی TTL (واحد روز) مشخص میشود. در اولین گام باید کلاس CacheItem را کامل کنید.
اینترفیس CacheData
این اینترفیس، بیانگر دادههای موجود در cache است. متد زیر در این اینترفیس تعریف شده است:
long getID();
کلاسهای Comment و Photo این اینترفیس را پیادهسازی میکنند.
کلاس CacheItem
این کلاس بهصورت generic بوده و مشخصکنندهی آیتمهایی است که درون cache نگه داشته میشوند. این کلاس باید شامل دو پراپرتی data از نوع T (بهصورت generic) و createdAt از نوع LocalDateTime باشد.
از پراپرتی createdAt برای بررسی مجاز بودن یک آیتم cache استفاده میشود. زمان مجاز زنده بودن یک آیتم درون cache طبق مقدار پراپرتی TTL در کلاس Cache برابر با ۲ روز است.
کلاس Cache
همانطور که گفته شد، مهمترین بخش برنامه، این کلاس است. شما باید متدهایی را که در ادامه ذکر میشود را در این کلاس پیادهسازی کنید:
- متد 
add: این متد که ورودی آنCacheItemاست، باید بتواند یک آیتم را به cache اضافه کند. دقت کنید که آیتمی با دیتای تکراری نباید در cache وجود داشته باشد. در اینصورت، آیتم قبلی باید از لیست آیتمها حذف شده و آیتم جدید درج شود. - متد 
remove: این متد که ورودی آنCacheItemاست، باید بتواند یک آیتم را از cache حذف کند. 
دو متد بالا را باید بتوان به روش method chaining صدا زد. مثال:
cache.add(item1).remove(item1).add(item2);
- متد 
clear: این متد تمام آیتمهای درون cache را حذف میکند. - متد 
getAll: این متد تمام آیتمهای مجاز درون cache را در قالب لیستی ازCacheItemها برمیگرداند. - متد 
findByID: این متد یک پارامتر ورودی از نوعlongدارد و باید لیستی ازCacheItemهای مجاز را در صورتی که پراپرتیIDآیتم درون cache با پارامتر ورودی برابر بود برگرداند. - متد 
filter: این متد دو امضا بهصورت زیر دارد:- اولین امضای این متد دو پارامتر ورودی دارد. اولین پارامتر، نام پراپرتی از نوع 
Stringاست. دومین پارامتر، یک عبارت باقاعده (Regex) بهصورتStringاست. در این حالت، تضمین میشود که پراپرتیای با نام ذکرشده در همهی دادههای موجود در cache تعریف شده است. - دومین امضای این متد نیز مانند امضای اول است، فقط پارامتر نوع کلاس بهعنوان اولین پارامتر به این متد اضافه شده و مشخصکنندهی نوع کلاسی است که باید جستوجو فقط در دادههای از نوع کلاس واردشده صورت گیرد. در این حالت، تضمین میشود که پراپرتیای با نام ذکرشده در کلاس ذکرشده تعریف شده است.
 
 - اولین امضای این متد دو پارامتر ورودی دارد. اولین پارامتر، نام پراپرتی از نوع 
 
کاری که این متد انجام میدهد آن است که باید در پراپرتی گفتهشده، عبارت باقاعده را جستوجو کند و لیستی از CacheItemهای مجاز را برگرداند. به عنوان مثال فرض کنید دو آیتم زیر درون cache وجود دارند:
Photo{ID=1, name='tree.png', path='/production', size=10.0}
Photo{ID=2, name='weather.jpg', path='/production', size=10.0}
حال متد filter را بهصورت زیر صدا میزنیم و میخواهیم عکسهای با فرمت png را فیلتر کنیم:
cache.filter(Photo.class, "name", ".png")
خروجی باید بهصورت زیر باشد:
Photo{ID=1, name='tree.png', path='/production', size=10.0}
- متد 
export: از این متد نیز قرار است برای بهدست آوردن آماری در رابطه با آیتمهای درون cache استفاده کنیم. خروجی این متد لیستی ازExportCacheDTOها است. مثالی از خروجی این متد: 
[
ExportCacheDTO{name='Photo', size=2},
ExportCacheDTO{name='Comment', size=3}
]
این خروجی به این معنی است که ۲ آیتم از نوع Photo و ۳ آیتم از نوع Comment درون cache وجود دارد.
نکات
- آیتمی با دیتای تکراری نباید در cache وجود داشته باشد.
 - اگر قرار است در بعضی از متدها آیتمی را برگردانید، آن آیتم حتماً باید مجاز باشد (منقضی نشده باشد).
 - ترتیب برگرداندن آیتمها باید مطابق با ترتیب اضافه شدن آنها به cache باشد.
 - شما تنها مجاز به اعمال تغییرات در فایلهای 
services/Cache.javaوservices/CacheItem.javaهستید. - تستهای نمونهی برنامه در کلاس 
CacheSampleTestموجود هستند. میتوانید آنها را پس از افزودن JUnit به classpath در سیستم خود اجرا کنید. 
آنچه باید آپلود کنید
پس از پیادهسازی موارد خواستهشده، پوشهی services را زیپ کرده و آپلود کنید (خود پوشه نیز در فایل زیپ موجود باشد).
ارسال پاسخ برای این سؤال