Форум программистов, компьютерный форум, киберфорум
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. Показов 639. Ответов 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
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru