3 / 3 / 1
Регистрация: 15.01.2016
Сообщений: 34
|
|
1 | |
Как удобнее обойти инкапсуляцию в программе из нескольких файлов на С/С++?13.04.2017, 18:36. Показов 3434. Ответов 34
Метки нет (Все метки)
Ситуация такая: в программах на Бейсике, например, существуют единые для всего кода переменные, с которыми можно полноценно работать в любом месте программы. Есть многочисленные подпрограммы - просто повторяющиеся куски кода, которые для экономии и удобства выносятся отдельно.
Вопрос: как лучше настроить программу на С/С++, чтобы с заданными переменными также можно было работать в любом месте (в т.ч., в функциях, находящихся в другом файле) программы, без непосредственной передачи этих переменных функции? Понимаю, что это, скорее всего, изврат, и будет много аргументов в пользу того, почему так делать не надо. ) Но для моей скромной задачи (перегнать старую программу на бейсике в СИ) никакой инкапсуляции переменных действительно не требуется. Она только мешает и усложняет программу, написанную совсем по другой логике.
0
|
13.04.2017, 18:36 | |
Ответы с готовыми решениями:
34
При открытии нескольких файлов, каждый открывался в отдельной программе Как обойти запрет трафика торрент-файлов? Как обойти ошибку копирования файлов, если usb disk не подключён? Как добавить обработку файлов нескольких определённых типов в код BAT-файла для архивации файлов? |
3 / 3 / 1
Регистрация: 15.01.2016
Сообщений: 34
|
|
14.04.2017, 18:05 [ТС] | 21 |
Спасибо, попробую. Переучиваться - это не страшно. Главное, чтобы сложилась хоть какая-то концепция, которая позволит правильно применять новые знания. Пока что все разговоры про какие-то многопоточные системы, типы памяти и её распределение просто пустой звук, непонятно каким боком относящийся к конкретной пограмме, и только ещё больше сбивающий с толку. Половину обсуждений просто не понимаю - не говоря уж о каких-то более тонких нюансах написания и настройки сборки. Но при всём при этом чисто технически что-то писать уже могу. =)
0
|
Комп_Оратор)
|
|
14.04.2017, 19:26 | 22 |
Это ещё мягко сказано. На самом деле, бедолаги или сходят с ума или умирают в муках. Я это знаю не по наслышке. Сам начинал с альфа-Бейсика лет 30+ назад. В итоге, чуть не умер.
0
|
3 / 3 / 1
Регистрация: 15.01.2016
Сообщений: 34
|
|
14.04.2017, 20:49 [ТС] | 23 |
Ой, да ладно Вам. ) Когда понятно объясняют, или хотя бы есть, где получить толковые ответы на свои бестолковые вопросы, то всё не так страшно. Изначально ни один хороший программист ничего не знал - но как-то выучился. Когда я начинал программировать, для этого требовались хорошие способности и маленькая брошюрка с описаниями команд и другой необходимой информацией. На данный момент всё наоборот. Нужно постоянно что-то изучать и осваивать, перекапывать тонны каких-то мануалов, чтобы писать "правильно" - а способности уже отходят на второй план. Так что даже не глупому новичку в этом обилии чужих терминов и идей есть от чего схватиться за голову, и это не удивительно.
А вот если от чего и можно сойти с ума - так это если все вокруг будут только отпускать многозначительные намёки на безнадёжность, ничего при этом не объясняя. Или объясняя так, что ничего не понятно - а потом говоря "ну вот, что я вам говорил, безнадёжный случай". ) Не все даже знающие люди могут что-то доступно объяснить.
0
|
Комп_Оратор)
|
|
14.04.2017, 22:18 | 24 |
Если вы перечитаете то поймёте, что я пошутил по поводу фразы Дейкстры. Иначе бы я действительно должен был сойти с ума. Раз уж выжил. Программист, это если не чувство юмора, то логика, обязательно.
Прочтите "Верный вопрос" Р. Шекли. Тут вам дали отличные ответы на все варианты. Беда в том, что в программировании (и не только) нельзя задать общий вопрос и получить конкретный ответ. А если еще и вопрос не корректен, то и совсем беда.
Если бы вы выложили критическое место и внятно изложили проблему, то получили бы достаточно точные и сжатые ответы без неоднозначностей.
0
|
3 / 3 / 1
Регистрация: 15.01.2016
Сообщений: 34
|
|
14.04.2017, 22:47 [ТС] | 25 |
Ну я в целом догадываюсь, что с ума Вы не сошли. ) Но в общем это не меняет того, что написал я.
Задачу и так уже старался поставить как можно конкретнее - сквозное использование переменных по всему телу программы. Насколько я понял из книг, инкапсуляция была введена для более удобной и безопасной сборки программы, отдельные куски которой пишутся разными программистами. При таком подходе можно не беспокоиться, что в "чужой" функции кто-то повредит "твою" переменную, поскольку их имена совпадут. В моём же случае программу пишу я, один. И часто для трёх строчек кода с формулами, вынесенными отдельно, надо передавать штук 10-15 параметров, что уже не очень удобно. Особенно при настройке (когда в формулах что-то добавляется/убирается). Ещё хуже, когда на выходе требуется вернуть не одно значение, а несколько. Полноценных подпрограмм в СИ нет, поэтому инкапсуляция функций в данном случае никак не помогает, а только усложняет код, заставляя по-разному обходить СИшные ограничения. В целом да, ответы получил, спасибо. Хотя рассуждения вроде "Глобальные переменные, как известно - если и не абсолютное зло, но всё равно - зло, от которого, желательно, держаться подальше." без объяснений, почему оно так, примерно так же информативны, как объяснения малышу "вот вырастешь - тогда поймёшь". Собственно, это же относится и к советам "а не проще ли создать хедер с неймспейсом. И в нём всё описать.". ) А вот конкретные примеры кода от nd2 и Captain Maxee в начале ветки если даже кому-то будут непонятны, то, по крайней мере, уже дают возможность разобраться в данном конкретном случае.
0
|
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
|
|
14.04.2017, 23:03 | 26 |
Есть правило форума: одна тема - один вопрос. Поэтому я тебе и написал:
Кто не устал повторять уже сто раз сказанное (здесь, на формуме), может и объяснит (если сам не можешь найти информацию).
1
|
Комп_Оратор)
|
|
14.04.2017, 23:11 | 27 |
Из вашего вопроса непонятно сколько файлов в вашей программе, как они связаны и где объявлены глобальные переменные.
Никогда. Это общее правило сокрытия реализации. Более мене сложные вещи не могут быть открыты и не вызывать проблем. Это не со сборкой связано.
Шо щас будит... Не говорите такого больше. Умоляю!
На каждом столбе написано, что глобальная переменная позволяет себя модифицировать из любого места и в любой момент. Трассировка и отлов инфы типа: "кто был неправ", становится занятием настоящих ковбоев! О засорении пространства имён вы знаете. Трудно почитать о пространствах имён? Я за вас это делать не буду. Но тогда о чём речь?
0
|
3 / 3 / 1
Регистрация: 15.01.2016
Сообщений: 34
|
|
15.04.2017, 00:24 [ТС] | 28 |
Знать бы ещё, что именно искать... По Вашей сылке ходил - ничего не понял. Там явно не начальный уровень. Отдельная тема с вопросом "в чём зло глобальных переменных"? ) Как-то глуповато смотрится для отдельной темы. Да и если ответы будут такие же, как по ссылке, то вряд-ли это чем-то поможет. )
Файлов я написал, что больше одного (которые .cpp). Пока их два. Но разве при увеличении кол-ва в других всё будет организовано не аналогично? Как их лучше связать и где объявлять глобальные переменные, чтобы с ними можно было работать из любого места программы - это как раз мне и хотелось бы понять. Устроит любой вариант. Ну я примерно про это и написал, только другими словами. У меня же вещь не сложная, усложнять её не планируется, и тем более не планируется подключать других программистов. Я же вполне в состоянии проследить за собственными переменными, и мне пока куда удобнее и привычнее, чтобы их было видно отовсюду. Лишь бы это не вызывало каких-то непонятных мне косяков реализации - из серии непонятного "зла, которого стоит избегать". Вот, это как раз пример тех самых ничего не объясняющих фраз с намёками на "безнадёжность", которые действительно могут свести с ума того, кто пытается в чём-то разобраться. ) Не отвечайте так больше, умоляю. Лучше уж никак. Если это единственное "зло" - так в тех языках, с которыми я работал, так всю жизнь и было. Мне это как раз куда понятнее и привычнее, чем какие-то игры в "секретность" внутри собственной же программы. По-моему, дело вкуса. Ну и внимательности. Конечно, не в том случае, если программа пишется толпой - там преимущества инкапсуляции очевидны. Действительно не знаю. В других языках с этим не сталкивался, в моём учебнике этого тоже не было (не исключено, конечно, что невнимательно читал и упустил этот момент, или он упоминался вскользь). Вот. Достаточно просто спокойно указать, что именно надо найти и почитать - и это решит многие проблемы. Ибо как можно докопаться до нужной информации, если не иметь даже представления, что вбивать в поиск? Спасибо.
0
|
284 / 232 / 114
Регистрация: 07.09.2016
Сообщений: 584
|
|
15.04.2017, 00:30 | 29 |
глобальные переменные в больших проектах массу проблем привносит, когда правка кода в одном месте ломает логику в другом и чтобы найти проблему, надо выискивать и анализировать все места, в которых как-то обращаются к таким переменным. вот идеальный пример того, во что может вылиться подобный подход:
ЩИ!!!Симулятор жестокости http://www.gamedev.ru/projects/forum/?id=160897 а в маленьких программках, которые нужны на одно выполнение - почему бы и нет, если это сэкономит время на написание. тяп ляп, готово, запустил, получил результаты, код выкинул, сэкономил время.
0
|
Комп_Оратор)
|
|
15.04.2017, 00:40 | 30 |
Намёка нет. Просто на этом форуме немало программистов С которые могут затеять спор по данному поводу. Это бывало не раз, но сейчас не будет скорее всего. Просто на фразу вроде:
не отреагировать нельзя. Но чтобы затеять спор поэтому поводу нужно же понять, что вас сподвигло такое написать. Всего доброго.
0
|
3 / 3 / 1
Регистрация: 15.01.2016
Сообщений: 34
|
|
15.04.2017, 01:45 [ТС] | 31 |
Да, вышло несколько хамовато. Хотел подправить на "ещё лучше - ответить более информативно", но не успел уложитья в 5 минут, которые на форуме отведены на правку (очень дебильное правило). Ни в коем случае не хотел обидеть. Просто подобыне ответы больше похожи на насмешку, и действительно выбивают из колеи. Особенно не привычных к форумам людей. И не несут никакой полезной информации.
Вот так было бы куда лучше и понятнее. А в чём именно суть спора, если в СИ действительно нет подпрограмм, а есть только функции - о чём писали практически во всех учебниках, которые мне попадались? Подпрограмма в моём понимании - это просто произвольно выдранный повторяющийся кусок кода, который в вынесенном состоянии работает так же, как бы он работал в теле программы - т.е., ему не надо ничего передавать, и он не обязан ничего возвращать, но в процессе работы он имеет доступ ко всем тем же ресурсам, что и сама программа - т.е. может существенно что-то изменить. В СИ же этого нет - приходится обходиться инкапсулированными функциями, максимум с одним возвращаемым параметром (если без шаманства). Возможно, конечно, что в современном понятии подпрограмма и функция это уже почти одно и то же. Добавлено через 17 минут Господи, там какой-то тихий ужас. )) У меня же всё культурно - каждая переменная изначально задана для своей цели (кроме переменных общего назначения, вроде счётчиков циклов). И всё, что можно испортить некорректным изменением соответственной переменной в одном месте программы - это её же значение в другом месте. Сейчас же для выноса повторяющихся кусков кода за пределы программы приходится городить функции, часто со множеством параметров, которые тут же напрямую передаются аналогичным внутренним переменным - просто лишнее ненужное действие. И неудобства доставляет как раз то, что я не могу ни изменить значение основной переменной изнутри функции, ни вернуть назад больше одного параметра. Ну это было до тех пор, пока не догадался передавать функции указатели. =\ Но всё равно получается довольно громоздко и неудобно при отладке - при обкатке формул часто меняется кол-во компонентов, что ведёт к изменению списка параметров функции как минимум в трёх местах программы (сама функция, заголовочный файл и ВСЕ точки вызова). Потом, если что-то не понравилось - приходится всё откатывать назад. Имхо лишний неоправданный гемор.
0
|
Комп_Оратор)
|
|
15.04.2017, 09:22 | 32 |
Принимается.
функции это подпрограммы. Если вам не нужен параметризованный код то можно использовать функцию без параметров, а если вам не нужно ничего возвращать явно возвращайте void. Но познакомившись с указателями и ссылками вы увидите что в С++ есть способы неявного возврата. Тогда такой сайдэффект как изменение глобальной переменной перестанет по сути отличаться от передачи и возврата значения ничем кроме ущербности. Кстати говоря, в ограниченной зоне видимости способность использовать переменные из контекста это иногда очень полезная штука. Она имеет отношение к понятию замыкания и используется. Но в общем и целом это плохо. Смысла спорить об этом нет.
Да. Функция это достаточно развитая подпрограмма. Хотя возможности функционального программирования в современном понимании гораздо шире. Но мы говорим о С++. Они в пределах. Для того и придуманы структуры, чтобы логически связанные наборы объединять в записи и передавать (и вообще оперировать) как единое целое.
0
|
3 / 3 / 1
Регистрация: 15.01.2016
Сообщений: 34
|
|
15.04.2017, 09:56 [ТС] | 33 |
Вот поэтому и хочется почитать что-нибудь не только по синтаксису языка, а именно с объяснением логики правильного подхода к программированию. И чем больше это будет поначалу на пальцах, тем лучше - специальной терминологии можно и позже нахвататься. Очень очень положительные впечатления в этом плане от книги Чарльза Петзольда по 95-й винде - практически только начал читать, и уже перестал пугать код виндового хэлловорлда, в котором поначалу вообще не мог понять, что к чему, и как весь этот огород относится к выводу на экран одной строчки. Собственно, уже морально вполне готов изучать вопрос дальше самостоятельно и пробовать писать под винду что-нибудь не очень сложное. К сожалению, логике самого С++ там особого внимания не уделяется.
Ну имелось в виду - выноса за пределы исполняемого участка кода. Понятно, что всё это одна программа. Да, но как быть, если одни и те же переменные в разных сочетаниях используются в нескольких функциях? Городить некие "частично пересекающиеся" структуры? Или объединять вообще всё, что можно, в какую-то мегаструктуру, где есть вообще всё? Непонятно. Опять же, даже в случае с одной структурой и одной функцией - её придётся точно так же корректировать каждый раз, когда в формулу надо будет что-то добавить (или убавить).
0
|
Комп_Оратор)
|
|
15.04.2017, 12:34 | 34 |
Вот! Это и есть корень зла.
*** Прилетит вдруг волшебник, В голубом вертолёте, И научит меня си пляс пляс. Растолкует алфавит, С поумненьем поздравит, И на радостях пустится в пляс! Так не бывает. Сначала нужно читать, напрягаться и пытаться строить
0
|
3 / 3 / 1
Регистрация: 15.01.2016
Сообщений: 34
|
|
15.04.2017, 14:06 [ТС] | 35 |
Ну я же только что чуть выше привёл пример, что бывает. ) Там, где говорил о книге про винду. Просто есть люди, которые умеют понятно объяснять, и которые не умеют (не хотят? пишут книги ради денег? не знаю). Беда большей части современной литературы даже не в обилии терминологии (это, скорее, беда форумов, где даже что-то объясняя, не всегда умеют спуститься с небес на землю), а в том, что зачастую не подают информацию системно.
В первый раз это заметил ещё у Фигурнова в его книге про MS-DOS - и на фоне удобных и понятных учебников, где после объяснения действия команды все её возможные параметры, например, сводились в таблицы, был неприятно поражён, что никак не могу разобраться с элементами файлов config.sys и autoexec.bat, про которые вообще ничего толком не объяснялось. Изложение шло в стиле "Вы можете сделать вот так вот. А если Вам понадобится вот это - то можете сделать вот так. А ещё иногда делают вот так." И даже эта скудная информация была как-то бессистемно раскидана по всей книге, что сразу и не найдёшь. В итоге и полный список возможных команд, и их назначение, и возможные параметры - кроме каких-то отдельных примеров - после прочтений той книги остались тайной за семью печатями. Но там я хотя бы знал, что мне нужно искать! К сожалению, впоследствии стал встречать много такой литературы, которая скорее "натаскивает" на какой-то ограниченный круг типовых действий и задач, чем что-то объясняет. И не всегда даже понятно, что именно тебе недообъяснили, где это взять, или как правильно задать вопрос. Да по самой теме вроде как уже давно всё. )
0
|
15.04.2017, 14:06 | |
15.04.2017, 14:06 | |
Помогаю со студенческими работами здесь
35
Как не нарушить инкапсуляцию? Как применить инкапсуляцию в коде? подскажите обойти защиту в программе В каких случаях удобнее использовать processes , в каких удобнее threads? История открытых/созданных файлов в программе файлов (история), записывать в файл либо бд, или ещё как-то Как обойти ограничение размера программы или объема данных без создания дополнительных файлов программы. Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |