ООП vs структурное прогр. vs функциональное прогр.

Windows лучше чем Linux! Чем? Ясно же написано — чем Linux!
Раздуй свой холивар сегодня, потому что завтра это может сделать уже кто-то другой!

Какая концепция вам больше нравиться?

ООП
31
74%
Структурное
2
5%
Функциональное
6
14%
Другое
3
7%
 
Всего голосов : 42

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 16.06.2006 (Пт) 10:07

Ну, и куда делись все горячие апологеты ООП? Вроде сегодня рабочий день :lol:


Вот вам ещё один пример, про последовательную сортировку композицией функций.
Код: Выделить всё
sub mysorter {
  my ($key,$next)=@_;
  sub { my($a,$b)=@_; (($a->{$key})<=>($b->{$key})) || &$next($a,$b); }
}
$tail = sub {0};

sub mysort {
  my $key, $sorter=$tail;
  for $key (@_) {$sorter=mysorter($key, $sorter)};
  qsort ($sorter, @array);
}


А что вы сделаете с вашим ООП? цикл из последовательной пересортировки по всем полям подряд? :-)
Изображение

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Сообщение Ramzes » 16.06.2006 (Пт) 10:28

хм...а как насчет работать с тем, что я говорил. У меня обьект, на описание которого ушло почти 1000 строк.
Код: Выделить всё

Public Class mp3File
#Region "Private Shared Fields"
    Private Shared _filesCount As Integer = 0
    Friend Shared _files As New ArrayList
#End Region
#Region "Private Fields"
    Private _index As Integer
    Private _fileName As String
    Private _path As String
    Private _FullPath As String
    Private _folder As System.IO.DirectoryInfo
    Private _extension As String
    Private _PathToMove As System.IO.DirectoryInfo
    Private _lenght As Double
    Private _checked As Boolean

    Private _artist As String
    Private _title As String
    Private _album As String
    Private _year As String
    Private _Genre As String
    Private _Comment As String

    Private _SongLenght As Integer
    Private _ChanelMode As ChannelModeEnum
    Private _BitRate As Integer
    Private _Copyright As Boolean
    Private _SamplingRateFrequency As Integer

#End Region


Public Sub New(ByVal FilePath As String, Optional ByVal Checked As Boolean = True)
'Код упущен
End Sub
Public Sub New()
'Код упущен
End Sub

Public Shared ReadOnly Property Files(ByVal Index As Integer) As mp3File
'Код упущен
End property
Public Shared ReadOnly Property FilesCount() As Integer
'Код упущен
End property


#Region "Public Properties"
    Public ReadOnly Property Index() As Integer
    End Property
    Public ReadOnly Property FileName() As String
    End Property
    Public ReadOnly Property Path() As String
    End Property
    Public ReadOnly Property FullPath() As String
    End Property
    Public ReadOnly Property Folder() As System.IO.DirectoryInfo
    End Property
    Public ReadOnly Property Extention() As String
    End Property
    Public Property PathToMove() As System.IO.DirectoryInfo
    End Property
    Public ReadOnly Property Lenght() As Double
    End Property
    Public Property FileChecked() As Boolean
    End Property
    Public Property Artist() As String
    End Property
    Public Property Title() As String
    End Property
    Public Property Album() As String
    End Property
    Public Property Year() As String
    End Property
    Public ReadOnly Property SongLenght() As Integer
    End Property
    Public Property Genre() As String
    End Property
    Public ReadOnly Property ChanelMode() As ChannelModeEnum
    End Property
    Public ReadOnly Property Bitrate() As Integer
    End Property
    Public ReadOnly Property Copyright() As Boolean
    End Property
    Public Property Comment() As String
    End Property
    Public ReadOnly Property SamplingRateFrequency() As Integer
    End Property
#End Region
#Region "Public Methods"
    Public Function ToListViewItem(Optional ByVal Checked As Boolean = True) As ListViewItem
    End Function
    Public Sub DeleteFromCollection()
    End Sub
    Public Sub Move()
    End Sub
    Public Sub Copy(ByVal PathToCopy As String)
    End Sub
    Public Sub Delete()
    End Sub
    Public Sub UpdateTags()
    End Sub
    Public Overrides Function ToString() As String
    End Function
    Public Shadows Function Equals(ByVal File As mp3File) As Boolean
    End Function
#End Region
#Region "Private Methods"
    Private Sub FillFields(ByVal File As String, ByVal PathToMove As String)
    End Sub
    Private Sub ReadTegs(ByVal FullPath As String)
    End Sub
    Private Function KBToMB(ByVal KB As Double, ByVal lenght As Integer) As Double
    End Function
#End Region
End Class

Не мальнький клас, учитывая то, что код всех его членов упущен...Как предлагаешь работать с ним в функциональном языке?

Я согласен, можно...но очень сложно

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 16.06.2006 (Пт) 10:37

Неа, неа, так некрасиво.
Я на вопросы FAKK2 отвечал. А ты все мои пропустил.



Ramzes писал(а):Не мальнький клас, учитывая то, что код всех его членов упущен...Как предлагаешь работать с ним в функциональном языке?

Я согласен, можно...но очень сложно

Заодно, если считаешь, что можно, то расскажи как :-)
А то я вновь подозреваю, что за этими словами ничего не стоит.
Изображение

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Сообщение Ramzes » 16.06.2006 (Пт) 11:36

Учитывая то, что, что это колекция, то один из вариантов хранить все это в многомерном масиве. - Это раз.

В масиве можно деражть строки, а затем их парсить.

Пока, мне в голову ничего больше не лезет.

Можешь предложить свои варианты

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 16.06.2006 (Пт) 12:37

Это ты всё ещё пытаешься доказать превосходство ООП перед процедурным программированием? или ты не видишь разницы между ним и ФП?

Какое отношение к ФП имеют строки и их массивы?


А на самом деле, смоделировать объект средствами ФП достаточно легко, если понять, что несколько замыканий могут иметь общие переменные:
Код: Выделить всё
sub new {
  my($a,$b)=@_; {
  add => sub { $a+$b; },
  sub => sub { $a-$b; },
  a   => sub { @_? $a=shift: $a },
  b   => sub { @_? $b=shift: $b }
}}

#использование:
$obj =new(1,2);
print &{$obj->{add}};
print &{$obj->{a}};
$obj->{b}->(4);
print &{$obj->{sub}};

Всё на месте: инкапсуляция, полиморфизм, что угодно.
Изображение

FaKk2
El rebelde gur&#250;
El rebelde gur&#250;
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 16.06.2006 (Пт) 17:58

tyomitch
Зачем при обсуждении идеи ты приводишь конкретные выгодные для себя примеры?

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 16.06.2006 (Пт) 19:42

Предлагаешь приводить невыгодные примеры? :)

FaKk2
El rebelde gur&#250;
El rebelde gur&#250;
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 16.06.2006 (Пт) 20:43

Amed
Я предлагаю привести и выгодные и невыгодные примеры. Я не поверю что на Перле нет невыгодных примеров. А так попахивает фанатизмом.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 16.06.2006 (Пт) 21:24

FaKk2, ты тоже не привёл ни одного невыгодного для ООП примера. Игра в одни ворота? ;-)
Изображение

FaKk2
El rebelde gur&#250;
El rebelde gur&#250;
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 16.06.2006 (Пт) 22:05

tyomitch
Могу и я.
1. Идея ООП не подходит для быстрой и "грязной" разработки. Т.е. там где не нужно городить классы, продумывать структуру и взаимодействие, а достаточно быстро написать десяток функций и более менее нормальный workflow.

2. ООП достаточно сложен для понимания. Несмотря на то что он держится на всего трех китах, концепция требует длительного изучения и понимания.

Ну, а теперь твоя очередь :)

Денис Победря
Мегобойанист
Мегобойанист
 
Сообщения: 1037
Зарегистрирован: 03.01.2005 (Пн) 21:29
Откуда: Из Москвы

Сообщение Денис Победря » 16.06.2006 (Пт) 22:07

Ну что тогда трудно понять в ооп?
[Место cдаётся]

FaKk2
El rebelde gur&#250;
El rebelde gur&#250;
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 16.06.2006 (Пт) 22:10

Денис Победря
Скажи, в чем разница между статистическим классом и закрытым?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 16.06.2006 (Пт) 22:32

ну, тогда

1) ФП неудобно применять в низкоуровневых задачах из-за большого объёма возводимой языком "обёртки"; ещё ФП требует внесения в язык нетривиальной системы сборки мусора, которая бы уничтожала ненужные больше функции даже при наличии между ними циклических зависимостей. Это роднит ФП-языки с "очень-ОО-языками", такими как Жава.

2) чистое (stateless) ФП неудобно как в реализации, так и в практическом применении, из-за того, что компьютер внутри себя состоит из переменных, а не из функций. Введение в ФП переменных и понятия следования (точно так же, как введение в ООП глобальных и статических переменных и функций) одновременно облегчает его практическое использование, но и "разбавляет" его идеологические и воспитательные преимущества.
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 17.06.2006 (Сб) 0:35

пожалуй, всё-таки повешу здесь ссылку на http://bbs.vbstreets.ru/viewtopic.php?t=26320
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 27.06.2006 (Вт) 15:41

Чего-то спорщики, с Ramzes-ом во главе, совсем этот топик забросили.
Странно. Вроде бы никто превосходства ООП не показал, и даже не пытался; а голоса за него всё прибывают и прибывают.
Изображение

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Сообщение Ramzes » 27.06.2006 (Вт) 18:33

tyomitch писал(а):Неа, неа, так некрасиво.
Я на вопросы FAKK2 отвечал. А ты все мои пропустил.

Вот я и не отвечаю, тем более, что спорить надоело, для меня ООП остается самым удобным, для решения моих задач.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 27.06.2006 (Вт) 18:48

Ramzes писал(а):Вот я и не отвечаю, тем более, что спорить надоело, для меня ООП остается самым удобным, для решения моих задач.

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

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 27.06.2006 (Вт) 19:18

tyomitch писал(а):Чем отличаются операции над классом от операций над сборищем функций в модуле?
А именно, в чём различие между вызовами MyObject->MyMethod() и MyMethod(MyObject), где во втором случае MyObject -- обычная структура?
Особенно если учитывать, что компилируются они одинаково ;-)
Вот-вот. Особенно можно пронаблюдать выгоду ООП (читать: наследования) на примере Делфей. Сделаем пустую програмку с одним окошком и глянем на размер... :wink: От чего так? Нафиг нужно таскать с собой кучу не нужного мусора, типа классов TPersistent, TObject, TControl, TCustomForm. Они конечно нужны - это предки TForm, но... Короче говоря, особого преимущества ООП над процедурным (не ошибся в терминологии?) программированием я не вижу, скорее наоборот. ИМХО.
А я все практикую лечение травами...

AlexBlack
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 18.07.2005 (Пн) 19:14
Откуда: Киефф, Юкрейн...

Сообщение AlexBlack » 27.06.2006 (Вт) 22:45

ИМХО

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

http://www.rs-creative.com
Alex_Black@rs-creative.com

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 28.06.2006 (Ср) 9:51

AlexBlack
Ей богу, что за чушь?... :?
А я все практикую лечение травами...

AlexBlack
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 18.07.2005 (Пн) 19:14
Откуда: Киефф, Юкрейн...

Сообщение AlexBlack » 28.06.2006 (Ср) 13:01

Twister писал(а):AlexBlack
Ей богу, что за чушь?... :?


Раскажите пожайлуста, как правильно... :twisted:
Красный, но студийный.

http://www.rs-creative.com
Alex_Black@rs-creative.com

Денис Победря
Мегобойанист
Мегобойанист
 
Сообщения: 1037
Зарегистрирован: 03.01.2005 (Пн) 21:29
Откуда: Из Москвы

Сообщение Денис Победря » 28.06.2006 (Ср) 15:51

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

Линукс наоборот - писался для ООП концепции
[Место cдаётся]

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 28.06.2006 (Ср) 17:30

Про "ФП -- это для математиков" могу возразить: по-вашему, C# 3.0 пишется для математиков с семи пядями во лбу?
Изображение

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 30.06.2006 (Пт) 20:01

Раскажите пожайлуста, как правильно... :twisted:

tyomitch писал(а):Про "ФП -- это для математиков" могу возразить: по-вашему, C# 3.0 пишется для математиков с семи пядями во лбу?
От себя добавлю: а что, используя ООП игры не пишут? Или на процедурных языках не пишут для приложения для Винды? :wink:
А я все практикую лечение травами...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 02.07.2006 (Вс) 0:03

Вот уж насчёт написания игр, такая чушь... пишут игры не начём-то а именно пишут причём используют то что в конкретном случае выгодно.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 18.08.2007 (Сб) 22:47

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

Линукс наоборот - писался для ООП концепции
Точно, мне только вчера приснилось то же самое; другие то же верят в нерушимость Вашего Слова, поэтому совершенно не нужно аргументировать свои речи.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

HKEY_SUPER_MASHINE
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 78
Зарегистрирован: 02.07.2008 (Ср) 12:17
Откуда: Тольятти, школа, случайно

Сообщение HKEY_SUPER_MASHINE » 07.07.2008 (Пн) 10:59

ООП. Просто, наглядно, удобно.
Чипсы оставляют неприятный осадок в желудке
Их состав оставляет неприятный осадок в душе

Александр Дмитриев
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 296
Зарегистрирован: 05.01.2005 (Ср) 3:39
Откуда: Санкт-Петербург    Куда: /dev/null

Сообщение Александр Дмитриев » 08.07.2008 (Вт) 4:19

Twister писал(а):Короче говоря, особого преимущества ООП над процедурным (не ошибся в терминологии?) программированием я не вижу, скорее наоборот. ИМХО.
Герберт Шилдт в своей книге "Самоучитель C++" под заголовком "Что такое объектно-ориентированное программирование?" так описывает преимущества ООП:
Герберт Шилдт писал(а):Объектно-ориентированное программирование — это новый подход к созданию программ. По мере развития вычислительной техники возникали разные методики программирования. На каждом этапе создавался новый подход, который помогал программистам справляться с растущим усложнением программ. Первые программы создавались посредством ключевых переключателей на передней панели компьютера. Очевидно, что такой способ подходит только для очень небольших программ. Затем был изобретен язык ассемблера, который позволял писать более длинные программы. Следующий шаг был сделан в 1950 году, когда был создан первый язык высокого уровня Фортран.

Используя язык высокого уровня, программисты могли писать программы до нескольких тысяч строк длиной. Для того времени указанный подход к программированию был наиболее перспективным. Однако язык программирования, легко понимаемый в коротких программах, когда дело касалось больших программ, становился нечитабельным (и неуправляемым). Избавление от таких неструктурированных программ пришло после изобретения в 1960 году языков структурного программирования (structured programming language). К ним относятся языки Алгол, Паскаль и С. Структурное программирование подразумевает точно обозначенные управляющие структуры, программные блоки, отсутствие (или, по крайней мере, минимальное использование) инструкций GOTO, автономные подпрограммы, в которых поддерживается рекурсия и локальные переменные. Сутью структурного программирования является возможность разбиения программы на составляющие ее элементы. Используя структурное программирование, средний программист может создавать и поддерживать программы свыше 50 000 строк длиной.

Хотя структурное программирование, при его использовании для написания умеренно сложных программ, принесло выдающиеся результаты, даже оно оказывалось несостоятельным тогда, когда программа достигала определенной длины. Чтобы написать более сложную программу, необходим был новый подход к программированию. В итоге были разработаны принципы объектно-ориентированного программирования. OOP аккумулирует лучшие идеи, воплощенные в структурном программировании, и сочетает их с мощными новыми концепциями, которые позволяют оптимально организовывать ваши программы. Объектно-ориентированное программирование позволяет вам разложить проблему на составные части. Каждая составляющая становится самостоятельным объектом, содержащим свои собственные коды и данные, которые относятся к этому объекту. В этом случае вся процедура в целом упрощается, и программист получает возможность оперировать с гораздо большими по объему программами.

Все языки OOP, включая C++, основаны на трех основополагающих концепциях, называемых инкапсуляцией, полиморфизмом и наследованием.
Но здесь отмечены преимущества ООП над структурным программированием, но ничего не сказано про функциональное. Мне кажется, ООП и ФП - это две стрелы, пущенные в разных направлениях. Вполне возможно, что траектории этих стрел кое-где пересекаются (Тёмыч приводил пример того, как класс реализовать на ФП) (конечно, здесь стрелы должны уметь проходить друг сквозь друга, чтобы продолжать движение). Мне кажется, эти две концепции должны сосуществовать вместе в одном языке. Кстати, а такой язык есть?

Пред.

Вернуться в Holy Wars@VBStreets

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

    TopList