Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Ссылки и указатели вне параметров процедур

87
24 мая 2011 года
Kogrom
2.7K / / 02.02.2008
Для чего в современных императивных языках используют ссылки вне параметров процедур? Думаю, для создания спагетти-данных. Все эти ссылки из одного объекта на другой, замыкания и возвраты ссылок - это GOTO для данных, по моему скромному мнению.

Кроме того, что они запутывают код, они приводят по крайней мере к двум проблемам:
1. Затрудняют сериализацию объектов.
2. Приводят к потребности в хитром сборщике мусора.

Вопрос: почему от них до сих пор не отказались? Что в них хорошего?
Страницы:
5
24 мая 2011 года
hardcase
4.5K / / 09.08.2005
Ничо не понял. Примеры в студию. В .NET языках подавляющее большинство типов данных - ссылочные.
87
24 мая 2011 года
Kogrom
2.7K / / 02.02.2008
Цитата: Kogrom
Все эти ссылки из одного объекта на другой, замыкания и возвраты ссылок - это GOTO для данных, по моему скромному мнению.



Цитата: hardcase
Ничо не понял. Примеры в студию.


Я уж три примера привёл:
1. Один (или несколько) объект хранит в себе ссылку на другой, который создал не он. В результате, у нас неопределенное время на один объект ссылается несколько, что создаёт лишние связи, т.е. спагетти. Если бы ссылка на второй объект передавалась только в момент использования (то есть как параметр процедуры), то лишних связей было бы меньше, и структура данных была бы менее монолитной.
Понятно, что объекты, ссылающиеся на другие объекты сложнее сериализовать. Понятно, что такие связи требуют автоматической сборки мусора.

2. Если встроенная функция имеет доступ к данным внешней, то опять получается монолит двух функций и запутанные связи с данными. Ещё запутаннее может быть, если мы вернём внутреннюю функцию. Ну и понятно, что тут нужен сборщик мусора.
3. Возвращаемая ссылка создаёт дополнительную связь, если она ссылается на объект-параметр процедуры. Если же она ссылается на новый объект, созданный в теле процедуры, то это терпимо, если не учитывать потребность в сборщике мусора.

Если бы не было таких возможностей, то появилась бы потребность четче определять кто чьим родителем является, что повысило бы чёткость структуры программы.

Если бы не было таких "фич", то объекты могли бы удаляться родителями, их было бы проще сохранять или передавать их копию (с конкретным состоянием) в другой процесс.

Цитата: Kogrom
В .NET языках подавляющее большинство типов данных - ссылочные.


Бывает. Кстати, поэтому почти нет смысла приводить код - почти все языки пропитаны идеологией которую я критикую. Можно лишь картинки рисовать.

5
24 мая 2011 года
hardcase
4.5K / / 09.08.2005
Цитата: Kogrom
Я уж три примера привёл:
1. Один (или несколько) объект хранит в себе ссылку на другой, который создал не он. В результате, у нас неопределенное время на один объект ссылается несколько, что создаёт лишние связи, т.е. спагетти.

Что в этом плохого?

Цитата: Kogrom
Понятно, что объекты, ссылающиеся на другие объекты сложнее сериализовать. Понятно, что такие связи требуют автоматической сборки мусора.

Сложнее чем что? Вообще, при чем тут сериализация?

Цитата: Kogrom
2. Если встроенная функция имеет доступ к данным внешней, то опять получается монолит двух функций и запутанные связи с данными. Ещё запутаннее может быть, если мы вернём внутреннюю функцию. Ну и понятно, что тут нужен сборщик мусора.
3. Возвращаемая ссылка создаёт дополнительную связь, если она ссылается на объект-параметр процедуры. Если же она ссылается на новый объект, созданный в теле процедуры, то это терпимо, если не учитывать потребность в сборщике мусора.

Как по твоему нужно реализовывать замыкания?

Цитата: Kogrom
Если бы не было таких возможностей, то появилась бы потребность четче определять кто чьим родителем является, что повысило бы чёткость структуры программы.

В одном знакомом мне языке есть структура данных "список":

 
Код:
def x = [1, 2, 3, 4];

Этот код эквивалентен следующему:
 
Код:
def x =  list.Cons(1, list.Cons(2, list.Cons(3, list.Cons(4, list.Nil()))));

Кто здесь родитель?

У этого списка можно легко заменить голову:
 
Код:
def newX = match(x)
{
  | head :: tail => 10 :: tail
  | [] => 10 :: [];
}

tail - это объект созданый с помощью list.Cons(2, ...). Экономия памяти на лицо.



