Pisząc aplikację na system Android w Javie mamy sporo kodu, który jest niezbędny do tego, aby aplikacja musiała poprawnie się skompilować. Jest to uwarunkowane w samym języku. Niestety przez to musimy napisać sporo kodu lub jest generowany automatycznie przez IDE. Wadą tego jest nieczytelność, powtarzalność kodu, z którego i tak musimy skorzystać. Taka sytuacja nazywa się Boilerplate.
W tym wpisie pokaże Ci, w jaki sposób możesz zoptymalizować i przyspieszyć pisanie kodu za pomocą biblioteki Butter Knife (może wielu z Was ją zna, a dla tych, którzy ją nie znają na pewno przypadnie do gustu).
Czym jest boilerplate code?
Boilerplate code nie ma nic wspólnego z wydajnością i oznacza standardowy kod, który jest potrzebny do uruchomienia aplikacji. Jest to kod, prawie identyczny w każdej aplikacji. Taki kod jest nudny, powtarzalny, zaśmiecający czytelność klas. I co najgorsze, nie można z niego zrezygnować. Ponieważ jest potrzebny, aby połączyć w całość pozostałe fragmenty aplikacji. Boilerplate w Androidzie może to być metoda findViewById(), z której i tak musisz skorzystać, a dodatkowo generuje sporo kodu.
Butter Knife
Biblioteka Butter Knife pomoże nam skrócić nasz kod oraz poprawi czytelność kodu. Sama biblioteka służy do „wstrzykiwania” widoków w Androidzie za pomocą adnotacji (Annotation Processing). Zobaczmy jak to w praktyce wygląda.
W standardowy sposób kod może wyglądać następująco::
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView textView = findViewById(R.id.text); Button button = findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { buttonClick("Click"); } }); textView.setText("Text"); } private void buttonClick(String text) { Toast.makeText(MainActivity.this, text, Toast.LENGTH_SHORT).show(); } }
A po zastosowaniu biblioteki i modyfikacji kodu może on wyglądać tak:
public class MainActivity extends Activity { @BindView(R.id.text) TextView textView; // Dawniej findViewById @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Wymagana inicjacja ButterKnife.bind(this); // Tutaj bez zmian textView.setText("Text"); } // Akcja po klknięciu @OnClick(R.id.button) void buttonClick() { Toast.makeText(MainActivity.this, "Click", Toast.LENGTH_SHORT).show(); } }
Prawda, że proste i wygodne? Jeżeli chcemy skorzystać z tego narzędzia we fragmencie musisz użyć:
ButterKnife.bind(this, view);
zamiast
ButterKnife.bind(this);
Oczywiście to nie koniec możliwości tej biblioteki. Jakie jeszcze możemy mieć adnotacje?
@BindString() @BindDrawable() @BindColor() @BindDimen() @OnLongClick @OnItemClick ...
i wiele innych.
Podsumowanie
Usuwanie boilerplate z naszego kodu jest bardzo przydatne. Dzięki temu nasz kod jest bardziej czytelniejszy i łatwiej nad nim zapanować. Korzystanie z biblioteki Butter Knife jest bardzo proste, intuicyjne, a korzyści naprawdę spore. Każda biblioteka ma swoje plusy i minusy, dlatego nie dla każdych rozwiązań nadaje się to rozszerzenie, więc za nim włączysz ją do swojego projektu, pomyśl, czy warto. Nie zmienia to faktu, że też trzeba pamiętać o stosowaniu wzorców projektowych.