کنترل ترافیک
نام و تاریخ مسابقه: جیکل 8 – 21 اردیبهشت 1397
مباحث: Collections و Generics
در سازمان کنترل ترافیک، برای اطلاعرسانی وضعیت ترافیک نقاط مختلف شهر از یک برنامهی جاوایی استفاده میشد که بخشی از این برنامه به دلیل عدم استفاده از یک سیستم کنترل نسخه (VCS) از بین رفته است. کمک کنید تا این برنامه مجددا کامل شود.
به این منظور، ابتدا بستهی ir.javacup.traffic را دانلود کرده و محتوای آن را ببینید.
توضیح کلاسها و واسطها:
- کلاس Observable<T>: هر شی که از طریق متد push به شی از نوع Observable داده شود، به تمامی subscriberهایی که قبلا از طریق متد subscribe در Observable ثبت شدهاند، تحویل داده میشود.
- کلاس Subscriber<T>: شامل متد onNext است که Observable با فراخوانی این متد، شیهای push شده را تحویل میدهد.
- کلاس Transformer<T,I>: شامل متد transform است که ورودی از نوع I را به خروجی از نوع T تبدیل میکند.
- کلاس TrafficInfo: شامل اطلاعات مربوط به ترافیک است.
- کلاس Program: شامل یک مثال برای کمک به تکمیل برنامه است.
آنچه باید پیادهسازی شود:
- کلاس Context<T,I>: این کلاس زنجیرهای از فراخوانیها را میسر میکند که شامل متدهای زیر است.
- متد observable: یک شی از نوع Observable میگیرد و آن را ثبت میکند.
- متد transformer: یک شی از نوع Transformer میگیرد و آن را ثبت میکند.
- متد subscriber: یک شی از نوع Subscriber میگیرد و در Observable آن را subscribe میکند. این متد ممکن است (برای subscriberهای مختلف) چندین بار فراخوانی شود (به مثال موجود در کلاس Program دقت کنید).
- متد run: یک لیست از ورودی از نوع I میگیرد و پس از transform هر یک، آنها را به observable ای که ثبتشده است، push میکند. این متد به زنجیرهی فراخوانیها پایان میدهد. ترتیب ورودیها مهم است.
دقت کنید که این کلاس باید کاملا به صورت عام (Generic) تعریف شود و باید در بستهی ir.javacup.traffic قرار گیرد.
- کلاس TrafficObservable: باید با توجه به سازوکار یک Observable همانطور که توضیح داده شد، کار کند. این کلاس باید در بستهی ir.javacup.traffic.impl قرار گیرد.
- کلاس TrafficInfoTransformer: ورودی متد transform یک رشته شامل فیلدهای کلاس TrafficInfo است که با ویرگول (,) و بدون فاصله از هم جدا شدهاند و کل این رشته به صورت Base64 رمز شده است. اگر ورودی به هر نحوی نامعتبر (ورودی base64 نباشد، ورودی پس از رمزگشایی شامل ویرگول نباشد و …) باشد، متد transform باید یک استثنا از نوع IllegalArgumentException با متن مناسب پرتاب کند.
این کلاس باید در بستهی ir.javacup.traffic.impl قرار گیرد.
راهنمایی: با اجرای متد main از کلاس Program خروجی زیر باید بدست آید:
#1: TrafficInfo[locationCode=10201, trafficLevel=3] #2: TrafficInfo[locationCode=10201, trafficLevel=3] #1: TrafficInfo[locationCode=10451, trafficLevel=9] #2: TrafficInfo[locationCode=10451, trafficLevel=9]
آنچه باید آپلود شود:
یک فایل زیپ شامل بستهی ir.javacup.traffic است. به صورتی که وقتی فایل زیپ را باز میکنیم، دقیقا شاخهی ir را ببینیم که درون آن شاخهی javacup و درون آن نیز شاخهی traffic قرار دارد. در داخل شاخهی traffic فایل Context.java و شاخهی impl وجود دارد. در داخل شاخهی impl باید دو فایل TrafficObservable.java و TrafficInfoTransformer.java وجود داشته باشد.
برای داوری تمرین، میتوانید پاسخ خود را در سایت Quera به نحوی که در بالا گفته شد، بارگذاری کنید.
برای آشنایی با نحوهی ارسال پاسخ در Quera، این مطلب را مطالعه کنید.
با ما همراه باشید:
آدرس کانال تلگرام: IranianJavaDevelopers@
آدرس اکانت توییتر: JavaCupIR@
آدرس صفحه اینستاگرام: javacup.ir
آدرس گروه لینکدین: Iranian Java Developers