Цитата: Kogrom
Если бы не было таких "фич", то объекты могли бы удаляться родителями, их было бы проще сохранять или передавать их копию (с конкретным состоянием) в другой процесс.

Не все структуры данных обладают связью родитель-дитя. Взгляни на любую рекурсивную структуру данных из функционального мира.

87
24 мая 2011 года
Kogrom
2.7K / / 02.02.2008
Цитата: hardcase
Что в этом плохого?


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

Цитата: hardcase
Сложнее чем что? Вообще, при чем тут сериализация?


Если объект простой (то есть не содержит ссылки на другие объекты), то все его поля можно сохранить просто. Если он ссылается на другие объекты, то по хорошему надо сохранять и их.

Цитата: hardcase
Как по твоему нужно реализовывать замыкания?


Никак. Либо передавать нужные параметры в процедуру, либо использовать объекты-генераторы.
Я не утверждаю, что языки с замыканиями и сборщиками мусора совсем не нужны, но мне не ясно, почему же популярна лишь такая идеология.

Цитата: hardcase
В одном знакомом мне языке есть структура данных "список":
 
Код:
def x = [1, 2, 3, 4];

Этот код эквивалентен следующему:
 
Код:
def x =  list.Cons(1, list.Cons(2, list.Cons(3, list.Cons(4, list.Nil()))));

Кто здесь родитель?


Если я правильно понимаю, то тут у тебя фабрика. В труъ-императивном языке объект бы создался конструктором, а фабрика бы изменила этот объект в соответствии со своими параметрами.
Но в любом случае - родитель тут не конструктор списка и не фабрика, а процедура, в которой создался этот объект, либо другой объект, в конструкторе которого был создан этот.

Цитата: hardcase
У этого списка можно легко заменить голову:
 
Код:
def newX = match(x)
{
  | head :: tail => 10 :: tail
  | [] => 10 :: [];
}

tail - это объект созданый с помощью list.Cons(2, ...). Экономия памяти на лицо.


Зачем ты это привел мне не понятно.

Цитата: hardcase
Не все структуры данных обладают связью родитель-дитя. Взгляни на любую рекурсивную структуру данных из функционального мира.


Именно по этому я в первом сообщении и упомянул, что речь идёт об императивных языках. И там все вызовы процедуры, использующую рекурсию, могут обращаться к одним и тем же данным, переданным как параметры.

87
24 мая 2011 года
Kogrom
2.7K / / 02.02.2008
Цитата: Kogrom
Если я правильно понимаю, то тут у тебя фабрика.


А нет, похоже неправильно понимаю. Это у вас конструктор такой: Cons? Мда...

5
24 мая 2011 года
hardcase
4.5K / / 09.08.2005
Цитата: Kogrom
В том, что мы не сможем выделить часть. В том, что при рефакторинге мы не сможем проследить все связи и у нас останется больше неиспользуемых кусков, чем это было бы без таких связей.

Часть чего? В настоящий момент я рефакторю тонны говнокода с дичайшей степенью связности (из инструментов лишь анализатор ILSpy) и как-то вполне все связи прослеживаются.

Цитата: Kogrom
Если объект простой (то есть не содержит ссылки на другие объекты), то все его поля можно сохранить просто. Если он ссылается на другие объекты, то по хорошему надо сохранять и их.

В нормальных сериализаторах объекты, на которые ссылается текущий объект также сериализуются. Из сложностей лишь разруливание циклических ссылок (реализуется банальным словарем).

Цитата: Kogrom
Никак. Либо передавать нужные параметры в процедуру, либо использовать объекты-генераторы.
Я не утверждаю, что языки с замыканиями и сборщиками мусора совсем не нужны, но мне не ясно, почему же популярна лишь такая идеология.

Потому что другой идеологии не существует.

Цитата: Kogrom
Если я правильно понимаю, то тут у тебя фабрика. В труъ-императивном языке объект бы создался конструктором, а фабрика бы изменила этот объект в соответствии со своими параметрами.
Но в любом случае - родитель тут не конструктор списка и не фабрика, а процедура, в которой создался этот объект, либо другой объект, в конструкторе которого был создан этот.

list - это вариантный тип данных. Cons - это один из конструкторов.

Цитата: Kogrom

Именно по этому я в первом сообщении и упомянул, что речь идёт об императивных языках. И там все вызовы процедуры, использующую рекурсию, могут обращаться к одним и тем же данным, переданным как параметры.


"Императивность" - это способ записи алгоритмов. Структуры данных во всех известных мне языках описываются декларативно.

87
24 мая 2011 года
Kogrom
2.7K / / 02.02.2008
Цитата: hardcase
Часть чего?


Часть - один из объектов. Чем больше ниточек его соединяют с другими тем сложнее его выделить.

Цитата: hardcase
В настоящий момент я рефакторю тонны говнокода с дичайшей степенью связности (из инструментов лишь анализатор ILSpy) и как-то вполне все связи прослеживаются.


Я думаю, что ты и с GOTO неплохо бы справился.

Цитата: hardcase
В нормальных сериализаторах объекты, на которые ссылается текущий объект также сериализуются. Из сложностей лишь разруливание циклических ссылок (реализуется банальным словарем).


Это нормально, когда мы сохраняем состояние программы на жесткий диск. Но это не нормально, когда мы хотим передать копию объекта в другой процесс. Неэффективно же.

Цитата: hardcase
list - это вариантный тип данных. Cons - это один из конструкторов.


Я уж понял. Но это не имеет значения.

Цитата: hardcase
"Императивность" - это способ записи алгоритмов. Структуры данных во всех известных мне языках описываются декларативно.


Не совсем так. Это ещё и способ работы с данными. Императивность подразумевает изменчивость данных. Кстати, именно поэтому чистый императивный язык эффективнее по использованию памяти, чем чистый функциональный (в котором нет даже скрытой императивности).

5
24 мая 2011 года
hardcase
4.5K / / 09.08.2005
Цитата: Kogrom

Это нормально, когда мы сохраняем состояние программы на жесткий диск. Но это не нормально, когда мы хотим передать копию объекта в другой процесс. Неэффективно же.

Можно передавать не копию, а ссылку на объект (в клиентском процессе рантайм сделает прокси).

Цитата: Kogrom
Не совсем так. Это ещё и способ работы с данными. Императивность подразумевает изменчивость данных.

Это назывется мутабельность структур данных. Она напрямую с "функциональностью" не связана. Для справки: функциональный стиль программирования требует, чтобы результат функции был детерминирован и зависел лишь от входных параметров.

Цитата: Kogrom
Кстати, именно поэтому чистый императивный язык эффективнее по использованию памяти, чем чистый функциональный (в котором нет даже скрытой императивности).

Пожалуй соглашусь, чистый функциональный язык - это язык свободный от побочных эффектов, но такие языки совершенно бесполезны.

87
24 мая 2011 года
Kogrom
2.7K / / 02.02.2008
Цитата: hardcase
Можно передавать не копию, а ссылку на объект (в клиентском процессе рантайм сделает прокси).


Ну а прокси то как работает? Разве он не гоняет туда-сюда состояние объекта?

Цитата: hardcase
Это назывется мутабельность структур данных. Она напрямую с "функциональностью" не связана. Для справки: функциональный стиль программирования требует, чтобы результат функции был детерминирован и зависел лишь от входных параметров.


В функциональном стиле я не очень разбираюсь, но про императивный читал, что одна из его характерных черт - наличие переменных с операцией "разрушающего присвоения". И там, где такое есть, рекурсивная процедура может изменять одни и те же данные по кругу. И тут родителем этих данных будет одна из внешних процедур.

Я намеренно использую термин "процедура", чтобы показать, что она не возвращает значений в отличие от функций.

5
24 мая 2011 года
hardcase
4.5K / / 09.08.2005
Цитата: Kogrom
Ну а прокси то как работает? Разве он не гоняет туда-сюда состояние объекта?

Нет. Вспомни тот же DCOM.

Цитата: Kogrom
В функциональном стиле я не очень разбираюсь, но про императивный читал, что одна из его характерных черт - наличие переменных с операцией "разрушающего присвоения". И там, где такое есть, рекурсивная процедура может изменять одни и те же данные по кругу. И тут родителем этих данных будет одна из внешних процедур.

Тогда возможно стоит поднять вопрос о необходимости императивного подхода?

5
25 мая 2011 года
hardcase
4.5K / / 09.08.2005
Цитата: Kogrom
Для чего в современных императивных языках используют ссылки вне параметров процедур?

Кстати, этот вопрос эквивалентен такому: для чего в современных языках используют динамическую память (т.е. кучу)?.

87
25 мая 2011 года
Kogrom
2.7K / / 02.02.2008
Цитата: hardcase
Нет. Вспомни тот же DCOM.


И что? Этот твой DCOM не использует маршаллинг? Или использует особый магический?

Если говорить на рабоче-крестьянском, то для передачи в другой процесс объект должен преобразоваться в поток байт, а затем из потока байт обратно восстановиться. Прокси же должен имитировать то, что у нас один объект. Всё остальное - магия. Или я не понимаю чего-то?

Цитата: hardcase
Тогда возможно стоит поднять вопрос о необходимости императивного подхода?


Я не хочу спорить на тему "императивный подход vs какой-то другой". Меня интересует целесообразность использования упомянутых ссылок.

87
25 мая 2011 года
Kogrom
2.7K / / 02.02.2008
Цитата: hardcase
Кстати, этот вопрос эквивалентен такому: для чего в современных языках используют динамическую память (т.е. кучу)?.


Нет. Это касается только конкретных языков, типа C/C++. Но даже на C++ это не полностью распространяется, так как он может использовать кучу неявно через контейнеры STL, не используя ссылки или указатели.

В других языках (например, Python) пользователь может вообще не догадываться, какую память он использует.

341
25 мая 2011 года
Der Meister
874 / / 21.12.2007
Kogrom, я правильно понял, что ты ставишь под сомнение целесообразность агрегации?
260
25 мая 2011 года
Ramon
1.1K / / 16.08.2003
А так же композицию и иже с ними.
87
25 мая 2011 года
Kogrom
2.7K / / 02.02.2008
Цитата: Der Meister
Kogrom, я правильно понял, что ты ставишь под сомнение целесообразность агрегации?


Не всю агрегацию. Композицию я одобряю, то есть случай, когда часть и целое живут одной жизнью и уничтожаются вместе.
Но агрегацию, в которой после уничтожения целого часть продолжает жить - я ставлю под сомнение.

Поясню. При правильном проектировании, родитель - это объект (или функция), которому дочерний объект нужен больше, чем другим. Родитель ответственен за дочерние объекты. Другие объекты используют дочерние лишь частично (относительно небольшие промежутки времени), поэтому им можно передавать ссылки на эти объекты как параметры методов.

Если же другим объектам передавать ссылку на дочерний объект стороннего родителя (например, в конструкторе), то эти другие будут, образно говоря, "няньками". И пока не будут уничтожены все "няньки", дочерний объект будет жить. При том далеко не факт, что какая-либо "нянька" будет использовать дочерний объект после уничтожения родителя. И при том, у каждой "няньки" от этого усложнится набор полей, "няньку" будет сложно использовать без родительского объекта.

Если совсем образно, то "у семи нянек дитя без глазу".

Цитата: Ramon
А так же композицию и иже с ними.


Композицию я не ставлю под сомнение.

297
25 мая 2011 года
koodeer
1.2K / / 02.05.2009
Цитата: Kogrom
А нет, похоже неправильно понимаю. Это у вас конструктор такой: Cons? Мда...


А разве в Питоне списки не также устроены?


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

297
25 мая 2011 года
koodeer
1.2K / / 02.05.2009
Ещё. Как обходиться без ссылок, если нужна динамически выделяемая память? Всё на стек не запихнёшь. Или я не так понял?
297
26 мая 2011 года
koodeer
1.2K / / 02.05.2009
Kogrom то против инкапсуляции борется, то теперь против ссылок и указателей. Что за язык получится в итоге: Бейсик, Фортран?
Ой, недоброе он замышляет! Может, забаним, пока не поздно? :)
6
26 мая 2011 года
George
4.1K / / 05.01.2007
Цитата: koodeer
Kogrom то против инкапсуляции борется, то теперь против ссылок и указателей. Что за язык получится в итоге: Бейсик, Фортран?
Ой, недоброе он замышляет! Может, забаним, пока не поздно? :)


Забанить нельзя, он же модер. Терпите, кексы. :)

5
26 мая 2011 года
hardcase
4.5K / / 09.08.2005
Цитата: Kogrom
Поясню. При правильном проектировании, родитель - это объект (или функция), которому дочерний объект нужен больше, чем другим. Родитель ответственен за дочерние объекты. Другие объекты используют дочерние лишь частично (относительно небольшие промежутки времени), поэтому им можно передавать ссылки на эти объекты как параметры методов.

Как определить "нужен больше"?


Цитата: Kogrom

Если же другим объектам передавать ссылку на дочерний объект стороннего родителя (например, в конструкторе), то эти другие будут, образно говоря, "няньками". И пока не будут уничтожены все "няньки", дочерний объект будет жить. При том далеко не факт, что какая-либо "нянька" будет использовать дочерний объект после уничтожения родителя. И при том, у каждой "няньки" от этого усложнится набор полей, "няньку" будет сложно использовать без родительского объекта.

Если совсем образно, то "у семи нянек дитя без глазу".

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

87
26 мая 2011 года
Kogrom
2.7K / / 02.02.2008
Цитата: koodeer
А разве в Питоне списки не также устроены?


Там без Cons наружу. Есть __init__, но он только внутри класса.

Цитата: koodeer
Когром, в прошлой своей теме про публичность всего и вся тебе многие неоднократно говорили, что таким образом ты создаёшь предпосылки для возможного лишнего связывания разных частей кода. А тут ты вдруг ратуешь за минимум связности. Осознал, в чём тогда была одна из ошибок?


Там я говорил про функции, а тут я говорю про данные. Есть разница.
И да, я не говорил про публичность всего и вся, а лишь про правильную организацию инкапсуляции.

Цитата: koodeer
Ещё. Как обходиться без ссылок, если нужна динамически выделяемая память? Всё на стек не запихнёшь. Или я не так понял?


Через списки, контейнеры, словари и т.д. Пусть у них внутри будут указатели и прочие низкоуровневые детали - пользователю не обязательно об этом знать.

Цитата: koodeer
Kogrom то против инкапсуляции борется, то теперь против ссылок и указателей. Что за язык получится в итоге: Бейсик, Фортран?


Инкапсуляцию я уважаю, ссылки тоже. Но всё должно быть на своих местах.

Цитата: hardcase
Как определить "нужен больше"?


С помощью проектирования. То есть, использовав шаблон Creator из GRASP.

Цитата: hardcase
Но вообще сборка мусора - это наиболее абстрактная схема управления памятью, так как отлично ложится на концепцию "объект существует пока он нужен". Критерий "нужности" - достижимость объекта из корней сборщика мусора (точек в памяти, откуда GC начинает обход графа объектов). Т.е. этот подход - обобщение твоего предложения.


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

5
26 мая 2011 года
hardcase
4.5K / / 09.08.2005
Цитата: Kogrom

Через списки, контейнеры, словари и т.д. Пусть у них внутри будут указатели и прочие низкоуровневые детали - пользователю не обязательно об этом знать.

Отлично. Я пользователь, и хочу создать структуру данных "разряженный массив". Как быть?

Цитата: Kogrom

С помощью проектирования. То есть, использовав шаблон Creator из GRASP.

Чего? В каждом классе на ровном месте наворачивать "шаблоны проектирования"?


Цитата: Kogrom
Это далеко не идеальный критерий. Его достоинство в том, что он позволяет создавать системы разгильдяйским способом. Это нормально для языков программирования, которые подразумевают создание прототипов программ, ибо прототип можно написать и выкинуть. Но при разработке предсказуемого ПО с ясным кодом такой подход теряет свою привлекательность.

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

87
26 мая 2011 года
Kogrom
2.7K / / 02.02.2008
Цитата: hardcase
Отлично. Я пользователь, и хочу создать структуру данных "разряженный массив". Как быть?


Чем не устраивает словарь?

Цитата: hardcase
Чего? В каждом классе на ровном месте наворачивать "шаблоны проектирования"?


Если требуется аккуратная работа, то да. Для крупных систем это даст выигрыш в ясности кода.

Цитата: hardcase
Практика показывает обратное. Утечек памяти в рантаймах со сборкой мусора значительно меньше, чем в системах с ручным управлением памятью.


А кто говорит про системы с ручным управлением памятью?

5
26 мая 2011 года
hardcase
4.5K / / 09.08.2005
Цитата: Kogrom
Чем не устраивает словарь?

Тем что это словарь. Не надо уходить от темы. Я пользователь и хочу реализовать собственную структуру данных. Как мне быть?

Цитата: Kogrom
Если требуется аккуратная работа, то да. Для крупных систем это даст выигрыш в ясности кода.

Все вокруг так и делают что пишут крупные системы. Язык должен быть масштабируем - небольшие программы должно быть писать легко. Большие - тоже легко. Выигрышь в ясности кода дают соглашения об именовании и форматировании + регулярные ревью.


Цитата: Kogrom
А кто говорит про системы с ручным управлением памятью?

Ты предлагаешь уйти от обобщенной модели сборки мусора (которая умеет работать с графами) и от ручной, которая еще более гибкая, к иерархической модели основаной на модели "родитель-дитя". А что если мне нужно держать в памяти не дерево, но граф?

87
26 мая 2011 года
Kogrom
2.7K / / 02.02.2008
Цитата: hardcase
Тем что это словарь. Не надо уходить от темы. Я пользователь и хочу реализовать собственную структуру данных. Как мне быть?


Ты спрашивал про разряжённый массив. Насколько я понимаю, это разновидность словаря. Заключи словарь в классовую обёртку и выведи наружу требуемые методы.
Если требуется что-то нестандартное, то можно воспользоваться модулем, написанным на низкоуровневом языке. Все высокоуровневые языки к такому прибегают.

Цитата: hardcase
Язык должен быть масштабируем - небольшие программы должно быть писать легко. Большие - тоже легко.


Кому должен? Вон баш плохо масштабируем и ничего, пользуется популярностью.

Цитата: hardcase
Выигрышь в ясности кода дают соглашения об именовании и форматировании + регулярные ревью.


Зачем тогда нужны языки кроме ассемблера?

Цитата: hardcase
Ты предлагаешь уйти от обобщенной модели сборки мусора (которая умеет работать с графами) и от ручной, которая еще более гибкая, к иерархической модели основаной на модели "родитель-дитя". А что если мне нужно держать в памяти не дерево, но граф?


1. Подключай нужные звенья динамически. Зачем нужно, чтобы они были постоянно переплетены?
2. Если нужна статическая структура, то можно использовать словари.
3. Если первые два пункта не подошли, то у тебя какая-то специфическая задача и можно воспользоваться другим языком. Но за решение этой специфической задачи мы платим бардаком в коде, в котором она не нужна.

5
26 мая 2011 года
hardcase
4.5K / / 09.08.2005
Цитата: Kogrom
Ты спрашивал про разряжённый массив. Насколько я понимаю, это разновидность словаря. Заключи словарь в классовую обёртку и выведи наружу требуемые методы.

Словарь можно реализовать минимум 3 способами (какой из них имеешь в виду ты?). А меня не устраивает ни один из них для реализации разреженного массива.

Цитата: Kogrom
Если требуется что-то нестандартное, то можно воспользоваться модулем, написанным на низкоуровневом языке. Все высокоуровневые языки к такому прибегают.

Чтобы реализовать разреженный массив на C# или Nemerle мне не то что не придется писать на C, мне даже указатели не потребуются.

Цитата: Kogrom
Кому должен? Вон баш плохо масштабируем и ничего, пользуется популярностью.

На баше не создают, с одной стороны, программки с одной кнопкой для мобильника и, с другой, - корпоративные системы документооборота. А вот Java или C# вполне годятся (хотя им до идеала как до Альфацентавара на гужевой повозке).

Цитата: Kogrom
Зачем тогда нужны языки кроме ассемблера?

Толсто.

Цитата: Kogrom
1. Подключай нужные звенья динамически. Зачем нужно, чтобы они были постоянно переплетены?

Не делай в программе ошибки. Зачем делать их в программах?

Цитата: Kogrom
2. Если нужна статическая структура, то можно использовать словари.

Только массовые словари спасут демократию в этой стране. :)

Цитата: Kogrom
3. Если первые два пункта не подошли, то у тебя какая-то специфическая задача и можно воспользоваться другим языком. Но за решение этой специфической задачи мы платим бардаком в коде, в котором она не нужна.

Для лаконичного и наглядного решения крайне специфических задач (описание парсера к примеру, введение новой контейнерной структуры данных - не тот случай) нужно иметь возможность расширять базовый язык. Впрочим тут уже какойто оффтоп.

5
26 мая 2011 года
hardcase
4.5K / / 09.08.2005
Цитата: Kogrom

1. Подключай нужные звенья динамически. Зачем нужно, чтобы они были постоянно переплетены?
2. Если нужна статическая структура, то можно использовать словари.
3. Если первые два пункта не подошли, то у тебя какая-то специфическая задача и можно воспользоваться другим языком. Но за решение этой специфической задачи мы платим бардаком в коде, в котором она не нужна.


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

5
26 мая 2011 года
hardcase
4.5K / / 09.08.2005
Задача. Процедура F получает на вход два списка x и y и добавляет в них объект a. Кто является хозяином чего и когда память под объект a можно будет освобождать:
 
Код:
procedure F(x : List, y : List)
var a : A;
begin
  a := A.Create();
  x.Add(a);
  y.Add(a);
end;
87
26 мая 2011 года
Kogrom
2.7K / / 02.02.2008
Цитата: hardcase
Словарь можно реализовать минимум 3 способами (какой из них имеешь в виду ты?). А меня не устраивает ни один из них для реализации разреженного массива.


Разряжённый массив - это ассоциативный массив. Синонимом ассоциативного массива является словарь.
Говори, что тебе надо конкретно, с подробностями.

Цитата: hardcase
Чтобы реализовать разреженный массив на C# или Nemerle мне не то что не придется писать на C, мне даже указатели не потребуются.


Уж не ответил ли ты тут сам на свой вопрос про создание разряженного массива? Можешь показать реализацию на C#?

Цитата: hardcase
На баше не создают, с одной стороны, программки с одной кнопкой для мобильника и, с другой, - корпоративные системы документооборота. А вот Java или C# вполне годятся (хотя им до идеала как до Альфацентавара на гужевой повозке).


Программа с одной кнопкой для мобильника может быть сколько угодно большой программой.
Кроме того, баш + dialog - даст приложение с одной кнопкой наверняка компактнее, чем в C# или Java.

Цитата: hardcase
Толсто.


Я другими словами выразил твой вопрос. Значит и у тебя было толсто.


Цитата: hardcase
Только массовые словари спасут демократию в этой стране. :)


Не обязательно. Просто это решение наиболее простое решение, которое можно привести в пример.

Цитата: hardcase
Для лаконичного и наглядного решения крайне специфических задач (описание парсера к примеру, введение новой контейнерной структуры данных - не тот случай) нужно иметь возможность расширять базовый язык. Впрочим тут уже какойто оффтоп.


А можно просто создать DSL.

Цитата: hardcase
Я так и не понял, как реализовать граф, в узлах которого помимо некоторых специфичных данных можно будет хранить список входящих и исходящих ребер?


В виде схемы же, которой он и является. Схему можно реализовать на словарях. Не нравится словарь - можно даже и на списках. Да можно и в виде строки. В чём проблема?

87
26 мая 2011 года
Kogrom
2.7K / / 02.02.2008
Цитата: hardcase
Задача. Процедура F получает на вход два списка x и y и добавляет в них объект a. Кто является хозяином чего и когда память под объект a можно будет освобождать:
 
Код:
procedure F(x : List, y : List)
var a : A;
begin
  a := A.Create();
  x.Add(a);
  y.Add(a);
end;


Процедура F является родителем объекта a. Копии этого объекта передаются в списки x, y. Объект a уничтожается с завершением процедуры. Копии объекта a уничтожатся при уничтожении x, y.

5
26 мая 2011 года
hardcase
4.5K / / 09.08.2005
Цитата: Kogrom
Процедура F является родителем объекта a. Копии этого объекта передаются в списки x, y. Объект a уничтожается с завершением процедуры. Копии объекта a уничтожатся при уничтожении x, y.


Идем дальше. Объект A занимает в памтяти, скажем, 200 КБ (допустим изображение у него там в полях, или строка текста большая).
Т.е. перед строкой end; у нас в памяти ТРИ объекта A размером в 200 КБ?

87
26 мая 2011 года
Kogrom
2.7K / / 02.02.2008
Цитата: hardcase
Идем дальше. Объект A занимает в памтяти, скажем, 200 КБ (допустим изображение у него там в полях, или строка текста большая).
Т.е. перед строкой end; у нас в памяти ТРИ объекта A размером в 200 КБ?


Ты так рассуждаешь, потому что к этому тебя приучили современные ЯП. Если у нас там изображение или большие строки, то мы используем один объект (или массив) с картинками и передаем его во временное пользование другим объектам через параметры процедур.

5
26 мая 2011 года
hardcase
4.5K / / 09.08.2005
Цитата: Kogrom
Разряжённый массив - это ассоциативный массив. Синонимом ассоциативного массива является словарь.
Говори, что тебе надо конкретно, с подробностями.

Допустим нужно быстро вставлять и доставать тысячи последовательных элементов, но в диапазоне индексов от [0 .. 1 000 000 000). Формулировка, конечно, высосана из пальца (точнее, гдето в вопросах на RSDNе проскакивала), но словари тут не помощники.


Цитата: Kogrom
Программа с одной кнопкой для мобильника может быть сколько угодно большой программой.
Кроме того, баш + dialog - даст приложение с одной кнопкой наверняка компактнее, чем в C# или Java.

Критерий компактности в студию.


Цитата: Kogrom
В виде схемы же, которой он и является. Схему можно реализовать на словарях. Не нравится словарь - можно даже и на списках. Да можно и в виде строки. В чём проблема?


Вообще все ООП и даже больше можно на словарях организовать (см JavaScript), только из этого ничего хорошего почему-то не выходит. Еще раз повторяю: не все объекты находятся в зависимости "родитель-дитя". Пример тому - граф.

5
26 мая 2011 года
hardcase
4.5K / / 09.08.2005
Цитата: Kogrom
Ты так рассуждаешь, потому что к этому тебя приучили современные ЯП. Если у нас там изображение или большие строки, то мы используем один объект (или массив) с картинками и передаем его во временное пользование другим объектам через параметры процедур.


А как тогда такие большие объекты складывать в коллекции? У тебя же там копирование на каждом шагу?

87
26 мая 2011 года
Kogrom
2.7K / / 02.02.2008
Цитата: hardcase
Допустим нужно быстро вставлять и доставать тысячи последовательных элементов, но в диапазоне индексов от [0 .. 1 000 000 000). Формулировка, конечно, высосана из пальца (точнее, гдето в вопросах на RSDNе проскакивала), но словари тут не помощники.


Может и так. Но решение наверняка будет реализовываться на основе стандартных контейнеров. Или нет?

Цитата: hardcase
Критерий компактности в студию.


Да я тебе лучше пример приведу:

Код:
#!/bin/bash
DIALOG=${DIALOG=dialog}

$DIALOG --title " Мой первый диалог" --clear \
        --yesno "Привет! Перед вами пример программы,\nиспользующей (X)dialog" 10 40

case $? in
    0)
        echo "Выбрано 'Да'.";;
    1)
        echo "Выбрано 'Нет'.";;
    255)
        echo "Нажата клавиша ESC.";;
esac

За корректность не отвечаю - скопипастил. Но как-то так должно быть. Кратко и наглядно.
Цитата: hardcase
Еще раз повторяю: не все объекты находятся в зависимости "родитель-дитя". Пример тому - граф.


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

87
26 мая 2011 года
Kogrom
2.7K / / 02.02.2008
Цитата: hardcase
А как тогда такие большие объекты складывать в коллекции? У тебя же там копирование на каждом шагу?


Элементарно. Коллекция создает в себе новый объект. Меняем состояние этого объекта, если требуется.

5
26 мая 2011 года
hardcase
4.5K / / 09.08.2005
Цитата: Kogrom
Элементарно. Коллекция создает в себе новый объект. Меняем состояние этого объекта, если требуется.

Что происходит с большим содержимым объекта A из примера?

87
26 мая 2011 года
Kogrom
2.7K / / 02.02.2008
Цитата: hardcase
Что происходит с большим содержимым объекта A из примера?


Смотри псевдокод:
Добавить к коллекции новый объект типа А в котором создастся картинка из файла Б.

Объект А удалится вместе со всей коллекцией или по специальной команде типа erase.

5
26 мая 2011 года
hardcase
4.5K / / 09.08.2005
Цитата: Kogrom
Может и так. Но решение наверняка будет реализовываться на основе стандартных контейнеров. Или нет?

Да. Если считать одномерные массивы стандартными контейнерами. На их основе реализованы все остальные коллекции (за исключением, конечно, деревьев и связных списков).


Цитата: Kogrom
Да я тебе лучше пример приведу:
Код:
#!/bin/bash
DIALOG=${DIALOG=dialog}

$DIALOG --title " Мой первый диалог" --clear \
        --yesno "Привет! Перед вами пример программы,\nиспользующей (X)dialog" 10 40

case $? in
    0)
        echo "Выбрано 'Да'.";;
    1)
        echo "Выбрано 'Нет'.";;
    255)
        echo "Нажата клавиша ESC.";;
esac


За корректность не отвечаю - скопипастил. Но как-то так должно быть. Кратко и наглядно.


Такую фигню даже на VB можно сделать с неменьшей наглядностью и без всяких магических чисел

Код:
using System.Console;
using System.Windows.Forms;

match(MessageBox.Show(
  text    = "Привет! Перед вами пример программы,\nиспользующей (X)dialog",
  caption = "Мой первый диалог",
  buttons = MessageBoxButtons.YesNoCancel))
{
  | DialogResult.Yes => WriteLine("Выбрано 'Да'")
  | DialogResult.No  => WriteLine("Выбрано 'Нет'")
  | _ => WriteLine("Диалог отменен")
};



Цитата: Kogrom
Конечно не все объекты находятся в такой зависимости. Но ничто им не мешает подключаться на определённые промежутки времени в соответствии с определённой схемой. Более того, при моем подходе объекты могут существовать только в моменты, когда связь понадобится.

И как определять когда же связь нужна?

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог