Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
 Аватар для reisal78
944 / 687 / 230
Регистрация: 28.04.2013
Сообщений: 1,925

Hello World не все так однозначно :D

21.12.2015, 13:18. Показов 650. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Допустим, нам нужно написать программу, которая будет выводить в консоль фразу "Hello World!"

Java
1
2
3
4
5
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}
Работает? - Работает.. Но если нам потребуется расширить функционал этой программы, то сделать это без существенных правок уже существуещего кода будет проблематично.



Давайте подумаем что делает эта программа. Программа берет(получает) какие то данные, и отображает их.
Можно под эти действия создать отдельные классы. DataProvider (Поставщик данных) и DataOutput (Вывод данных).
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class HelloWorld {
    public static void main(String[] args) {
        DataProviderFromMemory provider = new DataProviderFromMemory();
        DataOutputInConsole output = new DataOutputInConsole();
        output.setProvider(provider);
        output.outputData();
    }
}
 
class DataProviderFromMemory {
 
    public String getData() {
            return "Hello World!";
    }
 
}
 
class DataOutputInConsole {
    private DataProviderFromMemory provider;
 
    public void setProvider(DataProviderFromMemory provider) {
        this.provider = provider;
    }
 
    public void outputData() {
        if (provider == null) {
            throw new NullPointerException("Необходимо задать атрибут DataProviderFromMemory");
        }
        System.out.println(provider.getData());
    }
}
Кода стало больше, зато появилась возможность потестировать части приложения. А вот для изменения функционала все равно будет требоваться внести довольно много изменений в уже написанный код.


Что бы сократить количество изменений в коде, введем интерфейсы.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
public class HelloWorld {
    public static void main(String[] args) {
        DataProvider provider = new DataProviderFromMemory();
        DataOutput output = new DataOutputInConsole();
        output.setDataProvider(provider);
        output.outputData();
    }
}
 
interface DataProvider {
    String getData();
}
 
interface DataOutput {
    void setDataProvider(DataProvider provider);
    void outputData();
}
 
class DataProviderFromMemory implements DataProvider {
 
    @Override
    public String getData() {
            return "Hello World!";
    }
}
 
class DataOutputInConsole implements DataOutput {
    private DataProvider provider;
 
    @Override
    public void setDataProvider(DataProvider provider) {
        this.provider = provider;
    }
 
    @Override
    public void outputData() {
        if (provider == null) {
            throw new NullPointerException("Необходимо задать атрибут DataProvider");
        }
        System.out.println(provider.getData());
    }
}
Теперь, если нам потребуется брать данные не из памяти а, к примеру, из файла, то мы создадим новый класс DataProviderFromFile реализующий интерфейс DataProvider.
Java
1
2
3
4
5
6
7
8
class DataProviderFromFile implements DataProvider{
 
    @Override
    public String getData() {
        //Читаем  строку из файла и возвращаем ее 
        return "Text from file";
    }
}
А в основном методе программы заменим
Java
1
new DataProviderFromMemory()
на
Java
1
new DataProviderFromFile()
Но все равно, код приходится править. Реазизации интерфейсов у нас все равно жестко зашиты в код программы.
избавится от new можно с помощью фабричного класса.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public class HelloWorldFactory {
    private static HelloWorldFactory instance = null;
    private Properties properties = null;
    private DataProvider provider = null;
    private DataOutput dataOutput = null;
 
    static {
        instance = new HelloWorldFactory();
    }
 
    public DataOutput getDataOutput() {
        return dataOutput;
    }
 
    public DataProvider getProvider() {
        return provider;
    }
 
    public static HelloWorldFactory getInstance() {
        return instance;
    }
 
    private HelloWorldFactory() {
        properties = new Properties();
        try (FileInputStream in = new FileInputStream("app.properties")) {
            properties.load(in);
            String providerClass = properties.getProperty("provider.class");
            String dataOutputClass = properties.getProperty("dataoutput.class");
            provider = (DataProvider) Class.forName(providerClass).newInstance();
            dataOutput = (DataOutput) Class.forName(dataOutputClass).newInstance();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}
Code
1
2
3
#Содержимое файла app.properties
provider.class=ru.cyberforum.DataProviderFromMemory
dataoutput.class=ru.cyberforum.DataOutputInConsole
и внесем изменения в основной метод приложения
Java
1
2
3
4
5
6
    public static void main(String[] args) {
        DataProvider provider = HelloWorldFactory.getInstance().getProvider();
        DataOutput output = HelloWorldFactory.getInstance().getDataOutput();
        output.setDataProvider(provider);
        output.outputData();
    }
теперь для внесения изменений в приложение нам не требуется вносить правки в код. Мы подкладываем дополнительный класс, и в файле настроек указываем приложению юзать этот класс.

На самом деле и фабрику такую не делают, для этого есть более простые и быстрые пути.. но об этом попозже =)

Добавлено через 5 минут
Конечный результат
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package ru.cyberforum;
 
/**
 * @author <a href="mailto:">reisal78</a>
 */
public class HelloWorld {
    public static void main(String[] args) {
        DataProvider provider = HelloWorldFactory.getInstance().getProvider();
        DataOutput output = HelloWorldFactory.getInstance().getDataOutput();
        output.setDataProvider(provider);
        output.outputData();
    }
}
 
interface DataProvider {
    String getData();
}
 
interface DataOutput {
    void setDataProvider(DataProvider provider);
    void outputData();
}
 
class DataProviderFromMemory implements DataProvider {
 
    @Override
    public String getData() {
            return "Hello World!";
    }
 
}
 
class DataOutputInConsole implements DataOutput {
    private DataProvider provider;
 
    @Override
    public void setDataProvider(DataProvider provider) {
        this.provider = provider;
    }
 
    @Override
    public void outputData() {
        if (provider == null) {
            throw new NullPointerException("Необходимо задать атрибут DataProviderFromMemory");
        }
        System.out.println(provider.getData());
    }
}
 
class DataProviderFromFile implements DataProvider{
 
    @Override
    public String getData() {
        //Читаем  строку из файла и возвращаем ее
        return "Text from file";
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package ru.cyberforum;
 
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
 
/**
 * @author <a href="mailto:">reisal78</a>
 */
public class HelloWorldFactory {
    private static HelloWorldFactory instance = null;
    private Properties properties = null;
    private DataProvider provider = null;
    private DataOutput dataOutput = null;
 
    static {
        instance = new HelloWorldFactory();
    }
 
    public DataOutput getDataOutput() {
        return dataOutput;
    }
 
    public DataProvider getProvider() {
        return provider;
    }
 
    public static HelloWorldFactory getInstance() {
        return instance;
    }
 
    private HelloWorldFactory() {
        properties = new Properties();
        try (FileInputStream in = new FileInputStream("app.properties")) {
            properties.load(in);
            String providerClass = properties.getProperty("provider.class");
            String dataOutputClass = properties.getProperty("dataoutput.class");
            provider = (DataProvider) Class.forName(providerClass).newInstance();
            dataOutput = (DataOutput) Class.forName(dataOutputClass).newInstance();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}
Code
1
2
provider.class=ru.cyberforum.DataProviderFromMemory
dataoutput.class=ru.cyberforum.DataOutputInConsole
3
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.12.2015, 13:18
Ответы с готовыми решениями:

Asus M51Kr черный экран или не все так однозначно
Доброго времени суток, и с Новым Годом. Вот буквально несколько часов назад мой старичек подвез подарочек. В процессе работы появились...

Сократить для одной из букв длину кодового слова так, чтобы код можно было декодировать его однозначно
Для кодирования некоторой последовательности, состоящей из букв А, Б, В, Г и Д, используетя неравномерный двоичный код, позволяющий...

Переставить элементы массива так, чтобы сначала располагались все 2, потом 3, затем все 4 и, наконец, все 5
В Массиве X(5,7), Каждый элемент равен 2,3,4 или 5 переставить элементы массива так чтобы сначала располагались все 2, потом 3, Затем все ...

2
21.12.2015, 14:26

Не по теме:

Может, этому место в блогах? :)

0
07.06.2016, 12:46

Не по теме:

Velesthau, сложно сказать где лучше подобные материалы размещать в блоге ли, в рамках форума ли, но что они необходимы и полезны - так уж вот точно. Правилами форума запрещён "олбанский", посему придётся на посконном русском предложить: "Автор, пиши ещё!" :)
Спасибо, reisal78, всего Вам хорошего!

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.06.2016, 12:46
Помогаю со студенческими работами здесь

Программа "Hello world" не запускается, пишет ошибку, что не так?
Здравствуйте, недавно начал изучать си шарп, застрял на элементарном, но лучше спрошу, чем неучем быть, вот программа хелло ворлд не...

Переставить элементы массива так, чтобы располагались все нули, затем все единицы, и, наконец, все двойки
Помогите пожалуйста решить задачу: В массиве х(12) каждый элемент равен 0, 1 или 2. Переставить элементы массива так, чтобы располагались...

Поменять слова местами то есть Hello World > World Hello C++
Ребят всем привет помогите решить задачку: Имеется предварительно созданный текстовый файл, содержащий строку &quot;Hello World&quot;....

Переставить элементы массива так, чтобы сначала располагались все единицы, затем все двойки и, наконец, все нули
Ребят помогите пожалуйста В массив x(N) каждый элемент равен 0,1 или 2. Приставить элементы массива так, чтобы сначала располагались...

Переставить элементы массива так, чтобы сначала располагались все нули, затем все двойки и, наконец, все единицы
Добрый день ! У меня к вам просьба. Помогите решить задачу по с++ начинающему чайнику. :wall: Задача. В массиве A(N) каждый...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru