Omówienie aplikacji domowej

Rozpoczynając trzeci tydzień kurs czas na podsumwanie aplkacji domowej, która była zadana na sam koniec drugiego tygodnia – jeżeli przypadkiem ją pominąłeś to wróć do niej oraz spróbuj samodzielnie je rozwiązać.

Cel

Celem zadania było stworzeniem czterech klas z konkretnymi polami:

User z id, login, password:

public class User {
    Long id;
    String login;
    String password;

    public User(Long id, String login, String password) {
        this.id = id;
        this.login = login;
        this.password = password;
    }
}

Product z id, productName, price, weight, color i productCount.

public class Product {
    Long id;
    String productName;
    Float price;
    Float weight;
    String color;
    Integer productCount;

    public Product(Long id, String productName, Float price, Float weight, String color, Integer productCount) {
        this.id = id;
        this.productName = productName;
        this.price = price;
        this.weight = weight;
        this.color = color;
        this.productCount=productCount;
    }
}

Cloth z size i material – dziedzicząca po Product.

public class Cloth extends Product {
    String size;
    String material;

    public Cloth(Long id, String productName, Float price, Float weight, String color, Integer productCount, String size, String material) {
        super(id, productName, price, weight, color, productCount);
        this.size = size;
        this.material = material;
    }
}

Boots z size i isNaturalSkin – również dziedzicząca po Product.

Założeniem było również to, że wartości wszystkich pól możemy odczytać zaś modyfikować tylko price i productCount.

Dlatego wszystkie pola w klasach będą private oraz stworzone dla nich gettery, które pozwolą odczytywać tylko wartości.

Dla pól price productCount dodatkowo zostaną utworzone settery, które będą pozwalały ustawiać nam wartości.

Klasa User:

public class User {
    private Long id;
    private String login;
    private String password;

    public User(Long id, String login, String password) {
        this.id = id;
        this.login = login;
        this.password = password;
    }

    public Long getId() {
        return id;
    }

    public String getLogin() {
        return login;
    }

    public String getPassword() {
        return password;
    }
}

Klasa Product pozwalająca dodatkowo ustawiać cenę oraz ilość produktu.

public class Product {
    private Long id;
    private String productName;
    private Float price;
    private Float weight;
    private String color;
    private Integer productCount;

    public Product(Long id, String productName, Float price, Float weight, String color, Integer productCount) {
        this.id = id;
        this.productName = productName;
        this.price = price;
        this.weight = weight;
        this.color = color;
        this.productCount=productCount;
    }

    public void setPrice(Float price) {
        this.price = price;
    }

    public void setProductCount(Integer productCount) {
        this.productCount = productCount;
    }

    public Long getId() {
        return id;
    }

    public String getProductName() {
        return productName;
    }

    public Float getPrice() {
        return price;
    }

    public Float getWeight() {
        return weight;
    }

    public String getColor() {
        return color;
    }

    public Integer getProductCount() {
        return productCount;
    }
}

Klasa Cloth:

public class Cloth extends Product {
    private String size;
    private String material;

    public Cloth(Long id, String productName, Float price, Float weight, String color, Integer productCount, String size, String material) {
        super(id, productName, price, weight, color, productCount);
        this.size = size;
        this.material = material;
    }

    public String getSize() {
        return size;
    }

    public String getMaterial() {
        return material;
    }
}

Klasa Boots:

public class Boots extends Product {
    private Integer size;
    private boolean isNaturalSkin;

    public Boots(Long id, String productName, Float price, Float weight, String color, Integer productCount, Integer size, boolean isNaturalSkin) {
        super(id, productName, price, weight, color, productCount);
        this.size = size;
        this.isNaturalSkin = isNaturalSkin;
    }

    public Integer getSize() {
        return size;
    }

    public boolean isNaturalSkin() {
        return isNaturalSkin;
    }
}

toString()

Aby móc łatwiej sprawdzać stany obiektów w dalszym developowaniu aplikacji należało stworzyć metody toString(), które zwracają Stringa wraz z wartościami pól obiektu.

Jest to ostatnie zadanie, dlatego klasy ostatecznie wyglądają tak:

User:

package pl.maniaq.entity;

public class User {
    private Long id;
    private String login;
    private String password;

    public User(Long id, String login, String password) {
        this.id = id;
        this.login = login;
        this.password = password;
    }

    public Long getId() {
        return id;
    }

    public String getLogin() {
        return login;
    }

