بسیار دیده ام که برنامه نویسان به هر قیمتی سعی در جلوگیری از کرش ها  می کنند. اما اکسپشن هایی را که نمی شود کنترل کرد واقعا آزار دهنده هستند؟ و در این مورد چک کردن null ها جواب ما است ؟ 

در حقیقت، در بعضی مواقع عمدا میخواهید که اپ شما کرش کند. این پست به شما توضیح خواهد داد که چرا ، و به شما نیز چند نکته ی کاربردی پیشنهاد می دهد.

پیش در آمد

در این پست بر روی چک کردن فیلدهای خالی برای راحتی تمرکز کرده است، اما می توان به راحتی به مباحث دیگر نیز عمومی سازی کرد.


ساختار چک کردن فیلد های خالی 

(THE NULL CHECK ARCHITECTURE)


در حال حاضر ما یک اپلیکیشن ساده داریم که فقط لیستی از بازیکنان فوتبال را نشان می دهد:

public void showPlayers(List<Player> soccerPlayers) {
 if (soccerPlayers == null) return;
 // some awesome code here
}

همه چی حل شد!

نه صبر کنید… لیست می تواند خالی هم باشد:

public void showPlayers(List<Player> soccerPlayers) {
 if (soccerPlayers == null || soccerPlayers.isEmpty()) return;

 // some awesome code here
}

حال در مورد آن پنج لایه ای آرتیتکت بازیکنان فوتبال که در زیر ui قرار دارند چی ؟ آیا باید در هر لایه از آنها چک کردن خود را قرار بدهیم؟

قبل از آنکه بدانید باید چک کردن فیلد خالی را در همه جا اعمال کنید!


مشکل چک کردن فیلد خالی

واضح است که، چک کردن فیلد های خالی کد های شما را به طور قابل ملاحظه ای در هم و برهم می کند.

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

public void showPlayers(List<Player> soccerPlayers) {
 if (soccerPlayers == null) return;

 if (myRecyclerView == null) return;

 if (myRecyclerView.getAdapter() == null) return;

 // some awesome code here
}

حتی وقتی که به آنها احتیاج نداشته باشید، شما هنوز هم آن را اضافه می کنید… اجازه دهید لحظه ای عمیق تر شوید. مشکل دقیقا کجاست؟

ایا soccerPlayers می توانند از اول خالی باشند؟ چه اتفاقی رخ می دهد وقتی که soccerPlayers کلا خالی باشد؟مطمئنا به کاربر یک صفحه ی کاملا خالی نشان می دهد.

کرش کردن برای نجات

اگر اپلیکیشن شما به مرحله ای برود که برای آن طراحی نشده است، باید کرش کند. هیچ راه عمومی برای رسیدگی به آن نیست.متدها نباید ورودی های خود را چک کنند برای هر سناریو که ممکن است اتفاق بیافتد. به جای آن، شما باید دقت کنید که آن ورودی چیست و برای آن آماده باشید.


اکسپشن های غیرمنتظر خوب هستند برای اینکه :

  • با کرش کردن اپلیکیشن بلافاصله به شما اطلاع میدهند.
  • مشکلات را هایلایت میکند به جای آنکه به صورت پنهان باشند.
  • مشکل را دنبال کنید تا به آن برسید.
  • به کرش ریپورت شما فرستاده می شود .
نکات کاربردی

برای آنکه این قسمت برای شما قابل هضم تر شود و به شما در اجرای این کارها کمک شود :
همیشه اپلیکیشن خود را طوری دیزاین کنید که ورودی های غیر قابل کنترل جلوگیری شود: 

اگر شما اطمینان ندارید که ارور خاصی می تواند جایی اتفاق بیافتد، در نظر بگیرید که اتفاق نمی افتد! در طول تست کردن متوجه می شوید (RuntimeException) 

با اطمینان از درستی دیتا در همان ورود اول در اپ شما. این راه دیتا های بی اعتبار(null, empty,..)

اگر یک متد خاص نمی تواند در عمل صدا زده شود، و یک بار می تواند فقط صدا زده شود،… throw an IllegalStateException

همیشه کاملا تست کنید قبل از آنکه به طرف کاربران خود بفرستید.

جمع بندی

به جای آنکه از کرش کردن بترسید، باید آنها را به سرعت پیدا کرده. کرش ها نه تنها ارور ها را ظاهر می کنند، بلکه یک راه راحت برای دیباگ کردن آنها با stacktrace می باشد.


منبع : http://jeroenmols.com