Форум программистов, компьютерный форум, киберфорум
ООП и паттерны
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
Результаты опроса: используете ли вы ооп
да 238 86.55%
нет 37 13.45%
Голосовавшие: 275. Вы ещё не голосовали в этом опросе

 
 
Рейтинг 4.76/461: Рейтинг темы: голосов - 461, средняя оценка - 4.76
81 / 39 / 3
Регистрация: 29.01.2010
Сообщений: 386

Стоит ли использовать ООП?

09.02.2010, 13:44. Показов 103073. Ответов 793
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Возник такой вопрос: стоит ли использовать ооп. Даже не так, когда использовать ооп?
Иногда (даже чаще всего) легче написать простые функции, а не мутить с классами обектами и методами.
Раздражает инкапсуляция - какой вообще ее смысл? Чтобы получить переменную класса по правилам ооп нужно создавать метод для ее чтения? когда такой подход оправдан - ведь затрачивается куча лишнего времени.
5
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.02.2010, 13:44
Ответы с готовыми решениями:

Стоит ли использовать ООП -- часть вторая
У людей задающих подобные вопросы не все в порядке с пониманием ООП. Например, в параллельной теме человек интересуется: На самом...

Какие РЕАЛЬНО есть причины НЕ использовать ООП?
Появился такой вопрос. Все мы знаем о шумихе вокруг ООП, спорной идее наследования, других невнятных идей которых можно добиться...

Где стоит использовать bootstrap и стоит ли вообще использовать CSS фреймворки?
Здравствуйте. Лично я ужасаюсь ковырять стили, когда к сайту подключен bootstrap и мало понимаю, чем он хорош вообще. В данной теме я бы...

793
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
11.05.2014, 13:40
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от taancer Посмотреть сообщение
каждый верит в то, во что он верит
Какая глубокая мысль. А главное - её очень удобно сказать, когда нечем аргументированно возразить
1
17 / 9 / 2
Регистрация: 18.01.2014
Сообщений: 155
11.05.2014, 18:35
Цитата Сообщение от Evg Посмотреть сообщение
нечем аргументированно возразить
Какие аргументы нужны?
Что при использовании ООП получается более надежный код, чем при простом процедурном программировании?
Даже спорить не собираюсь.
Официальных данных у меня нет, да и, думаю, ни у кого нет.
А все остальное - вопрос ВЕРЫ.
0
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
11.05.2014, 20:36
Цитата Сообщение от taancer Посмотреть сообщение
Что при использовании ООП получается более надежный код, чем при простом процедурном программировании?
Даже спорить не собираюсь.
То есть вы в это просто верите?
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
11.05.2014, 21:39
Цитата Сообщение от taancer Посмотреть сообщение
Что при использовании ООП получается более надежный код, чем при простом процедурном программировании?
Официальных данных у меня нет, да и, думаю, ни у кого нет.
А все остальное - вопрос ВЕРЫ.
Т.е. ты признаешь, что нет никаких официальных данных, что «при использовании ООП получается более надежный код, чем при простом процедурном программировании»?

Замечательно. Сам выдвинул утверждение и сам же признал его бездоказательность.

А с «ВЕРОЙ» — это тебе в холивары, а не сюда.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
11.05.2014, 22:38
Цитата Сообщение от taancer Посмотреть сообщение
А все остальное - вопрос ВЕРЫ
То, о чём говоришь ты, для тебя - вера. То, о чём говорю я - для меня это то, что неоднократно проверено на практике

Цитата Сообщение от taancer Посмотреть сообщение
Какие аргументы нужны?
Когда человек влезает в тему, которая живёт уже более 4 лет и заявляет, что (цитата) "Все очень просто", то хотелось бы услышать хоть какие-то аргументы. Так что я присоединяюсь к предыдущему оратору, что тебе лучше в раздел с холиварами
0
17 / 9 / 2
Регистрация: 18.01.2014
Сообщений: 155
12.05.2014, 02:20
Цитата Сообщение от korvin_ Посмотреть сообщение
А с «ВЕРОЙ» — это тебе в холивары, а не сюда.
У меня нет объективных доказательств.
Как их, думаю, нет ни у кого.
Но у меня есть субъективные доказательства.
Моя ВЕРА основана на 28 годах программирования.
Из этих 28 лет
1 год программирование в машинных кодах на перфокартах
3 года FORTRAN
больше 10 лет процедурного программирования (Pascal, Basic, clipper)
16 лет ООП (Delphi, C++, X++)
иэ этих 16 лет только через года четыре активного прикладного программирования я ПОНЯЛ что такое ООП и как его грамотно применять.
четыре года была жуткая смесь процедурного программирования засунутого в классы...
Что было, то было.... мне есть что вспомнить. я учился на своих ошибках. других учителей, кроме моих ошибок и нескольких умных книг у меня, к сожалению, не было.
........................................ ....
На чем основана ваша вера?
1
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
12.05.2014, 09:08
Цитата Сообщение от taancer Посмотреть сообщение
На чем основана ваша вера?
Вера — это к церкви.

Мои знания основаны на изучении и опыте применения различных вычислительных моделей и подходов к программированию (я же давал ссылку на вику), в т.ч. и ООП. И конечно же чужого опыта тоже. Ты же, кроме ООП и процедурщины, ничего не видел и не знаешь. Действительно, слепая вера, что совершенно не приемлемо для технического специалиста.

Добавлено через 2 минуты
Например информация к размышлению.
0
Фрилансер
 Аватар для Black Fregat
3709 / 2083 / 567
Регистрация: 31.05.2009
Сообщений: 6,683
12.05.2014, 13:08
Цитата Сообщение от korvin_ Посмотреть сообщение
Вера — это к церкви.
korvin_, извините, но это Вы сейчас начинаете разводить холивар, фактически просто придираясь к словам.
В этом месте можно много порассуждать о соотношении веры и знания, но мы ведь не об этом?
Правильно критиковать позицию taancer нужно совсем с другой стороны.

taancer, если Вы внимательно проследите за своими рассуждениями, то увидите, что говорите только о своём личном опыте. Никто не спорит, что лично у Вас программы с использованием ООП получаются лучше и качественнее, чем без него. Но личный опыт - это такая тонкая штука, что с трудом поддается обобщению. Многие этого не понимают, отсюда рождаются классические фразы, вроде
Кликните здесь для просмотра всего текста
Все мужчины козлы
Все чиновники продажны
Все программы без ООП плохи


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

Не по теме:

А сентенции в духе Вашего резюме в ФИДО называли просто и грубо:

Кликните здесь для просмотра всего текста
трясти седыми яйцами

0
17 / 9 / 2
Регистрация: 18.01.2014
Сообщений: 155
12.05.2014, 21:09
Цитата Сообщение от Black Fregat Посмотреть сообщение
и со многим можно будет согласиться. Но, во всяком случае, не с тем, что применение ООП дает какие-то преимущества автоматически.
Согласен!
Автоматических преимуществ нет. Даже наоборот.
Поэтому я и написал в своем первом посте:
Цитата Сообщение от taancer Посмотреть сообщение
Если программист УМЕЕТ использовать ООП, то лучше использовать ООП.
Если же программист НЕ УМЕЕТ использовать ООП, то лучше его вообще не использовать.
Возможно, я слишком категорично заявил "Без вариантов".
Признаю ошибку. Варианты есть. Все зависит от решаемой задачи.
Но, если есть равнозначный выбор как решить задачу процедурно или через ООП, то что бы вы выбрали?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
12.05.2014, 21:31
Цитата Сообщение от taancer Посмотреть сообщение
Но, если есть равнозначный выбор как решить задачу процедурно или через ООП, то что бы вы выбрали?
Вопрос звучит настолько же глупо, как и "если есть равнозначный выбор, использовать молоток или микроскоп, что бы ты выбрал"
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
13.05.2014, 12:33
Ага. Вот, например, логическая задача:

The following puzzle (taken from Dinesman 1968) is typical of a large class of simple logic puzzles:

Baker, Cooper, Fletcher, Miller, and Smith live on different floors of an apartment house that contains only five floors. Baker does not live on the top floor. Cooper does not live on the bottom floor. Fletcher does not live on either the top or the bottom floor. Miller lives on a higher floor than does Cooper. Smith does not live on a floor adjacent to Fletcher's. Fletcher does not live on a floor adjacent to Cooper's. Where does everyone live?
и ее решение с помощью логического программирования: http://mitpress.mit.edu/sicp/f... _sec_4.3.2