    public String getPassword() {
        return password;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", login='" + login + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

Product:

package pl.maniaq.entity;

public class Product {
    private Long id;
    private String productName;
    private Float price;
    private Float weight;
    private String color;
    private Integer productCount;

    public Product(Long id, String productName, Float price, Float weight, String color, Integer productCount) {
        this.id = id;
        this.productName = productName;
        this.price = price;
        this.weight = weight;
        this.color = color;
        this.productCount=productCount;
    }

    public void setPrice(Float price) {
        this.price = price;
    }

    public void setProductCount(Integer productCount) {
        this.productCount = productCount;
    }

    public Long getId() {
        return id;
    }

    public String getProductName() {
        return productName;
    }

    public Float getPrice() {
        return price;
    }

    public Float getWeight() {
        return weight;
    }

    public String getColor() {
        return color;
    }

    public Integer getProductCount() {
        return productCount;
    }


    @Override
    public String toString() {
        return "Product{" +
                "id=" + id +
                ", productName='" + productName + '\'' +
                ", price=" + price +
                ", weight=" + weight +
                ", color='" + color + '\'' +
                ", productCount=" + productCount +
                '}';
    }
}

Cloth

package pl.maniaq.entity;

public class Cloth extends Product {
    private String size;
    private String material;

    public Cloth(Long id, String productName, Float price, Float weight, String color, Integer productCount, String size, String material) {
        super(id, productName, price, weight, color, productCount);
        this.size = size;
        this.material = material;
    }

    public String getSize() {
        return size;
    }

    public String getMaterial() {
        return material;
    }

    @Override
    public String toString() {
        return super.toString() + "Cloth{" +
                "size='" + size + '\'' +
                ", material='" + material + '\'' +
                '}';
    }
}

Boots

package pl.maniaq.entity;

public class Boots extends Product {
    private Integer size;
    private boolean isNaturalSkin;

    public Boots(Long id, String productName, Float price, Float weight, String color, Integer productCount, Integer size, boolean isNaturalSkin) {
        super(id, productName, price, weight, color, productCount);
        this.size = size;
        this.isNaturalSkin = isNaturalSkin;
    }

    public Integer getSize() {
        return size;
    }

    public boolean isNaturalSkin() {
        return isNaturalSkin;
    }

    @Override
    public String toString() {
        return super.toString() + "Boots{" +
                "size='" + size + '\'' +
                ", isNaturalSkin=" + isNaturalSkin +
                '}';
    }
}

GIT

Podczas pisania aplikacji robiłem commity – nie robiłem jednego dużego, dzięki temu mogłem wrócić do każdego z commita i odzwierciedlić sytuację.

W tym przypadku ze względu, że klasy są modelami to commitowałem po stworzonej klasie. Czyli wpisując np.:

git add *
git commit -m "User entity created"

W innych przypadkach raczej commituję co jeden większy krok, który umożliwia mi przybliżenie się do stworzenia featura nad, którym pracuję. Taki feature może składać się z kilku/kilkunastu kroków (czyli commitów). Samemu trzeba wyczuć kiedy warto zapisać zmiany, głównym celem gita jest wersjonowanie kodu, czyli łatwiej powroty do wcześniejszych fragmentów. To my osobiście musimy zdecydować czy to jest punkt, od którego możemy zacząć kolejny etap tworzenia featura. 😉

Po stworzeniu wszystkich klas wypchnąłem zmiany na zewnętrzne repozytorium git przy użyciu komendy:

git push origin master

I zmiany wszystkie pojawiły się w repozytorium na GitHub. 😉

Uwagi…

Jak widać na w ostatecznym kodzie klas widać na samej górze, że klasy znajdują się w paczce pl.maniaq.entity – czyli dokładnie w paczce entity. Warto trzymać w jednej paczce klasy odpowiedzialne za przetrzymywanie informacji – tzw. modele lub entity.

Widziałem kilka rozwiązań, które tworzyły konstruktor bezparametrowy, którego u mnie nie ma. Nie ma, ponieważ chcę uniemożiwić tworzenie obiektów bez podania wymaganych przeze mnie pól. Możemy właśnie tak to identyfikować – konstruktor parametrowy, służy do tego, aby wymusić inicjalizację pewnego pola. Jeżeli samo pole nie jest wymagane może nie powinno faktycznie być w konstruktorze, ale być opcjonalnie ustawiane z poziomu metody set?

Podsumowanie

To na tyle na temat aplikacji domowej z drugiego tygodnia, jeżeli jest wszystko dla Ciebie jasne to czas na podjęcie nauki w trzecm tygodniu. Jeśli masz jakieś pytania to zadaj je już teraz lub najpierw spróbuj wrócić do lekcji z drugiego tygodnia – możliwe, że jakieś zagadnienie pominąłeś lub nie jest do końca jasne – o tym też pisz. 😉

Kamil Klimek

Od 2016 jestem programistą Java. Przez pierwsze 4 lata pracowałem jako Full Stack Java Developer. Później postanowiłem postawić nacisk na Javę, żeby jeszcze lepiej ją poznać.

Subscribe
Powiadom o
guest
0 komentarzy
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x