Autor wpisu: sokzzuka, dodany: 02.10.2011 23:50, tagi: php
Tak przy okazji refleksji i rozmyślań filozoficznych, postanowiłem zademonstrować, jak w języku pokroju Javy zaimplementować rozwiązanie problemu obliczania ceny wszystkich produktów w koszyku.
Proceduralnie:
public class Produkt { private Integer cena = 0; private Integer ilosc = 0; private String nazwa = ""; public Produkty(Integer cena, Integer ilosc, String nazwa); /** tu gettery i settery dla wszystkich parametrow parametrow **/ } public class Koszyk { private List<Produkt> produkty; public List<Produkty> getProdukty(); public void setProdukty(List<Produkty> produkty); } public class KoszykUtil { public static Integer podliczKoszyk(Koszyk koszyk){ List<Produkty> produkty = koszyk.getProdukty(); Integer suma = 0; for(Produkt produkt: produkty){ suma+= produkt.getCena() * produkt.getIlosc(); } return suma; } } Produkt p1 = new Produkt(12, 1, "baton z ropą"); Produkt p2 = new Produkt(13, 1, "baton z benzyną"); List<Produkty> produkty = new ArrayList<Produkty>(); produkty.add(p1); produkty.add(p2); Koszyk k = new Koszyk(); k.setProdukty(produkty); Integer suma = KoszykUtil.podliczKoszyk(k); System.out.println(suma);
Obiektowo:
public class Produkt { private final String nazwa; private final Integer cena; private Integer ilosc; public Produkt(String nazwa, Integer cena, Integer ilosc); public Integer suma(){ return cena*ilosc; } } public class Koszyk { private List<Produkt> produkty; private Integer wartosc = 0; public dodajProdukt(Produkt produkt){ produkty.add(produkt); wartosc += produkt.suma(); } public Integer wartosc(){ return wartosc(); } } Koszyk k1 = new Koszyk(); Produkt p1 = new Produkt("baton z benzyna" , 10, 1); Produkt p2 = new Produkt("baton z ropą", 10, 1); k1.dodajProdukt(p1); k1.dodajProdukt(p2); Integer suma = k1.wartosc(); System.out.println(suma);
Funkcyjne:
public interface Sumator<D> { public Integer sumuj(Integer suma, D element); } public class Util { public static <T> Integer sumuj(Sumator s, List<T> dane) { Integer suma = 0; for (T element : dane) { suma = s.sumuj(suma, element); } return suma; } } public final class Produkt { public final Integer cena; public final String nazwa; public Produkt(String nazwa, Integer cena){ this.nazwa = nazwa; this.cena = cena; } } Produkt p1 = new Produkt("baton z ropą", 10); Produkt p2 = new Produkt("baton z benzyna", 10); List<Produkt> produkty = new ArrayList<Produkt>(); produkty.add(p1); produkty.add(p2); produkty = java.util.Collections.unmodifiableList(produkty); Integer suma = Util.sumuj(new Sumator<Produkt>() { @Override public Integer sumuj(Integer suma, Produkt element) { return suma + element.cena; } }, produkty); System.out.println(suma);
Czego można dowiedzieć się z tych prostych przykładów ? Otóż można zauważyć w każdym z nich cechy charakterystyczne danego stylu programowania i tego na co kładzie nacisk.
- Proceduralny – stawia na swobodny przepływ danych.
- Obiektowy – abstrakcja, enkapsulacja, odwzorowanie modelu domeny
- Funkcyjny – niezmienność (immutability), generyczność i funkcja jako pełnoprawny element języka (tutaj emulowana przez anonimową klasę)
Mam nadzieje, że powyższe przykłady były pouczające.Jestem bardzo ciekawy, które z powyższych rozwiązań przypadło Wam do gustu i dlaczego, oraz jaki styl preferujecie.