powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Объектно-ориентированный vs хакерский подход к программированию
25 сообщений из 75, страница 1 из 3
Объектно-ориентированный vs хакерский подход к программированию
    #34176108
Нашел статью, в которой описывается разница между объектно-ориентированным, процедурным и "хакерским" подходами на примере одной задачи. Объектно-ориентированный подход явно уступает остальным по объему кода, в т.ч. "пустого" boilerplate кода. Т.е. он заведомо хуже. Так какие доводы можно привести в его пользу?
...
Рейтинг: 0 / 0
Объектно-ориентированный vs хакерский подход к программированию
    #34176121
Статья http://csis.pace.edu/%7Ebergin/patterns/ppoop.html собственно. Ссылку забыл вставить :)
...
Рейтинг: 0 / 0
Объектно-ориентированный vs хакерский подход к программированию
    #34176132
smbdy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бред
никаких доводов не нужно
кому нужно тот сам поймёт / прочитает / разбереца / etc
тебе в раздел флейма
...
Рейтинг: 0 / 0
Объектно-ориентированный vs хакерский подход к программированию
    #34176138
Фотография Ruslan.Isbarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Времена, когда люди боролись за лишний байт памяти прошли (относится только к прикладному программингу). ИМХО страдать такой фигней сейчас не нужно, лучше сосредоточиться на других вещах, например архитектура. Не стоит обходить такие вещи как удобочитаемость, рано ли поздно придется заниматься сопровождением, добавлять функционал.
Более того, в наше время весь софт пишется в сжатые сроки. ООП позволяет делать это быстрее.
...
Рейтинг: 0 / 0
Объектно-ориентированный vs хакерский подход к программированию
    #34176149
Ruslan.IsbarovБолее того, в наше время весь софт пишется в сжатые сроки. ООП позволяет делать это быстрее.Это в какие? Всегда интересовало. Вот например TheBat! ты за сколько времени напишешь?
...
Рейтинг: 0 / 0
Объектно-ориентированный vs хакерский подход к программированию
    #34176159
Фотография Ruslan.Isbarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
какбытькакжить Ruslan.IsbarovБолее того, в наше время весь софт пишется в сжатые сроки. ООП позволяет делать это быстрее.Это в какие? Всегда интересовало. Вот например TheBat! ты за сколько времени напишешь?

Неважно за сколько я его напишу. Важно сколько начальство поставит. Я уверен, разработчики TheBat! не маялись фигней дабы сделать вид что работают... Вот тебе встречный вопрос: как думаешь, сколько проектов в наше время укладываются в сроки поставленные менеджерами проектов (или лицами занимающимися оценкой рисков и сроков)? По статистике, в процентах.

P.S. Неважно какой проект, краткосрочный, среднесрочный или долгосрочный, времени всегда мало. Лишний день факапа - убытки для компании, подбитая репутация в лице заказчиков и прочие неприятности.
...
Рейтинг: 0 / 0
Объектно-ориентированный vs хакерский подход к программированию
    #34176162
mysterio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подписываюсь под каждым словом.
...
Рейтинг: 0 / 0
Объектно-ориентированный vs хакерский подход к программированию
    #34176186
Фотография Ruslan.Isbarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, приведу пример из области системного программирования. Вот замечательная OpenSource операционная система реального времени http://ecos.sourceware.org/ (либо http://sources.redhat.com/ecos/ ) (Embedded Configurable Operating System), разрабатываемая компанией Cygwin (входит в RedHat).
В этой системе только HAL (Hardware Abstraction Level) написан на языках низкого уровня (Assembler'ы) (HAL пишется для конкретного процессора и периферии, содержащейся в нем). Все остальное - планировщик, графическая оболочка, драйверы файловых систем и прочее-прочее пишется на C++, с использованием ОО подхода.
...
Рейтинг: 0 / 0
Объектно-ориентированный vs хакерский подход к программированию
    #34176194
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ruslan.Isbarovкак думаешь, сколько проектов в наше время укладываются в сроки поставленные менеджерами проектов (или лицами занимающимися оценкой рисков и сроков)?
- я думаю, нисколько :) Что во многом связано с низкой культурой заказчиков, которые после утверждения ТЗ норовят внести поправки, но при этом что бы все было сделано в те же сроки и без доплаты. Кроме того если сразу сказать заказчику сколько времени потребуется на проект он скорее всего откажется в пользу других исполнителей которые пообещают золотые горы, а в итоге сорвут сроки и сделают криво работающую поделку. Так что менеджерам часто приходится заведомо врать заказчику, или в более мягкой форме, скрывать от него часть правды, иначе первоначальная сделка просто не состоится.
...
Рейтинг: 0 / 0
Объектно-ориентированный vs хакерский подход к программированию
    #34176201
KachalovЛадно, это уже оффтоп для форума "Работа".

Все таки мне кажется что ОО подход более уместен при разработке "повторно используемых библиотек", чем при написании чего-то что "нужно сегодня, а завтра нужно будет новое"
...
Рейтинг: 0 / 0
Объектно-ориентированный vs хакерский подход к программированию
    #34176204
mysterio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
какбытькакжить какой у вас опыт работы программистом?
Если бы вы написали хотя бы одну действительно большую и сложную систему, вы бы так не говорили.
Возьмите того же Буча и почитайте.
...
Рейтинг: 0 / 0
Объектно-ориентированный vs хакерский подход к программированию
    #34176207
Фотография Ruslan.Isbarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kachalov Ruslan.Isbarovкак думаешь, сколько проектов в наше время укладываются в сроки поставленные менеджерами проектов (или лицами занимающимися оценкой рисков и сроков)?
- я думаю, нисколько :)

Точно. 0%... :)
...
Рейтинг: 0 / 0
Объектно-ориентированный vs хакерский подход к программированию
    #34176222
Фотография Ruslan.Isbarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
какбытькакжить KachalovЛадно, это уже оффтоп для форума "Работа".

Все таки мне кажется что ОО подход более уместен при разработке "повторно используемых библиотек", чем при написании чего-то что "нужно сегодня, а завтра нужно будет новое"

И ты здесь пропагандируешь "процедурно-ориентированный" подход к разработке? А ты не задумывался что то, что ты пишешь "сегодня", с таким подходом напишешь только к "завтра", а как ты сам сказал "...а завтра нужно будет новое".
...
Рейтинг: 0 / 0
Объектно-ориентированный vs хакерский подход к программированию
    #34176224
Фотография ррмяф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
какбытькакжить
У вас вот уже спросили.
А что вы написали в разработке чего участвовали, расскажите, пожалуйста.
...
Рейтинг: 0 / 0
Объектно-ориентированный vs хакерский подход к программированию
    #34176236
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
какбытькакжитьОбъектно-ориентированный подход явно уступает остальным по объему кода, в т.ч. "пустого" boilerplate кода. Т.е. он заведомо хуже.
- "пустой" код образуется при недостаточном моделировании задачи. Хорошая модель позволяет избежать "лишних" методов в новом коде, кроме того стоит критически относится к сторонним библиотекам, которые могут содержать избыточный для Вашей задачи код.

какбытькакжить
мне кажется что ОО подход более уместен при разработке "повторно используемых библиотек", чем при написании чего-то что "нужно сегодня, а завтра нужно будет новое"

- ООП это способ мышления, заметно превосходящий по гибкости и удобству "процедурное" и "пошаговое" мышление (программирование). Если Вы мыслите исходя из данных сомнений в необходимости ООП просто не может быть, если Вы мыслите действиями, то наверное ООП Вам кажется излишне сложным. Это два разных взгляда на жизнь.
...
Рейтинг: 0 / 0
Объектно-ориентированный vs хакерский подход к программированию
    #34176514
expp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
креатив по сцылце не релевантен поскольку заведомо OS-dependent, что с оопом нараскоряку
...
Рейтинг: 0 / 0
Объектно-ориентированный vs хакерский подход к программированию
    #34176517
Kachalov
- "пустой" код образуется при недостаточном моделировании задачи.


моделирование - зло
...
Рейтинг: 0 / 0
Объектно-ориентированный vs хакерский подход к программированию
    #34176534
грузин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"
какбытькакжить

Все таки мне кажется что ОО подход более уместен при разработке "повторно используемых библиотек", чем при написании чего-то что "нужно сегодня, а завтра нужно будет новое
"

Ну что - то есть в этом, когда объекты моделируешь прикладной ориентации. А так как рыночная стихия заставляет бизнес выживать и адаптироваться и при этом воспроизводиться то... программисты без работы на останутся...
...
Рейтинг: 0 / 0
Объектно-ориентированный vs хакерский подход к программированию
    #34176645
Угу, так же как президенты. Вопрос сколько и на каких основаниях.
...
Рейтинг: 0 / 0
Объектно-ориентированный vs хакерский подход к программированию
    #34176834
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Читал статью. Забавно. Никаких выводов.
...
Рейтинг: 0 / 0
Объектно-ориентированный vs хакерский подход к программированию
    #34177841
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kachalov
- ООП это способ мышления, заметно превосходящий по гибкости и удобству "процедурное" и "пошаговое" мышление (программирование). Если Вы мыслите исходя из данных сомнений в необходимости ООП просто не может быть, если Вы мыслите действиями, то наверное ООП Вам кажется излишне сложным. Это два разных взгляда на жизнь.

Как я ни люблю ООП, но комбинация ООП + статическая типизация (при всех плюсах) приводит к появлению "лишних" строчек кода, которые иногда существенно увеличивают время на внесение изменений.

Тут нужно сразу внести пояснения, иначе меня скушают.

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

2. Но "Дьявол в деталях" (с). На одних объектах из предметной области далеко не уедешь.
Появляются "синтетические" классы: классы-утилиты, промежуточные интерфейсы для обеспечения дополнительной гибкости, фактори, паттерны визитор, темлейт метод и т.п.
Казалось бы где грабли, ведь синтетические классы тоже решают задачи к которым можно применить ООА? А они есть. Преимущество использования декомпозиции данных (оно же ООА) существует только пока "данные" достаточно стабильны (существенно стабильнее, чем связанное с ними поведение). Так вот, данные предметной области стабильны и поэтому классы предметной области тоже стабильны, а синтетические классы не стабильны, т.к. исользуются для описания _поведения_, которое _нестабильно_.

К чему это приводит?

Либо к полному игнорированию ООП на уровне методов классов (включается процедурное программирование со всеми его плюсами и минусами), либо, при последовательном подходе, к разрастанию количества мини-классов, на которых становится заметен оверхед связанный с необходимостью их описания.


Н-р, код из второго сообщения.

Что вижу - то пою:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
 public   class  PrintOS 
{
	 public   static   void  main( final  String[] args) 
	{
		String osName = System.getProperty("os.name") ;
		 if  (osName.equals("SunOS") || osName.equals("Linux")) 
		{
			System.out.println("This is a UNIX box and therefore good.") ;
		} 
		 else   if  (osName.equals("Windows NT") || osName.equals("Windows 95")) 
		{
			System.out.println("This is a Windows box and therefore bad.") ;
		} 
		 else  
		{
			System.out.println("This is not a box.") ;
		}
	}
}

Процедурная декомпозиция:
Код: plaintext
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.
 public   class  PrintOS {
     public   static   void  main( final  String[] args) {
        String osName = System.getProperty("os.name");
         if  (isUnix(osName)) {
            processUnix();
        }  else   if  (isWindows(osName)) {
            processWindows();
        }  else  {
            processUnknown();
        }
    }

     private   static   void  processUnknown() {
        System.out.println("This is not a box.");
    }

     private   static   boolean  isWindows(String osName) {
         return  osName.equals("Windows NT") || osName.equals("Windows 95");
    }

     private   static   void  processWindows() {
        System.out.println("This is a Windows box and therefore bad.");
    }

     private   static   boolean  isUnix(String osName) {
         return  osName.equals("SunOS") || osName.equals("Linux");
    }

     private   static   void  processUnix() {
        System.out.println("This is a UNIX box and therefore good.");
    }
}

Ясно стало видно дублирование кода для выявления типа OS, которое трудно устранить не имея возможности получить ссылку на метод.

Используем для этого полиморфизм:

Код: plaintext
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.
 public   class  PrintOS {
     public   static   void  main( final  String[] args) {
        findOSByName(System.getProperty("os.name")).process();
    }

     private   static  OS findOSByName(String osName) {
         for  (OS os :  new  OS[]{ new  Unix(),  new  Windows(),  new  Unknown()}) {
             if  (os.isMatch(osName)) {
                 return  os;
            }
        }
         throw   new  InternalError();
    }

     interface  OS {
         boolean  isMatch(String osName);

         void  process();
    }

     static   class  Unknown  implements  OS {
         public   boolean  isMatch(String osName) {
             return  true;
        }

         public   void  process() {
            System.out.println("This is not a box.");
        }
    }

     static   class  Windows  implements  OS {
         public   boolean  isMatch(String osName) {
             return  osName.equals("Windows NT") || osName.equals("Windows 95");
        }

         public   void  process() {
            System.out.println("This is a Windows box and therefore bad.");
        }
    }

     static   class  Unix  implements  OS {
         public   boolean  isMatch(String osName) {
             return  osName.equals("SunOS") || osName.equals("Linux");
        }

         public   void  process() {
            System.out.println("This is a UNIX box and therefore good.");
        }
    }
}

Смотрим и видим, что класс PrintOS содержит утилитные методы, которым нужно найти другое место, чтобы они могли быть повторно использованы где-то ещё.

Синтезируем объект "известные операционные системы":

Код: plaintext
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.
 public   class  PrintOS {
     public   static   void  main( final  String[] args) { 
        //Сказка?
        OSes.findByName(System.getProperty("os.name")).process();
    }
}

 interface  OS {
     boolean  isMatch(String osName);

     void  process();
}

 class  OSes {
     static  OS[] registred =  new  OS[]{ new  Unix(),  new  Windows(),  new  Unknown()};

     public   static  OS findByName(String osName) {
         for  (OS os : registred) {
             if  (os.isMatch(osName)) {
                 return  os;
            }
        }
         throw   new  InternalError();
    }

     static   class  Unknown  implements  OS {
         public   boolean  isMatch(String osName) {
             return  true;
        }

         public   void  process() {
            System.out.println("This is not a box.");
        }
    }

     static   class  Windows  implements  OS {
         public   boolean  isMatch(String osName) {
             return  osName.equals("Windows NT") || osName.equals("Windows 95");
        }

         public   void  process() {
            System.out.println("This is a Windows box and therefore bad.");
        }
    }

     static   class  Unix  implements  OS {
         public   boolean  isMatch(String osName) {
             return  osName.equals("SunOS") || osName.equals("Linux");
        }

         public   void  process() {
            System.out.println("This is a UNIX box and therefore good.");
        }
    }
}

Смотрим и снова видим, что что-то не так. А именно метод process. Он делает то, что нужно классу PrintOS, а как же быть другим пользователям OSes? Можно дописывать методы в интерфейс OS и реализовывать их, но это нарушает OSP.
Поэтому появляется визитор:

Код: plaintext
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.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
 public   class  PrintOS {
     public   static   void  main( final  String[] args) {
        OSes.findByName(System.getProperty("os.name")).process( new  PrintMessageVisitor());
    }

     private   static   class  PrintMessageVisitor  implements  OSes.Visitor {
         public   void  visit(OSes.Unix unix) {
            System.out.println("This is a UNIX box and therefore good.");
        }

         public   void  visit(OSes.Windows windows) {
            System.out.println("This is a Windows box and therefore bad.");
        }

         public   void  visit(OSes.Unknown unknown) {
            System.out.println("This is not a box.");
        }
    }
}

 interface  OS {
     boolean  isMatch(String osName);

     void  process(OSes.Visitor visitor);
}

 class  OSes {
     static  OS[] registred =  new  OS[]{ new  Unix(),  new  Windows(),  new  Unknown()};

     public   static  OS findByName(String osName) {
         for  (OS os : registred) {
             if  (os.isMatch(osName)) {
                 return  os;
            }
        }
         throw   new  InternalError();
    }

     interface  Visitor {

         void  visit(Unknown unknown);

         void  visit(Windows windows);

         void  visit(Unix unix);
    }

     static   class  Unknown  implements  OS {
         public   boolean  isMatch(String osName) {
             return  true;
        }

         public   void  process(Visitor visitor) {
            visitor.visit( this );
        }
    }

     static   class  Windows  implements  OS {
         public   boolean  isMatch(String osName) {
             return  osName.equals("Windows NT") || osName.equals("Windows 95");
        }

         public   void  process(Visitor visitor) {
            visitor.visit( this );
        }
    }

     static   class  Unix  implements  OS {
         public   boolean  isMatch(String osName) {
             return  osName.equals("SunOS") || osName.equals("Linux");
        }

         public   void  process(Visitor visitor) {
            visitor.visit( this );
        }
    }
}

Лечге стало? Стало. Но остаётся дублирование и трудно добавлять новые типы оs.

Фиксим:

Код: plaintext
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.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
 public   class  PrintOS {
     public   static   void  main( final  String[] args) {
        OSes.findByName(System.getProperty("os.name")).process( new  PrintMessageVisitor());
    }

     private   static   class  PrintMessageVisitor {
        @OS.Type(OSes.Unix. class )
         public   void  unixGood() {
            System.out.println("This is a UNIX box and therefore good.");
        }

        @OS.Type(OSes.Windows. class )
         public   void  windowsBad() {
            System.out.println("This is a Windows box and therefore bad.");
        }

        @OS.Type(OSes.Unknown. class )
         public   void  foo() {
            System.out.println("This is not a box.");
        }
    }
}


 abstract   class  OS {
     private   static  Object[] emptyArray =  new  Object[]{};

     public   abstract   boolean  isMatch(String osName);

     public   final   void  process(Object visitor) {
         for  (Method method : visitor.getClass().getMethods()) {
            OS.Type annotation = method.getAnnotation(OS.Type. class );
             if  (annotation !=  null  && annotation.value().equals( this .getClass())) {
                 try  {
                    method.invoke(visitor, emptyArray);
                }  catch  (Exception e) {
                     throw   new  InternalError(); //TODO;
                }
            }
        }
    }

    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    @ interface  Type {
         Class  value();
    }
}


 class  OSes {
     static  List<OS> registred =  new  ArrayList<OS>();

     private  OSes() {
    }

     static  {
         for  ( Class  clazz : OSes. class .getClasses()) {
             if  (OS. class .isAssignableFrom(clazz)) {
                 try  {
                    register((OS) clazz.newInstance());
                }  catch  (Exception e) {
                     throw   new  InternalError(); //TODO;
                }
            }
        }
    }

     public   static   void  register(OS os) {
        registred.add(os);
    }

     public   static  OS findByName(String osName) {
         for  (OS os : registred) {
             if  (os.isMatch(osName)) {
                 return  os;
            }
        }
         return  Unknown.INSTANCE;
    }

     public   static   class  Unknown  extends  OS {
         public   final   static  OS INSTANCE =  new  Unknown();

         public   boolean  isMatch(String osName) {
             return  false;
        }
    }

     public   static   class  Windows  extends  OS {
         public   boolean  isMatch(String osName) {
             return  osName.equals("Windows NT") || osName.equals("Windows 2003");
        }
    }

     public   static   class  Unix  extends  OS {
         public   boolean  isMatch(String osName) {
             return  osName.equals("SunOS") || osName.equals("Linux");
        }
    }
}

Избавляемся от мусора ввиде статиков:

Код: plaintext
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.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
 public   class  PrintOS {
     public   static   void  main( final  String[] args) {
         new  OSContainer().resolve(System.getProperty("os.name")).process( new  MessagePrinter());
    }

     private   static   class  OSContainer  extends  AbstractOSContainer {

         public   static   class  Windows  extends  OS {
             public   boolean  isMatch(String osName) {
                 return  osName.equals("Windows NT") || osName.equals("Windows 2003");
            }
        }

         public   static   class  Unix  extends  OS {
             public   boolean  isMatch(String osName) {
                 return  osName.equals("SunOS") || osName.equals("Linux");
            }
        }
    }

     private   static   class  MessagePrinter {
        @OS.Type(OSContainer.Unix. class )
         public   void  unixGood() {
            System.out.println("This is a UNIX box and therefore good.");
        }

        @OS.Type(OSContainer.Windows. class )
         public   void  windowsBad() {
            System.out.println("This is a Windows box and therefore bad.");
        }

        @OS.Type(OS.Unknown. class )
         public   void  foo() {
            System.out.println("This is not a box.");
        }
    }
}

// Support ---------------------------------------------------------------------

 abstract   class  OS {
     public   final   static  OS UNKNOWN =  new  Unknown();

     private   static  Object[] emptyArray =  new  Object[]{};

     public   abstract   boolean  isMatch(String osName);

     public   final   void  process(Object visitor) {
         for  (Method method : visitor.getClass().getMethods()) {
            OS.Type annotation = method.getAnnotation(OS.Type. class );
             if  (annotation !=  null  && annotation.value().equals( this .getClass())) {
                 try  {
                    method.invoke(visitor, emptyArray);
                }  catch  (Exception e) {
                     throw   new  InternalError(); //TODO;
                }
            }
        }
    }

    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    @ interface  Type {
         Class  value();
    }

     public   static   class  Unknown  extends  OS {
         public   boolean  isMatch(String osName) {
             return  false;
        }
    }
}

 class  OSes {
     private  List<OS> registred =  new  ArrayList<OS>();

     public   void  register(OS os) {
        registred.add(os);
    }

     public  OS findByName(String osName) {
         for  (OS os : registred) {
             if  (os.isMatch(osName)) {
                 return  os;
            }
        }
         return  OS.UNKNOWN;
    }
}

 class  AbstractOSContainer {
     private  OSes oses =  new  OSes();

     public  AbstractOSContainer() {
        initOSesFromInnerClasses();
    }

     private   void  initOSesFromInnerClasses() {
         for  ( Class  clazz :  this .getClass().getClasses()) {
             if  (OS. class .isAssignableFrom(clazz)) {
                 try  {
                    oses.register((OS) clazz.newInstance());
                }  catch  (Exception e) {
                     throw   new  InternalError(); //TODO;
                }
            }
        }
    }

     public  OS resolve(String osName) {
         return  oses.findByName(osName);
    }
}

Итого из простого метода получены синтетические сущности:
OS - операционная система
@Os.Type - аннотация упрощающая создание visitor'ов
OSes - произвольный набор операционных систем и методы работы с ними
AbstractOSContainer - базовый класс для конкретного набора OS (с автоматической подгрузкой типов операционных систем)
OSConainer - конкретный набор OS (их может быть несколько для разных задач)

Однако изменение в тз на исходный метод может сразу сделать все эти классы бесполезными (если им не успели найти применения ещё где-нибудь) или существенно большей переработки, чем потребовалось для простого варианта.

Какой вывод?

ООП не является достаточно гибким способом мышления.
Нет времени сейчас, кто хочет может дописать как тоже самое будет выглядеть на лиспе, чтобы убедиться, что есть способ "лучше" :)
...
Рейтинг: 0 / 0
Объектно-ориентированный vs хакерский подход к программированию
    #34178415
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NotGonnaGetUs
Однако изменение в тз на исходный метод может сразу сделать все эти классы бесполезными (если им не успели найти применения ещё где-нибудь) или существенно большей переработки, чем потребовалось для простого варианта.

Какой вывод?

ООП не является достаточно гибким способом мышления.

- вот я и говорю ООП - другой способ мышления :) Вы исходном примере с которого Вы начали всю мутату нет данных вообще. ООП исходит из данных. Программист с ООП мышлением в Вашем искуственном примере первым делом бы завел поле:
Код: plaintext
1.
 private  String osName;
и вокруг него бы выстраивал методы. То что получилось у Вас это не ООП, а пародия на него.

Если заказчик системы занимается продажей товаров, то сущность "товар" никуда не денется из ТЗ как бы ни изголялся заказчик и какие бы действия над ними не делал. Данные не куда не пропадут из программы, тогда как действия над ними можно менять, в этом и заключается мощь и гибкость ООП.
...
Рейтинг: 0 / 0
Объектно-ориентированный vs хакерский подход к программированию
    #34178513
Фотография 1024
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторто сущность "товар" никуда не денется из ТЗ как бы ни изголялся заказчик и какие бы действия над ними не делал

запросто. Заказчик продавал диски с пиратскими играми и фильмами а сейчас (в свете последних событий) это стало пустая болванка+услуга по записи скачанного из инета файла неизвестного содержания.

И не надо про другое мышление. Мышление одинаковое всегда должно быть, здравое.
...
Рейтинг: 0 / 0
Объектно-ориентированный vs хакерский подход к программированию
    #34178799
AlexeyShponarsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Реально большой проэкт (по-моему) без ООП не напишешь, а если напишешь то он будет как минимум в раза два больше (кода). ООП - сила.
...
Рейтинг: 0 / 0
Объектно-ориентированный vs хакерский подход к программированию
    #34178806
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1024запросто. Заказчик продавал диски с пиратскими играми и фильмами а сейчас (в свете последних событий) это стало пустая болванка+услуга по записи скачанного из инета файла неизвестного содержания.

GameDisc -> Disc -> Object
VideoDisc -> Disc -> Object
- если при написании кода программист исходил из общего случая (класс Disc), то его код не потерял актуальности и большую часть кода удастся использовать повторно или модифицировать программу без существенных трудозатрат. А программист который смотрит в будущее создал бы такую структуру классов:
GameDisc -> Disc -> Ware -> Object
...
Рейтинг: 0 / 0
25 сообщений из 75, страница 1 из 3
Форумы / Java [игнор отключен] [закрыт для гостей] / Объектно-ориентированный vs хакерский подход к программированию
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]