Жду обоснования выбора ООП вместо логического.
0
17 / 9 / 2
Регистрация: 18.01.2014
Сообщений: 155
13.05.2014, 19:26
Цитата Сообщение от Evg Посмотреть сообщение
Вопрос звучит настолько же глупо, как и "если есть равнозначный выбор, использовать молоток или микроскоп, что бы ты выбрал"
ну во первых - хоть немного уровняем шансы:
молоток обычный столярный, не отбойный.
микроскоп - настольный, лабораторный.
Тогда можно продолжить мыслить:
Если забивать гвозди - то молоток, хотя микроскопом тоже можно.
Если аккуратно гнуть полоску железа - то выбрал бы микроскоп, в нем можно зажать мало-мальски, молотком только расплющишь...

а вообще, отвечать вопросом на вопрос - это не аргумент.

Добавлено через 20 минут
Цитата Сообщение от korvin_ Посмотреть сообщение
Жду обоснования выбора ООП вместо логического
Данная конкретная задача решается в процедурном виде двумя методами (вызывающий и рекурсивный). Так как для решения именно ЭТОЙ конкретной задачи нет необходимости вводить абстракции и создавать объекты.
НО.
Если подойти к решению этой задачи в обобщенном виде, выделив абстракции апартаментов(владелец), ресурсов (этаж) и Жилец(потребитель ресурса), то задачка однозначно должна решаться через ООП, если это позволяют другие условия постановки задачи (наличие языка и IDE разработки, уже имеющиеся связанные решения, умение программировать наконец...). Так как решение данной задачи через процедурное программирование рано или поздно превратит проект в латание заплаток. Так как:
1. могут изменяться аппартаменты.
2. могут изменяться ресурсы (например площадь...)
3. могут изменяться потребители добавляться, удаляться...
4. могут изменяться критерии каждого потребителя.
5. может изменяться ВАЖНОСТЬ каждого критерия для потребителя...
....
и еще много чего.
Реализация данной задачи в абстрактном виде через ООП была бы оптимальной для поддержки, расширения и анализа.
чуть позже выложу решение задачи в терминах ООП. сейчас времени нет.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
13.05.2014, 21:31
Цитата Сообщение от taancer Посмотреть сообщение
Данная конкретная задача решается в процедурном виде двумя методами (вызывающий и рекурсивный)
Жду решения.

Цитата Сообщение от taancer Посмотреть сообщение
Если подойти к решению этой задачи в обобщенном виде, выделив абстракции апартаментов(владелец), ресурсов (этаж) и Жилец(потребитель ресурса), то задачка однозначно должна решаться через ООП, если это позволяют другие условия постановки задачи (наличие языка и IDE разработки, уже имеющиеся связанные решения, умение программировать наконец...).
Жду примера.

Цитата Сообщение от taancer Посмотреть сообщение
Реализация данной задачи в абстрактном виде через ООП была бы оптимальной для поддержки, расширения и анализа.
Не была бы.

Добавлено через 1 минуту
Зато видно, что ты пытаешься притянуть ООП за уши туда, где оно вообще не нужно.
0
Evg
13.05.2014, 21:50

Не по теме:

Цитата Сообщение от korvin_ Посмотреть сообщение
Зато видно, что ты пытаешься притянуть ООП за уши туда, где оно вообще не нужно
Извините, не удержался. Из старого КВН'а: ".... и Золушке оказались впору армейские ботинки 48-го размера. Потому что ВЕРИЛА!"

0
17 / 9 / 2
Регистрация: 18.01.2014
Сообщений: 155
14.05.2014, 04:36
Цитата Сообщение от korvin_ Посмотреть сообщение
Данная конкретная задача решается в процедурном виде двумя методами (вызывающий и рекурсивный)
Жду решения
Вам, как профессионалу процедурного программирования, не составит труда эту хрень реализовать.
мне лень. Еще раз повторю: Эта задача решается двумя методами - один вызывающий другой рекурсивный.

Вот реализация решения задачи на языке Х++ с использованием ООП.
Делал по быстрому, поэтому не везде сделал контроль типов и абстрактные классы не совсем абстрактные, ну да ладно. главное - идея.
Программа рабочая, результаты выданы реальные.
C#
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
class OwnerApartaments
{
    Set     resources;
    Set     occupants;
}
private void free(Set _resources)
{
    OwnerResource       resource;
    SetEnumerator       se = _resources.getEnumerator();
    ;
 
    while (se.moveNext())
    {
        resource = se.current();
        resource.occupant(null);
    }
}
void new()
{
    ;
 
    resources = new Set(Types::Class);
    occupants = new Set(Types::Class);
 
    resources.add(new OwnerResource_Floor(1));
    resources.add(new OwnerResource_Floor(2));
    resources.add(new OwnerResource_Floor(3));
    resources.add(new OwnerResource_Floor(4));
    resources.add(new OwnerResource_Floor(5));
 
    occupants.add(new Occupant_Baker());
    occupants.add(new Occupant_Cooper());
    occupants.add(new Occupant_Fletcher());
    occupants.add(new Occupant_Miller());
    occupants.add(new Occupant_Smith());
}
private boolean process( Set        _occupants
                       , Set        _resources
                       , Occupant   _occupant
                       )
{
    OwnerResource       resource;
    SetEnumerator       se = _resources.getEnumerator();
    ;
 
    while (se.moveNext())
    {
        resource = se.current();
        if (    resource.occupant() == null
            &&  _occupant.checkResource(resource)
           )
        {
            resource.occupant(_occupant);
            if (this.processResource(_occupants, _resources, _occupant, resource))
            {
                return true;
            }
            resource.occupant(null);
        }
    }
 
    return false;
}
private boolean processResource( Set            _occupants
                               , Set            _resources
                               , Occupant       _occupant
                               , OwnerResource  _resource
                               )
{
    SetEnumerator       se;
    Set                 occupantsLocal;
    Set                 resourcesLocal;
    ;
 
    occupantsLocal  = this.remove(_occupant, _occupants);
    resourcesLocal  = this.remove(_resource, _resources);
    if (occupantsLocal.empty())
    {
        return _occupant.check(this);
    }
 
    se = occupantsLocal.getEnumerator();
    while (se.moveNext())
    {
        if (this.process(occupantsLocal, resourcesLocal, se.current()))
        {
            return _occupant.check(this);
        }
        else
        {
            this.free(resourcesLocal);
        }
    }
 
    return false;
}
private Set remove( object  _o
                  , Set     _set
                  )
{
    Set     set  = new Set(Types::Class);
    ;
 
    set.add(_o);
    return Set::difference(_set, set);
}
public Set resources()
{
    return resources;
}
private void results()
{
    SetEnumerator           se = resources.getEnumerator();
    OwnerResource_Floor     floor;
    ;
 
    while (se.moveNext())
    {
        floor = se.current();
        info(strFmt("%1 - %2"
                   , floor.intFloor()
                   , floor.occupant().getName()
                   ));
    }
}
public void run()
{
    SetEnumerator       se = occupants.getEnumerator();
    ;
 
    while (se.moveNext())
    {
        if (this.process(occupants, resources, se.current()))
        {
            this.results();
            return;
        }
    }
}
static void main(Args _args)
{
    OwnerApartaments   ownerApartaments = new OwnerApartaments();
    ;
 
    ownerApartaments.run();
}
 
class OwnerResource
{
    Occupant    occupant;
}
public Occupant occupant(Occupant _occupant = occupant)
{
    ;
    occupant = _occupant;
    return occupant;
}
 
class   OwnerResource_Floor
extends OwnerResource
{
    int     intFloor;
}
public int intFloor(int _intFloor = intFloor)
{
    ;
    intFloor = _intFloor;
    return intFloor;
}
void new(int _intFloor)
{
    ;
 
    intFloor = _intFloor;
}
 
abstract class Occupant
{
}
public boolean check(OwnerApartaments _ownerApartaments)
{
    return true;
}
public boolean checkResource(OwnerResource _ownerResource)
{
    return true;
}
abstract public Name getName()
{
}
 
class   Occupant_Miller
extends Occupant
{
}
public boolean check(OwnerApartaments _ownerApartaments)
{
    boolean             ret = super(_ownerApartaments);
    SetEnumerator       se = _ownerApartaments.resources().getEnumerator();
    OwnerResource_Floor floor;
    int                 intFloorMiller;
    int                 intFloorCooper;
    ;
 
    if (ret)
    {
        ret = false;
        while (se.moveNext())
        {
            floor = se.current();
            if (SysDictClass::isEqualOrSuperclass(classIdGet(floor.occupant()), classNum(Occupant_Miller)))
            {
                intFloorMiller = floor.intFloor();
                if (intFloorCooper > 0)
                {
                    if (intFloorCooper < intFloorMiller)
                    {
                        ret = true;
                    }
                    break;
                }
            }
            if (SysDictClass::isEqualOrSuperclass(classIdGet(floor.occupant()), classNum(Occupant_Cooper)))
            {
                intFloorCooper = floor.intFloor();
                if (intFloorMiller > 0)
                {
                    if (intFloorCooper < intFloorMiller)
                    {
                        ret = true;
                    }
                    break;
                }
            }
        }
    }
 
    return ret;
}
public Name getName()
{
    return "Miller";
}
 
class   Occupant_Smith
extends Occupant
{
}
public boolean check(OwnerApartaments _ownerApartaments)
{
    boolean             ret = super(_ownerApartaments);
    SetEnumerator       se = _ownerApartaments.resources().getEnumerator();
    OwnerResource_Floor floor;
    int                 intFloorFletcher;
    int                 intFloorSmith;
    ;
 
    if (ret)
    {
        ret = false;
        while (se.moveNext())
        {
            floor = se.current();
            if (SysDictClass::isEqualOrSuperclass(classIdGet(floor.occupant()), classNum(Occupant_Fletcher)))
            {
                intFloorFletcher = floor.intFloor();
                if (intFloorSmith > 0)
                {
                    if (abs(intFloorSmith - intFloorFletcher) > 1)
                    {
                        ret = true;
                    }
                    break;
                }
            }
            if (SysDictClass::isEqualOrSuperclass(classIdGet(floor.occupant()), classNum(Occupant_Smith)))
            {
                intFloorSmith = floor.intFloor();
                if (intFloorFletcher > 0)
                {
                    if (abs(intFloorSmith - intFloorFletcher) > 1)
                    {
                        ret = true;
                    }
                    break;
                }
            }
        }
    }
 
    return ret;
}
public Name getName()
{
    return "Smith";
}
 
class   Occupant_Fletcher
extends Occupant
{
}
public boolean check(OwnerApartaments _ownerApartaments)
{
    boolean             ret = super(_ownerApartaments);
    SetEnumerator       se = _ownerApartaments.resources().getEnumerator();
    OwnerResource_Floor floor;
    int                 intFloorFletcher;
    int                 intFloorCooper;
    ;
 
    if (ret)
    {
        ret = false;
        while (se.moveNext())
        {
            floor = se.current();
            if (SysDictClass::isEqualOrSuperclass(classIdGet(floor.occupant()), classNum(Occupant_Fletcher)))
            {
                intFloorFletcher = floor.intFloor();
                if (intFloorCooper > 0)
                {
                    if (abs(intFloorCooper - intFloorFletcher) > 1)
                    {
                        ret = true;
                    }
                    break;
                }
            }
            if (SysDictClass::isEqualOrSuperclass(classIdGet(floor.occupant()), classNum(Occupant_Cooper)))
            {
                intFloorCooper = floor.intFloor();
                if (intFloorFletcher > 0)
                {
                    if (abs(intFloorCooper - intFloorFletcher) > 1)
                    {
                        ret = true;
                    }
                    break;
                }
            }
        }
    }
 
    return ret;
}
public boolean checkResource(OwnerResource _ownerResource)
{
    OwnerResource_Floor floor   = _ownerResource;
    boolean             ret     = super(_ownerResource);
    ;
 
    if (    floor.intFloor() == 1
        ||  floor.intFloor() == 5
       )
    {
        ret = false;
    }
 
    return ret;
}
public Name getName()
{
    return "Fletcher";
}
 
class   Occupant_Cooper
extends Occupant
{
}
public boolean checkResource(OwnerResource _ownerResource)
{
    OwnerResource_Floor floor   = _ownerResource;
    boolean             ret     = super(_ownerResource);
    ;
 
    if (floor.intFloor() == 1)
    {
        ret = false;
    }
 
    return ret;
}
public Name getName()
{
    return "Cooper";
}
 
class   Occupant_Baker
extends Occupant
{
}
public boolean checkResource(OwnerResource _ownerResource)
{
    OwnerResource_Floor floor   = _ownerResource;
    boolean             ret     = super(_ownerResource);
    ;
 
    if (floor.intFloor() == 5)
    {
        ret = false;
    }
 
    return ret;
}
public Name getName()
{
    return "Baker";
}
На выходе
5 - Miller
4 - Fletcher
3 - Baker
2 – Cooper
1 - Smith

Добавлено через 32 минуты
Цитата Сообщение от korvin_ Посмотреть сообщение
Зато видно, что ты пытаешься притянуть ООП за уши туда, где оно вообще не нужно.
Интересно, где же еще по вашему, ООП нужно, как не здесь?
Интересно, что бы вы делали со своим процедурным программированием, если бы жителей со своими запросами было бы не пять, а несколько десятков? Свичик сделали?...
А если критериев по выбору ресурсов была бы пара десятков, а не один? Еще один свичик?
И еще разбавить все это дело использованием лифта, мусоропровода, подвала и других прелестей...
Конечно! Зачем эти классы, полиморфизм какой-то. Свич рулит!!! А еще, чтобы этот весь хлам переключать и контролировать, глобальных переменных побольше, побольше. Пару сотен - в самый раз!
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
14.05.2014, 07:07
Цитата Сообщение от taancer Посмотреть сообщение
Вам, как профессионалу процедурного программирования, не составит труда эту хрень реализовать.
Я, как профессионал, не стану решать эту задачу никаким другим способом, кроме логического программирования. Поскольку оно было придумано под решение этого класса задач.

Цитата Сообщение от taancer Посмотреть сообщение
Еще раз повторю: Эта задача решается двумя методами - один вызывающий другой рекурсивный.
Демонстрируй или не пиши чушь.

Цитата Сообщение от taancer Посмотреть сообщение
Вот реализация решения задачи на языке Х++ с использованием ООП.
Делал по быстрому, поэтому не везде сделал контроль типов и абстрактные классы не совсем абстрактные, ну да ладно. главное - идея.
Программа рабочая, результаты выданы реальные.
Жесть. 408 строчек против моих 20-ти? Спасибо, этого я и ожидал. Это просто образец использования ООП не по назначению и «over–engineering»-а.

Цитата Сообщение от taancer Посмотреть сообщение
Интересно, где же еще по вашему, ООП нужно, как не здесь?
Интересно, что бы вы делали со своим процедурным программированием, если бы жителей со своими запросами было бы не пять, а несколько десятков? Свичик сделали?...
А если критериев по выбору ресурсов была бы пара десятков, а не один? Еще один свичик?
Где ты свитчи и процедурное программирование увидел, болезный? Просветись уже.
У меня-то как раз добавилось ровно столько правил, сколько описано в условии, а это по одной строчке на правило. У тебя же это еще пара десятков классов по десятку строк (судя по классу Occupant_Cooper), а то и по 50 (судя по классу Occupant_Miller) на каждое новое условие. Итого скорость роста объема кода в твоем ООП в десять–пятьдесят раз выше моей. Результаты сам посчитаешь? Где же хваленое повторное использование кода?
0
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
14.05.2014, 07:13
Цитата Сообщение от taancer Посмотреть сообщение
Программа рабочая, результаты выданы реальные
Как у вас в ООП все запущено то. Особенно свод правил захаркоденый прям в классы умиляет. А если надо будет рещить две задачи с разными наборами правил и теми же жильцами вы что будете делать? Свитчики напихаете?
Пример решения и SICP конечно несколько пыльный, но в современном мире задача решается так http://ideone.com/afT4f2. Сами перечислите все недостатки своей ООП версии?
Цитата Сообщение от taancer Посмотреть сообщение
Зачем эти классы, полиморфизм какой-то
Апологеты ООП считают, что полиморфизм это свойство только ООП. А на самом деле полиморфизм в ООП действительно "какой-то" и далеко не самый лучший.
Цитата Сообщение от taancer Посмотреть сообщение
Интересно, где же еще по вашему, ООП нужно, как не здесь?
Оно и здесь не нужно и в 90% случаев не нужно. Живет по инерции как легаси, но т.к. масса была накоплена больная жить будет еще долго. А белые люди давно DSL используют.
1
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
15.05.2014, 17:18
Цитата Сообщение от korvin_ Посмотреть сообщение
и ее решение с помощью логического программирования
Да тут даже логическое программирование не нужно, подойдёт любой язык с монадой List:

Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import Control.Monad (guard)
import Data.List (nub)
 
distinct x = length (nub x) == length x
 
multipleDwelling = do
    baker <- [1..5]
    cooper <- [1..5]
    fletcher <- [1..5]
    miller <- [1..5]
    smith <- [1..5]
    
    guard $ distinct [baker, cooper, fletcher, miller, smith]
    guard $ baker /= 5
    guard $ cooper /= 1
    guard $ fletcher /= 5 && fletcher /= 1
    guard $ miller > cooper
    guard $ abs (smith - fletcher) /= 1
    guard $ abs (fletcher - cooper) /= 1
    
    return [baker, cooper, fletcher, miller, smith]
2
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
15.05.2014, 18:22
Цитата Сообщение от Nameless One Посмотреть сообщение
Да тут даже логическое программирование не нужно, подойдёт любой язык с монадой List:
Так это по сути оно и получилось. Ну да не суть. =)
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
07.12.2014, 04:02
еще немножко уменьшил количество символов
Haskell
1
2
3
4
r x = not $ elem (last x) "bf" || elem (head x) "cf" || filter (flip elem "cm") x=="mc"
    || any id (map (($x).isInfixOf) ["sf","fs","cf","fc"])
 
main = print.filter r.permutations $ "bcfms"
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.12.2014, 04:02

Стоит ли учить ООП в одно время с Яп
Добрый день! Начал активно изучать c#. Читаю Шилдта в свободное от учебы время и стараюсь практиковаться и всё выходит пока нормально. Но...

Как использовать ООП в WinAvr
Класс я создал. А вот объект класса создать не получается! Полазив по интернету выяснил что оператор new не поддерживается компилятором! ...

Js class как правильно использовать ООП
Накидал вот такой простенький код, авторизация проходит, data.Access_token существует, но в this.Access_token почему то не сохраняется, не...

Когда следует использовать ООП в РНР?
Когда стоит учить ооп в РНР, если новичок в РНР? Стоит ли писать весь код в стиле ооп ?

WITH AS стоит ли использовать
Использую СУБД Postgresql, есть запрос SELECT * FROM Table1 WHERE Filed1 IN (SELECT Fileld1 FROM Table2 WHERE Fileld2='A' AND...


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

Или воспользуйтесь поиском по форуму:
480
Ответ Создать тему
Новые блоги и статьи
Теория всего 12. ВГК
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928 Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
Теория всего 11. Основные параметры
anaschu 21.07.2026
Дешифровка тензорного ядра Soil Chemistry 2. 0: Истинный инвариант Теории Всего Чистовой исходный код многокомпонентной сукцессии зафиксирован. Модель оперирует единым вектором состояния. . .
Теория всего 10. Клод трусишка
anaschu 21.07.2026
Алгоритмический суицид ИИ: Когда математика ОДУ взламывает цензурные шлюзы Свежайший мета-прецедент нашей разработки! Клод официально отказался строить итоговую кроссплатформенную модель, как. . .
Теория всего 9. Окончательная проработка метафоры "дерево = традиции"
anaschu 21.07.2026
Скрытые параметры ядра ОДУ: Механика Глубинного Рока Клод утаил от вас ключевую математику кризисов. В движке игры зашиты пять скрытых коэффициентов, определяющих, как именно ТНК и Мемы ломают. . .
Теория всего 8. Clauude трусишка. Ответ джемени
anaschu 21.07.2026
Игровой баланс «Модели Всего»: Алгоритмический блок как механика Семантического БуфераЭтот скриншот отказа Клода — идеальный, чистейший прецедент для нашей Теории Всего. Вы столкнулись не просто с. . .
Теория всего 7. Дерево - это патриархат, грибы - это феминизм
anaschu 21.07.2026
Уничтожение Патриархата: Как ТНК, Мемы и Половой отбор зачистили «Сексуальный Пролетариат» Величайшая иллюзия современного человека — вера в «свободу воли», «социальный прогресс» и «эволюцию. . .
История и социология Терры на примере борьбы микориз за пространство. 1. Глоссарий терры.
anaschu 21.07.2026
Решил тут подумать о возможности сделать лор некоторой комп игры - стратегии, или худжественной книги антиутопии, которые будут юзать планету,которая максимально будет похожа на нашу землю, но где. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru