Адаптация нескольких интерфейсов

  • 20
  • Недоступна
Давай представим ситуацию, что с одной стороны у нас есть некая база данных, в которой хранятся данные. База данных имеет стандартный набор команд (методов) для предоставления данных, они описаны в интерфейсе IncomeData. Примеры представления данных приведены в комментариях около каждого метода. С другой стороны есть пользователи
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (319)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
🟡ampersand
Уровень 32, Russian Federation
20 июня, 18:15
код для теста
IncomeDataAdapter incomeDataAdapter = new IncomeDataAdapter(new IncomeData() {
            @Override
            public String getCountryCode() {
                return "UA";
            }

            @Override
            public String getCompany() {
                return "JavaRush Ltd.";
            }

            @Override
            public String getContactFirstName() {
                return "Ivan";
            }

            @Override
            public String getContactLastName() {
                return "Ivanov";
            }

            @Override
            public int getCountryPhoneCode() {
                return 38;
            }

            @Override
            public int getPhoneNumber() {
                return 71112233;
            }
        });

        System.out.println(incomeDataAdapter.getCompanyName());
        System.out.println(incomeDataAdapter.getCountryName());
        System.out.println(incomeDataAdapter.getName());
        System.out.println(incomeDataAdapter.getPhoneNumber());
[M210] Java Developer
14 июня, 14:10
Мне как то мое решение нравится больше, чем "правильное". По-крайней мере оно читабельное и его можно понять))
@Override
		public String getPhoneNumber() { //For example1: +38(050)123-45-67, For example2: +38(007)111-22-33
			String number = Integer.toString(data.getPhoneNumber());
			while(number.length() < 10) {
				number = "0" + number;
			}

			number = number.replaceFirst("(\\d{3})(\\d{3})(\\d{2})(\\d{2})", "($1)$2-$3-$4");
			String code = "+" + Integer.toString(data.getCountryPhoneCode());

			return code + number;
		}
Виктор
Уровень 19, Бобруйск, Беларусь
14 июня, 09:43
String.format("%010d", data.getPhoneNumber());
String.format("%+d(%s%s%s)%s%s%s-%s%s-%s%s", data.getCountryPhoneCode(),
 charNum[0], charNum[1], charNum[2], charNum[3], charNum[4], charNum[5],
charNum[6], charNum[7], charNum[8], charNum[9]);
так тоже можно превратив номер в массив чаров
Виктор
Уровень 26, Гомель, Belarus
28 мая, 08:24
Может быть кому-то пригодится для тестов:
package com.javarush.task.task19.task1903;

public class ClientsDB implements Solution.IncomeData {
    private String countryCode;
    private String company;
    private String contactFirstName;
    private String contactLastName;
    private int countryPhoneCode;
    private int phoneNumber;

    public ClientsDB(String countryCode, String company, String contactFirstName, String contactLastName, int countryPhoneCode, int phoneNumber) {
        this.countryCode = countryCode;
        this.company = company;
        this.contactFirstName = contactFirstName;
        this.contactLastName = contactLastName;
        this.countryPhoneCode = countryPhoneCode;
        this.phoneNumber = phoneNumber;
    }

    public String getCountryCode() {
        return countryCode;
    }

    public String getCompany() {
        return company;
    }

    public String getContactFirstName() {
        return contactFirstName;
    }

    public String getContactLastName() {
        return contactLastName;
    }

    public int getCountryPhoneCode() {
        return countryPhoneCode;
    }

    public int getPhoneNumber() {
        return phoneNumber;
    }

    @Override
    public String toString() {
        return "ClientsDB \n" +
                "countryCode='" + countryCode + '\'' +
                ", company='" + company + '\'' +
                ", contactFirstName='" + contactFirstName + '\'' +
                ", contactLastName='" + contactLastName + '\'' +
                ", countryPhoneCode=" + countryPhoneCode +
                ", phoneNumber=" + phoneNumber;
    }
}
Виктор
Уровень 26, Гомель, Belarus
28 мая, 08:24
и main
public static void main(String[] args) {
    ClientsDB client = new ClientsDB("RU", "JavaRush Ltd.", "Ivan",
            "Petrov", 38, 123456789);
    System.out.println(client);
    IncomeDataAdapter adapter = new IncomeDataAdapter(client);
    String answerString = "AnswerString \n" +
            "countryCode='" + adapter.getCountryName() + '\'' +
            ", company='" + adapter.getCompanyName() + '\'' +
            ", contactName='" + adapter.getName() + '\'' +
            ", phoneNumber=" + adapter.getPhoneNumber();
    System.out.println(answerString);
}
MapXyZ
Уровень 33, Минск, Belarus
25 мая, 09:18
Почти всегда пытаюсь решить задания не читая Requirements, потому что там очень часто получаю подсказки по решению... если считаю , что данных мало, конечно лезу и туда... В этот раз меня валидатор именно здесь и поймал: 4. Класс IncomeDataAdapter должен содержать приватное поле data типа IncomeData. ну неужели так важно что я переменную назвал не data а incomeData :)
Виктор
Уровень 26, Гомель, Belarus
28 мая, 08:26
та же самая фигня ) Idea vs Validator! Fight!
CyberBoar
Уровень 34, Russian Federation
4 апреля, 09:21
Вот бы научиться так же строки форматировать, как в правильном решении, которое предлагают. Решал через стрингбилдер.
Виктор
Уровень 19, Бобруйск, Беларусь
14 июня, 09:46
Читайте, даже я тормоз понял: ФОРМАТИРОВАНИЕ ЧИСЕЛ И ТЕКСТА В JAVA.
Darya Hom
Уровень 32, Москва
23 марта, 08:18
А как подебажить такую задачу, если не переписывать весь код? Решила через цикл while + stringbuilder , но так и не поняла, что должно быть написано в main, чтобы потестировать код перед валидацией. В итоге копировала метод getPhoneNumber в main, убирала оттуда data и тестировала оставшееся. Что-то подсказывает, что есть более правильные способы.
Zuzu
Уровень 25, Польша
27 марта, 23:25
в мейне вот что должно быть
IncomeData incomeData = new IncomeData() {
    @Override
    public String getCountryCode() {
        return "UA";
    }

    @Override
    public String getCompany() {
        return "JavaRush Ltd.";
    }

    @Override
    public String getContactFirstName() {
        return "Ivan";
    }

    @Override
    public String getContactLastName() {
        return "Ivanov";
    }

    @Override
    public int getCountryPhoneCode() {
        return 38;
    }

    @Override
    public int getPhoneNumber() {
        return 71112233;
    }
};
Contact contact = new IncomeDataAdapter(incomeData);
System.out.println(contact.getPhoneNumber());
System.out.println(contact.getName());
Customer customer = new IncomeDataAdapter(incomeData);
System.out.println(customer.getCompanyName());
System.out.println(customer.getCountryName());
Darya Hom
Уровень 32, Москва
28 марта, 04:52
Спасибо😊
Батислав Баткин душа в колесе сансары
5 апреля, 18:16
Огромное спасибо!)
Yuri_S Инженер-конструктор 2к.
21 января, 09:21
Легчайшая, даже в требования не смотрел, все ясно из условия стало. А еще по хорошему надо менять возвращаемый тип функции getPhoneNumber(), ибо не всякий номер, даже без кода страны, влезет в int.
Bakyt Sarmanov
Уровень 50, Алматы, Kazakhstan
29 января, 08:53
"даже в требования не смотрел" a как интересно понимаете из условия, что нужно создать приватное поле data типа IncomeData ?
Yuri_S Инженер-конструктор 2к.
29 января, 09:29
Данных в условии достаточно, как писать адаптер мы разбирали. Я при первом решении задачи копирую весь текст условия (кроме требований) себе в ide, и размешаю условие в виде коментария над кодом, как-то так:
/*
Адаптация нескольких интерфейсов
Давай представим ситуацию, что с одной стороны у нас есть некая база данных, в которой хранятся данные......
*/
Чтобы проще и быстрее было к нему вернуться, не прыгая по вкладкам в ide. В данной задаче этого хватило для решения. Это обыкновенный адаптер, позволяющий связать интерфейсы одного уровня абстракции, но с разным представлением одних и тех же данных.
Bakyt Sarmanov
Уровень 50, Алматы, Kazakhstan
29 января, 09:55
я про строгое требования приватного поле типа IncomeData , которое должно быть именно data
private  IncomeData data
, а не например
private IncomeData incomeData
Yuri_S Инженер-конструктор 2к.
29 января, 10:04
К сожалению уже не имею возможности проверить, пройдет ли валидацию задача с иным именем поля. Возможно валидатор и в моем случае споткнулся об это, не утверждаю о прохождении валидатора с 1 попытки, глупо вообще считать попытки и расстраиваться если в целом верное решение из-за чистой формальности завернули. Однако сам принцип построения решения был ясен из условия и имевшегося кода. "Не смотрел в требования" - это не бравада, а попытка думать своей головой. В требованиях часто расписана роадмап что сделать и в какой последовательности, это несколько размягчает мозг. Не думаю что реальные задачи настолько сформулированны, что остается только механически набрать нужные строки в нужных местах.
Neonila Kravtcova
Уровень 19, Санкт-Петербург, Россия
2 февраля, 11:38
Это вообще несправедливо, согласна с вами! Валидатор затребовал назвать поле именно data, а не incomeData, как предложила Idea. Только у вас как-то странно сначала имя поля, а затем его тип написан )
Bakyt Sarmanov
Уровень 50, Алматы, Kazakhstan
2 февраля, 11:55
Спасибо, исправил))
KOTNinja
Уровень 32, Санкт-Петербург, Россия
2 марта, 07:37
О, про incomeData вместо data это я, как раз тут и допустил ошибку🤪
Сергей Коваленко
Уровень 37, Краснодар
12 января, 07:45
Михаил Кладовщик с кучей времени
8 января, 09:39
Простой короткий способ отформатировать номер
String.format("+%d(%03d)%d-%d-%d", code, num / 10000000, num / 10000 % 1000, num / 100 % 100, num % 100);
Но есть один минус - его не пропустит валидатор)
Yuri_S Инженер-конструктор 2к.
21 января, 09:22
Простых(коротких) путей не искал, искал понятные.
String countryPhoneCode = "+" + data.getCountryPhoneCode();
String number = String.format(("%010d"), data.getPhoneNumber());
String formatNumber = "(" + number.substring(0, 3).trim() +
        ")" + number.substring(3, 6).trim() +
        "-" + number.substring(6, 8).trim() +
        "-" + number.substring(8, 10).trim(); //(001)999-88-77

return countryPhoneCode+formatNumber; //+7(001)999-88-77
Mary Grimm
Уровень 35
21 февраля, 15:41
(String.format("%010d", phone).replaceFirst("(\\d{3})(\\d{3})(\\d{2})(\\d+)", "($1)$2-$3-$4"))
Светлана
Уровень 33, Ukraine
6 мая, 14:45
Это гениально!