Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проект на собеседование, нужна критика 
V
    Опции темы
Che0
Дата 24.2.2011, 01:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 1.11.2010

Репутация: нет
Всего: нет



Я студент, в пятницу собеседование на junior java developer.
дали на дом написать проект :Создать Иерархию конфет и прочих сладостей. создать неколько обьектов-конфет.собрать детский подарок с определением его веса.

При этом не использовать никаких внешних источников данных, то есть тупо показать знания ооп.

вот что я навоял за сегодня тут весь проект:мой проект
и основные классы еще так выложу.
 
нужна критика очень нужна:что не так, что не совсем так, что совсем  не так?
и как сделать чтоб красиво и правильно?

оставил пару коментов что как мне кажеться лучше переделать.
И еще надо вставить исключительные ситуации,  интерфейсы, и может еще че, но это уже завтра.Очень был бы рад если бы подсказали куда привинтить интрефейс , сам думаю  создать интерфэйс с методами добавки примисей типа Chocolate.add(орехи), там надо бы параметризацию что б нельзя было бобавить орехи в карамель, которую я не помню как делать, если подскажете тоже буду рад; 

 Ввобщем вот:
Код

package by.bsuir.sweetgift.run;

import by.bsuir.sweetgift.giftgenerate.GiftGenerate;
import by.bsuir.sweetgift.report.Report;
import by.bsuir.sweetgift.sweets.Caramel;
import by.bsuir.sweetgift.sweets.Chocolate;
import by.bsuir.sweetgift.sweets.Sweet;
import by.bsuir.sweetgift.sweets.Wafer;

public class Run {

    /**
     * @param args
     */
    //надо доделать проверку на соответствие nameSweet и typeSweet, что бы нельзя было создать класс Chocolate,
    //а в качестве параметра nameSweet в конструкторе ввести Caramel
    
    //s
    public static void main(String[] args) {
        Sweet type1=new Caramel("Caramel",10);
        Sweet type2=new Wafer("wafer",2);
        Sweet type3=new Chocolate("chocolate",2);
        
        GiftGenerate gift1=new GiftGenerate();
        gift1.add(type1);
        gift1.add(type2);
        gift1.add(type3);
        
        Report report1=new Report(gift1);
        report1.print();
    
        
    }

}

Код

package by.bsuir.sweetgift.sweets;

import by.bsuir.sweetgift.enums.Esweets;

public abstract class Sweet {
    private double weight;
    private double costGrarm;
    
    private String nameSweet;
    private int countSweet;
    
    

    public Sweet(String nameSweet,int countSweet){
        if(!nameSweet.isEmpty()&& countSweet>0){
            this.nameSweet=nameSweet;
            this.countSweet=countSweet;
            weight=Esweets.getWeight(nameSweet);
            costGrarm=Esweets.getCostGram(nameSweet);
        }
        
        
    }
    //validate перенести в класс GiftGenerate
    public abstract int calcCost();
    public abstract boolean  validate(String nameSweet) ;//may be in class GiftGenerate

    public double getWeight() {
        return weight;
    }

    public String getNameSweet() {
        return nameSweet;
    }

    public int getCountSweet() {
        return countSweet;
    }

    
    public double getCostGrarm() {
        return costGrarm;
    }
    
    

}


Код

package by.bsuir.sweetgift.sweets;

import by.bsuir.sweetgift.enums.Esweets;

public class Chocolate extends Sweet{
    
    final private String TYPE_SWEET="Chocolate";
    //надо доделать проверку на соответствие nameSweet и typeSweet, что бы нельзя было создать класс Chocolate,
    //а в качестве параметра nameSweet в конструкторе ввести Caramel
    public Chocolate(String nameSweet,int countSweet){
        super(nameSweet,countSweet);
        validate(nameSweet);//validate don't use
    }
    
    public int calcCost(){
        return (int)(getCostGrarm()*getWeight());
    }
    
    public boolean validate(String nameSweet) {
        if (TYPE_SWEET.equalsIgnoreCase(Esweets.getTypeSweet(nameSweet) )){
            return true;
    }return false;
    }

}


еще анологичные Chocolate, классы Caramel, Wafer, Zephyr
дальше 
Код

package by.bsuir.sweetgift.giftgenerate;

import java.util.ArrayList;

import by.bsuir.sweetgift.sweets.Sweet;



public class GiftGenerate {
    private ArrayList<Sweet> sweets = new ArrayList<Sweet>();
//сюда наверное надо перенести метод validate 
    
    public int calcCost(){
        int price=0;
        for(int i = 0; i < sweets.size();i++){
            price +=sweets.get(i).calcCost()*sweets.get(i).getCountSweet();///!!!Warning
        }
        return price;
    }
    
    public double calcWeight(){
        int weightGift=0;
        for(int i = 0; i < sweets.size();i++){
            weightGift +=sweets.get(i).getWeight()*sweets.get(i).getCountSweet();
        }
        return weightGift;
    }
    public int calcCount(){
        int count=0;
        for(int i = 0; i < sweets.size();i++){
            count +=sweets.get(i).getCountSweet();
        }
        return count;
    }
    
    
    public void add (Sweet sweet){
        sweets.add(sweet);
    }
    
    public int getSize (){
        return sweets.size();
    }
    
    public Sweet getObject(int i){
        return sweets.get(i);
    }
}



Код

package by.bsuir.sweetgift.report;

import by.bsuir.sweetgift.giftgenerate.GiftGenerate;

public class Report {
    
    private GiftGenerate gift;
    
    private final String PRICE=" Price: ";
    private final String WEIGHT=" Weight: ";
    private final String ALL="\nAll";
    private final String COUNT=" Count: ";
    
        
    public Report(GiftGenerate gift){
            this.gift=gift;
    }
        
    public void print(){
        for(int i=0;i < gift.getSize();i++){
            
            System.out.println(gift.getObject(i).getClass().getSimpleName()                
                                        +PRICE+gift.getObject(i).getCostGrarm()+WEIGHT+gift.getObject(i).getWeight()+
                                        COUNT+gift.getObject(i).getCountSweet());
        }
        System.out.println(ALL+PRICE+gift.calcCost()+ALL+WEIGHT+gift.calcWeight()+ALL+COUNT+gift.calcCount());    
    }
}


Код

package by.bsuir.sweetgift.enums;



public enum Esweets {
    CARAMEL("Caramel","Caramel",5,10), //name, weight, cost of 1 gram;
    CHOCOLATE("Chocolate","Chocolate",20,20),
    WAFER("Wafer","Wafer",45,200),
    ZEPHYR("Zephyr","Zephyr",50,100);
    private final String nameSweet;
    private final String typeSweet;
    private final double weight;
    private final int costGram;
    
    private Esweets(String nameSweet,String typeSweet,double weight, int costGram){
        this.nameSweet=nameSweet;
        this.typeSweet=typeSweet;
        this.weight=weight;
        this.costGram=costGram;
        
    }//!!! два лишних раза используеться цикл for 
    static public double getWeight(String nameSweet){
        for(Esweets object:Esweets.values()){
            if(object.nameSweet.equalsIgnoreCase(nameSweet))
                return object.weight;
        }
        return 0;
    }
    
    static public int getCostGram(String nameSweet){// !!!may be one for
        for(Esweets object:Esweets.values()){
            if(object.nameSweet.equalsIgnoreCase(nameSweet))
                return object.costGram;
        }
        return 0;
    }
    
    static public String getTypeSweet(String nameSweet){// !!!may be one for
        for(Esweets object:Esweets.values()){
            if(object.nameSweet.equalsIgnoreCase(nameSweet))
                return object.typeSweet;
        }
        return null;
    

}
}



PM MAIL   Вверх
Temdegon
Дата 24.2.2011, 06:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.10.2008
Где: Minsk

Репутация: 7
Всего: 9



Я не гуру, но выскажу свое мнение.
Мне класс Sweet кажется странным. По смыслу,  это должна быть некая абстрактная конфета, ОДНА конфета. А у тебя получается, что это вовсе не конфета, а пачка конфет. Если задание звучит именно так, как ты написал, то я бы убрал количество из самой конфеты. Т.е. хочешь положить в подарок 10 шоколадных конфет - создаешь 10 экземпляров и добавляешь.
Название GiftGenerate мне тоже кажется странным. Почему не назвать просто Gift или SweetGift?
Мне кажется, что нужно проверять аргументы конструктора на null. Да и не только конструктора, и не только на null =) и бросать InvalidArgumentException или какие-то свои исключения. Но тут надо без фанатизма, в меру.
Еще я бы переопределил equals(), hashcode() и toString() у Sweet.
Javadoc - комментарии написал бы.
Код

private ArrayList<Sweet> sweets = new ArrayList<Sweet>(); 

так писать не стоит. нужно использовать интерфейс Collection или List.
P.S.> А где это в Минске такие задания дают, если не секрет?
PM MAIL   Вверх
aleksandy
Дата 24.2.2011, 06:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 260
Регистрация: 17.12.2006

Репутация: 4
Всего: 5



1. Sweet - это интерфейс, а то, что у тебя написано, - это AbstractSweet. Далее Caramel, Chocolate, Wafer, Zephyr - абстрактные наследники AbstractSweet. А вот от них уже реализовывать конкретные конфеты, шоколадки и прочее...

2. Report по-умному должен бы работать хотя бы через String.format(), но лучше через  MessageFormatter.
3. У enum-ов есть замечательный метод valueOf(String).
PM   Вверх
Che0
Дата 24.2.2011, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 1.11.2010

Репутация: нет
Всего: нет



2 Temdegon, это на  Epam дают такие задания, не совсем на работу это на курсы с  возможным последующим трудоустройством))
Цитата

Мне кажется, что нужно проверять аргументы конструктора на null. Да и не только конструктора, и не только на null =) и бросать InvalidArgumentException или какие-то свои исключения. Но тут надо без фанатизма, в меру.
Еще я бы переопределил equals(), hashcode() и toString() у Sweet.

Я просто ничего не переопределял никогда, за день врятли разберусь что да как, может если не сложно маломальский пример приминительно моего проекта?
И c Эксэпшеннами анологично: почти не работал и с ними.
PM MAIL   Вверх
_Y_
Дата 24.2.2011, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 5
Всего: 34



Цитата(Temdegon @ 24.2.2011,  06:17)
Код
private ArrayList<Sweet> sweets = new ArrayList<Sweet>();

так писать не стоит. нужно использовать интерфейс Collection или List.

Обясни, пожалуйста, почему.

Я этими вещами с ArrayList тоже никогда не загружаюсь. Может зря.

Это сообщение отредактировал(а) _Y_ - 24.2.2011, 09:46


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
Che0
Дата 24.2.2011, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 1.11.2010

Репутация: нет
Всего: нет



вот я сделал String.Format вот так нормально?
Код

String message=String.format("All price %1$s All weight %2$s",gift.calcCost(),gift.calcWeight());
        System.out.println(message);    


Это сообщение отредактировал(а) Che0 - 24.2.2011, 10:32
PM MAIL   Вверх
LSD
Дата 24.2.2011, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(_Y_ @  24.2.2011,  09:40 Найти цитируемый пост)
Обясни, пожалуйста, почему.

Например чтобы можно было заменить реализацию. Вот понадобится тебе синхронизированный список или не модифицируемый. И придется менять объявление и все сигнатуры методов, которые его используют.

Например тот же Hibernate явно запрещает объявлять поля с конкретными классами коллекций, только базовые интерфейсы.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Che0
Дата 24.2.2011, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 1.11.2010

Репутация: нет
Всего: нет



И насчет эксэпшенов: зачем проверять если у меня  параметры задаються через конструктор, задать не тот тип или null нельзя  и так
Или я что то не так понял?? 
PM MAIL   Вверх
_Y_
Дата 24.2.2011, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 5
Всего: 34



Che0, ты меня не слушай. То, что Temdegon с LSD говорят для твоего случая подходит без обсуждений. Я эти вопросы задаю с целью повышения лично своего морального уровня.


Цитата(LSD @ 24.2.2011,  11:51)
Например чтобы можно было заменить реализацию. Вот понадобится тебе синхронизированный список или не модифицируемый.

Что касается всяких других коллекций, я согласная. Хоть и такие надобы чрезвычайно редки у меня. А вот ArrayList в 99% случаев используется только как массив переменной длины. Нужно ли снижать читаемость кода в угоду религиозно-идеологическим убеждениям?

Цитата(LSD @ 24.2.2011,  11:51)
Например тот же Hibernate явно запрещает...

Здесь я могу только согласиться; по той простой прочине, что с Hibernate не работал.

Это сообщение отредактировал(а) _Y_ - 24.2.2011, 14:07


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
Temdegon
Дата 24.2.2011, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.10.2008
Где: Minsk

Репутация: 7
Всего: 9



Цитата

И насчет эксэпшенов: зачем проверять если у меня  параметры задаються через конструктор, задать не тот тип или null нельзя  и так
Или я что то не так понял??  

Если вместо первого аргумента передать null, то в строке 
if(!nameSweet.isEmpty()&& countSweet>0){
вылетит NullPointerException

Цитата

Что касается всяких других коллекций, я согласная. Хоть и такие надобы чрезвычайно редки у меня. А вот ArrayList в 99% случаев используется только как массив переменной длины. Нужно ли снижать читаемость кода в угоду религиозно-идеологическим убеждениям?

А в чем ухудшение читабельности, если вы обьявите List list = new ArrayList() ? по мне так одно и то же. Ну и массивы же можно по разному использовать, и для одних задач лучше подойдет LinkedList, чем ArrayList
PM MAIL   Вверх
LSD
Дата 24.2.2011, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(_Y_ @  24.2.2011,  14:06 Найти цитируемый пост)
А вот ArrayList в 99% случаев используется только как массив переменной длины. Нужно ли снижать читаемость кода в угоду религиозно-идеологическим убеждениям?

А в чем снижение читабельности?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Che0
Дата 24.2.2011, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 1.11.2010

Репутация: нет
Всего: нет



по аналогии в енаме null первые два параметра тоже ошибку выбивают.
 и какие еще опасные места и какие там ошибки ,посоветуейте, а то я их в упор не вижу?

Это сообщение отредактировал(а) Che0 - 24.2.2011, 18:42
PM MAIL   Вверх
Che0
Дата 24.2.2011, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 1.11.2010

Репутация: нет
Всего: нет



И еще вопрос, если я не использую нигде хэшкод и иклс то зачем мне его переопределять?

PM MAIL   Вверх
Temdegon
Дата 24.2.2011, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.10.2008
Где: Minsk

Репутация: 7
Всего: 9



Можно конечно не переопределять. Но с такой же позиции, можно и исключения не обрабатывать, и параметры не проверять, ссылаясь на то, что "ну я же буду передавать правильные аргументы!". 
Если вы пишете класс, то подразумевается, что пользовать его можете не только вы, а любой другой программист. Sweet - это сущность. Обычно такие классы загружаются/сохраняются, хранятся в коллекциях, сравниваются. Что бы их можно было легко и правильно сравнивать, нужно переопределить equals. Что бы хранить в коллекциях типа HashMap и HashSet нужен hashCode. toString, даже в примитивном виде тоже весьма полезен. Когда вам нужно будет вывести что-то в лог, вам не нужно будет постоянно  писать фигню типа
Код

Sysetm.out.println(sweet.getId() + " "  +sweet.getName() + " " + sweet.getCount());

а просто
Код

Sysetm.out.println(sweet);


PM MAIL   Вверх
_Y_
Дата 25.2.2011, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 5
Всего: 34



Temdegon, LSD, вряд ли вы меня убедите, что кастинг классов улучшает читабельность кода. ИМХО где он нужен - там нужен, а где нет - нафиг.


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0644 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.