Принцип открытости означает что
Принцип открытости означает что
(в ред. Федерального закона от 26.04.2007 N 63-ФЗ)
(см. текст в предыдущей редакции)
Принцип прозрачности (открытости) означает:
обязательное опубликование в средствах массовой информации утвержденных бюджетов и отчетов об их исполнении, полноту представления информации о ходе исполнения бюджетов, а также доступность иных сведений о бюджетах по решению законодательных (представительных) органов государственной власти, представительных органов муниципальных образований;
обязательную открытость для общества и средств массовой информации проектов бюджетов, внесенных в законодательные (представительные) органы государственной власти (представительные органы муниципальных образований), процедур рассмотрения и принятия решений по проектам бюджетов, в том числе по вопросам, вызывающим разногласия либо внутри законодательного (представительного) органа государственной власти (представительного органа муниципального образования), либо между законодательным (представительным) органом государственной власти (представительным органом муниципального образования) и исполнительным органом государственной власти (местной администрацией);
обеспечение доступа к информации, размещенной в информационно-телекоммуникационной сети «Интернет» на едином портале бюджетной системы Российской Федерации;
(абзац введен Федеральным законом от 07.05.2013 N 104-ФЗ)
стабильность и (или) преемственность бюджетной классификации Российской Федерации, а также обеспечение сопоставимости показателей бюджета отчетного, текущего и очередного финансового года (очередного финансового года и планового периода).
Секретные статьи могут утверждаться только в составе федерального бюджета.
Статья 36. Принцип прозрачности (открытости)
Информация об изменениях:
Федеральным законом от 7 мая 2013 г. N 104-ФЗ в статью 36 настоящего Кодекса внесены изменения
Статья 36. Принцип прозрачности (открытости)
ГАРАНТ:
См. комментарии к статье 36 БК РФ
Принцип прозрачности (открытости) означает:
обязательное опубликование в средствах массовой информации утвержденных бюджетов и отчетов об их исполнении, полноту представления информации о ходе исполнения бюджетов, а также доступность иных сведений о бюджетах по решению законодательных (представительных) органов государственной власти, представительных органов муниципальных образований;
обязательную открытость для общества и средств массовой информации проектов бюджетов, внесенных в законодательные (представительные) органы государственной власти (представительные органы муниципальных образований), процедур рассмотрения и принятия решений по проектам бюджетов, в том числе по вопросам, вызывающим разногласия либо внутри законодательного (представительного) органа государственной власти (представительного органа муниципального образования), либо между законодательным (представительным) органом государственной власти (представительным органом муниципального образования) и исполнительным органом государственной власти (местной администрацией);
обеспечение доступа к информации, размещенной в информационно-телекоммуникационной сети «Интернет» на едином портале бюджетной системы Российской Федерации;
стабильность и (или) преемственность бюджетной классификации Российской Федерации, а также обеспечение сопоставимости показателей бюджета отчетного, текущего и очередного финансового года (очередного финансового года и планового периода).
Секретные статьи могут утверждаться только в составе федерального бюджета.
Принцип открытости-закрытости
Привет, Хабр! Перед вами перевод статьи Роберта Мартина Open-Closed Principle, которую он опубликовал в январе 1996 года. Статья, мягко говоря, не самая свежая. Но в рунете статьи дяди Боба про SOLID пересказывают только в урезанном виде, поэтому я подумал, что полный перевод лишним не будет.
Я решил начать с буквы O, так как принцип открытости-закрытости, по сути, является центральным. Среди прочего тут есть много важных тонкостей, на которые стоит обратить внимание:
Это первая статья в моей колонке Заметки Инженера для The C++ Report. Статьи, публикуемые в этой колонке, будут фокусироваться на использовании C++ и ООП и затрагивать сложности в разработке ПО. Я постараюсь сделать так, чтобы материалы были прагматичны и полезны для практикующих инженеров. Для документации объектно-ориентированного дизайна в этих статьях я буду использовать нотацию Буча.
С объектно-ориентированным программированием связано много эвристик. Например, «все переменные-члены (member variables) должны быть закрытыми (private)», или «следует избегать глобальных переменных», или «определение типов во время исполнения опасно». В чем причина таких эвристик? Почему они правдивы? Всегда ли они правдивы? В этой колонке исследуется принцип проектирования, лежащий в основе этих эвристик, — принцип открытости-закрытости.
Ивар Якобсон сказал: «Все системы изменяются в процессе жизненного цикла. Это нужно иметь в виду при проектировании системы, у которой ожидается больше одной версии». Как же мы можем спроектировать систему, чтобы она была устойчива перед лицом изменений и у которой ожидается больше чем одна версия? Бертран Мейер рассказал нам об этом еще в далеком 1988 году, когда сформулирован знаменитый ныне принцип открытости-закрытости:
Програмные сущности (классы, модули, функции и т.д.) должны быть открыты для расширения и закрыты для изменений.
Если одно изменение в программе влечет за собой каскад изменений в зависимых модулях, то в программе проявляются нежелательные признаки «плохого» дизайна.
Программа становится хрупкой, негибкой, непредсказуемой и непереиспользуемой. Принцип открытости-закрытости решает эти проблемы очень прямолинейным путем. Он говорит, что необходимо проектировать модули, которые никогда не меняются. Когда требования меняются, нужно расширять поведение таких модулей путем добавления нового кода, а не изменением старого, уже работающего кода.
Описание
Модули, отвечающие принципу открытости-закрытости, имеют два главных признака:
Кажется, что два этих признака друг с другом не вяжутся. Стандартный способ расширить поведение модуля — внести в него изменения. Модуль, который не может быть изменен, обычно мыслится как модуль с фиксированным поведением. Как же могут быть выполнены эти два противоположных условия?
Ключ к решению — абстракция
В С++, используя принципы объектно-ориентированного проектирования, возможно создать фиксированные абстракции, которые могут представлять неограниченный набор возможных поведений.
Абстракции — это абстрактные базовые классы, а неограниченный набор возможных поведений представлен всеми возможными классами-наследниками. Модуль может манипулировать абстракцией. Такой модуль закрыт для изменений, так как он зависит от фиксированной абстракции. Также поведение модуля может быть расширено созданием новых наследников абстракции.
Закрытый клиент
Открытый клиент
Абстракция Shape
Рассмотрим приложение, которое должно рисовать круги и квадраты в стандартном GUI. Круги и квадраты должны быть нарисованы в определенном порядке. В соответствующем порядке будет составлен список кругов и квадратов, программа должна пройтись в этом порядке по списку и нарисовать каждый круг или квадрат.
На C, используя техники процедурного программирования, не отвечающие принципу открытости-закрытости, мы могли бы решить эту задачу как показано на листинге 1. Здесь мы видим множество структур данных с одним и тем же первым элементом. Этот элемент — код типа, который идентифицирует структуру данных как круг или квадрат. Функция DrawAllShapes проходит по массиву указателей на эти структуры данных, узнавая код типа и затем вызывая соответствующую функцию ( DrawCircle или DrawSquare ).
Функция DrawAllShapes не отвечает принципу открытости-закрытости, потому что она не может быть «закрыта» от новых типов фигур. Если бы я захотел расширить эту функцию возможностью рисовать фигуры из списка, включающего треугольники, то мне потребовалось бы изменить функцию. Фактически я должен изменять функцию для каждого нового типа фигуры, который мне нужно рисовать.
В реальном мире класс Shape содержал бы много других методов. И все же добавить новую фигуру в приложение все еще очень просто, так как все, что нужно сделать, — это ввести нового наследника и реализовать эти функции. Не нужно рыскать по всему приложению в поисках мест, требующих изменений.
Поэтому программы, отвечающие принципу открытости-закрытости, изменяются путем добавления нового кода, а не изменением уже существующего, в них не происходит каскадных изменений, свойственных программам, которые этому принципу не соответствуют.
Стратегия ввода закрытости
Очевидно, что ни одна программа не может быть на 100% закрыта. Например, что произойдет с функцией DrawAllShapes из листинга 2, если мы решим, что сначала должны быть нарисованы круги, а затем квадраты? Функция DrawAllShapes не закрыта от такого рода изменений. В целом не важно, насколько «закрыт» модуль, всегда есть какой-то тип изменений, от которого он не закрыт.
Так как закрытость не может быть полной, она должна вводиться стратегически. То есть проектировщик должен выбрать типы изменений, от которых программа будет закрыта. Это требует определенного опыта. Опытный разработчик знает пользователей и индустрию достаточно хорошо, чтобы просчитывать вероятность различных изменений. Затем он убеждается, что принцип открытости-закрытости соблюдается для наиболее вероятных изменений.
Использование абстракции для доcтижения дополнительной закрытости
Как мы можем закрыть функцию DrawAllShapes от изменений в порядке рисования? Помним, что закрытие базируется на абстракции. Поэтому, чтобы закрыть DrawAllShapes от упорядочивания, нам нужна некая «абстракция упорядочивания». Частный случай упорядочивания, представленный выше, — это рисование фигур одного типа перед фигурами другого типа.
В C++ эта функция может быть представлена как перегрузка оператора « Shape с методами сортировки.
Использование Data Driven подхода для достижения закрытости
Закрытости наследников класса Shape можно достигнуть, используя табличный подход, который не провоцирует изменения в каждом наследуемом классе. Пример такого подхода приведен в листинге 6.
Применив этот подход, мы успешно закрыли функцию DrawAllShapes от изменений, связанных с упорядочиванием, и каждого наследника класса Shape — от введения нового наследника или от изменения в политике упорядочивания объектов класса Shape в зависимости от их типа (например, такого, что объекты класса Squares должны рисоваться первыми).
Единственный элемент, который не закрыт от изменения порядка рисования фигур, — это таблица. Таблица может быть помещена в отдельный модуль, отделенный от всех остальных модулей, и поэтому ее изменения не затронут другие модули.
Дальнейшее закрытие
Эвристики и конвенции
Как уже было сказано в начале статьи, принцип открытости-закрытости является ключевой мотивацией, которая стоит за многими эвристиками и конвенциями, появившимися за многие годы развития парадигмы ООП. Далее приведены наиболее важные из них.
Делайте все переменные-члены приватными
В ООП мы ожидаем, что методы класса не закрыты от изменений переменных — членов этого класса. Однако мы ожидаем, что любой другой класс, включая подклассы, закрыты от изменений этих переменных. Это называется инкапсуляцией.
Мы знаем, что тип или смысл этой переменной никогда не изменится. Так почему бы не сделать ее public и не дать клиенту прямой доступ к ней? Если переменная действительно никогда не изменится, если все клиенты соблюдают правила и лишь читают из этой переменной, тогда нет ничего страшного в том, что переменная публична. Однако подумайте, что случится, если один из клиентов воспользуется возможностью писать в эту переменную и изменит ее значение.
Никаких глобальных переменных… вообще!
Аргумент против глобальных переменных тот же, что и аргумент против публичных переменных-членов. Ни один модуль, который зависит от глобальной переменной, не может быть закрыт от модуля, который может писать в нее. Любой модуль, который использует эту переменную способом, не предполагаемым другими модулями, сломает эти модули. Это слишком рискованно — иметь множество модулей, зависящих от капризов какого-то одного зловредного модуля.
С другой стороны, в тех случаях, когда глобальные переменные имеют небольшое количество зависимых от них модулей или не могут быть использованы неправильным образом, они не причиняют вреда. Проектировщик должен оценить, сколько закрытости приноситься в жертву и определить, стоит ли того удобство, предоставляемое глобальной переменной.
Тут опять же вступают в игру проблемы стиля. Альтернативы использованию глобальных переменных обычно недороги. В таких случаях использование техники, которая привносит хоть и небольшой, но риск для закрытости вместо техники, которая такой риск полностью исключает, — это признак плохого стиля. Однако иногда использование глобальных переменных по-настоящему удобно. Типичный пример — глобальные переменные cout и cin. В таких случаях, если принцип открытости-закрытости не нарушается, можно пожертвовать стилем ради удобства.
RTTI — это опасно
Разница между ними в том, что в первом случае, приведенном в листинге 9, код нужно менять каждый раз, когда появляется новый наследник класса Shape (не говоря уже о том, что это абсолютно нелепое решение). Однако в листинге 10 в этом случае никаких изменений не требуется. Поэтому код из листинга 10 не нарушает принцип открытости-закрытости.
Правилом большого пальца в данном случае можно считать то, что RTTI можно использовать, если принцип открытости-закрытости не нарушается.
Заключение
Я мог бы еще долго говорить о принципе открытости-закрытости. Во многих отношениях этот принцип является наиболее важным для объектно-ориентированного программирования. Соблюдение именно этого принципа обеспечивает ключевые преимущества объектно-ориентированной технологии, а именно переиспользуемость и поддерживаемость.
При этом важно понимать, что использование объектно-ориентированного языка программирования еще не гарантирует соблюдение принципа открытости-закрытости. Эта ответственность ложится на плечи проектировщика, который должен увидеть, какие части программы, скорее всего, будут со временем изменены, и ввести для них правильные абстракции.
Принципы SOLID: принцип открытости-закрытости
Принцип открытости/закрытости — The Open Closed Principle или OCP — один из пяти основных принципов объектно-ориентированного программирования и проектирования, сформулированных Робертом Мартином.
Принцип декларирует, что программные сущности (классы, модули, функции и т. п.) должны быть открыты для расширения, но закрыты для изменения. Это означает, что эти сущности могут менять свое поведение без изменения их исходного кода.
В этом контексте открытость для расширения — это возможность добавить для класса, модуля или функции новое поведение, если необходимость в этом возникнет, а закрытость для изменений — это запрет на изменение исходного кода программных сущностей. На первый взгляд, это звучит сложно и противоречиво. Но если разобраться, то принцип вполне логичен.
Следование принципу OCP заключается в том, что программное обеспечение изменяется не через изменение существующего кода, а через добавление нового кода. То есть созданный изначально код остаётся «нетронутым» и стабильным, а новая функциональность внедряется либо через наследование реализации, либо через использование абстрактных интерфейсов и полиморфизм.
Принцип открытости/закрытости Мейера основывается на идее, что разработанная изначально реализация класса в дальнейшем не модифицируется (разве что исправляются ошибки), а любые изменения производятся через создание нового класса, который обычно наследуется от изначального. Согласно определению Мейера реализация интерфейса может быть унаследована и переиспользована, но интерфейс может и измениться в новой реализации.
Позже был сформулирован полиморфный принцип открытости/закрытости. Он основывается на строгой реализации интерфейсов и на наследовании от абстрактных базовых классов или на полиморфизме. Созданный изначально интерфейс должен быть закрыт для модификаций, а новые реализации как минимум соответсвуют этому изначальному интерфейсу, но могут поддерживать и другие, более расширенные.
Статья 36 БК РФ. Принцип прозрачности (открытости)
Принцип прозрачности (открытости) означает:
обязательное опубликование в средствах массовой информации утвержденных бюджетов и отчетов об их исполнении, полноту представления информации о ходе исполнения бюджетов, а также доступность иных сведений о бюджетах по решению законодательных (представительных) органов государственной власти, представительных органов муниципальных образований;
обязательную открытость для общества и средств массовой информации проектов бюджетов, внесенных в законодательные (представительные) органы государственной власти (представительные органы муниципальных образований), процедур рассмотрения и принятия решений по проектам бюджетов, в том числе по вопросам, вызывающим разногласия либо внутри законодательного (представительного) органа государственной власти (представительного органа муниципального образования), либо между законодательным (представительным) органом государственной власти (представительным органом муниципального образования) и исполнительным органом государственной власти (местной администрацией);
обеспечение доступа к информации, размещенной в информационно-телекоммуникационной сети «Интернет» на едином портале бюджетной системы Российской Федерации;
стабильность и (или) преемственность бюджетной классификации Российской Федерации, а также обеспечение сопоставимости показателей бюджета отчетного, текущего и очередного финансового года (очередного финансового года и планового периода).
Секретные статьи могут утверждаться только в составе федерального бюджета.
Комментарии к ст. 36 БК РФ
Девятым принципом бюджетной системы Российской Федерации, установленным ст. 36 Бюджетного кодекса Российской Федерации, является принцип прозрачности (открытости), который ранее имел иное название: принцип гласности. Аналогично принципу результативности и эффективности использования бюджетных средств изменение названия данного принципа не привело к изменению его содержания.
Постановление Конституционного Суда РФ от 17.06.2004 N 12-П «По делу о проверке конституционности пункта 2 статьи 155, пунктов 2 и 3 статьи 156 и абзаца двадцать второго статьи 283 Бюджетного кодекса Российской Федерации в связи с запросами Администрации Санкт-Петербурга, Законодательного Собрания Красноярского края, Красноярского краевого суда и Арбитражного суда Республики Хакасия» // РГ. N 134. 25.06.2004.
Принцип прозрачности (открытости) предполагает обязанность одних участников бюджетного процесса предоставлять информацию гражданам и другим участникам бюджетного процесса.
Во-первых, принцип прозрачности (открытости) означает обязательную публикацию в средствах массовой информации утвержденных бюджетов и отчетов об их исполнении. Такая функция данного принципа непосредственно вытекает из ч. 3 ст. 15 Конституции Российской Федерации, согласно которой законы подлежат официальному опубликованию. Неопубликованные законы не применяются. Любые нормативные правовые акты, затрагивающие права, свободы и обязанности человека и гражданина, не могут применяться, если они не опубликованы официально для всеобщего сведения. Бюджеты федерального и регионального уровней в силу ст. 11 Бюджетного кодекса Российской Федерации утверждаются в форме законов, и поскольку любой бюджет затрагивает права, свободы и обязанности человека и гражданина, то, следовательно, на основании вышеуказанной нормы Конституции Российской Федерации должен быть опубликован.
Во-вторых, принцип прозрачности (открытости) означает полноту предоставления информации о ходе исполнения бюджетов. Поскольку исполнение бюджетов осуществляют органы исполнительной власти, а органы законодательной (представительной) власти не участвуют в этом процессе, но осуществляют рассмотрение и утверждение бюджетов, то они должны обладать всей полнотой информации об исполнении бюджетов.
В-третьих, принцип прозрачности (открытости) предусматривает доступность иных сведений о бюджетах. Правом придания гласности другим сведениям о бюджетах обладают законодательные (представительные) органы государственной власти, представительные органы муниципальных образований. Эту норму можно трактовать как предоставление права законодательным (представительным) органам государственной власти, представительным органам муниципальных образований устанавливать своим решением перечень сведений обязательных для предоставления на их рассмотрение, а также как право устанавливать перечень сведений, которые должны быть доступны для всеобщего сведения.
В-четвертых, принцип прозрачности (открытости) устанавливает обязательную открытость для общества и средств массовой информации:
— проектов бюджетов, внесенных в законодательные (представительные) органы государственной власти (представительные органы муниципальных образований), то есть проекты бюджетов должны публиковаться и освещаться в средствах массовой информации;
— процедур рассмотрения и принятия решений по проектам бюджетов, в том числе по вопросам, вызывающим разногласия либо внутри законодательного (представительного) органа государственной власти (представительного органа муниципального образования), либо между законодательным (представительным) органом государственной власти (представительным органом муниципального образования) и исполнительным органом государственной власти (местной администрацией). Такие процедуры должны быть установлены нормативным правовым актом, регулирующим бюджетный процесс на соответствующем уровне бюджетной системы Российской Федерации. В частности, в Бюджетном кодексе Российской Федерации (ч. 8 ст. 145, ч. 4 ст. 205) содержатся соответствующие нормы, касающиеся федерального бюджета, которые предусматривают, что процедуры разногласий определяются Регламентом Государственной Думы.
Составляющей, которая раскрывает понятие принципа прозрачности (открытости), является стабильность и (или) преемственность бюджетной классификации Российской Федерации, а также обеспечение сопоставимости показателей бюджета отчетного, текущего и очередного финансового года (очередного финансового года и планового периода). Такое требование установлено в целях эффективного прохождения бюджетного процесса. Органы государственной власти и местного самоуправления смогут наиболее качественно выполнять свои функции, если бюджетная классификация Российской Федерации, которая лежит в основе всего бюджетного процесса, не будет подвержена постоянным изменениям, что часто происходит на практике. Бюджеты трех лет (отчетного, текущего и очередного) взаимосвязаны между собой, так как в одно и то же время составляется отчет по бюджету предыдущего года, исполняется бюджет текущего года и составляется бюджет следующего года. При этом показатели перечисленных бюджетов должны сопоставляться, что способствует эффективному составлению проекта бюджета будущего года и исполнению бюджета текущего года. Единство, стабильность и преемственность бюджетной классификации Российской Федерации позволяют органам государственной власти и местного самоуправления получать более полную и в доступной форме информацию об исполнении бюджетов.
Прозрачность (открытость) бюджетов ограничивается введением при формировании бюджетов секретных статей бюджета, для которых определен особый (закрытый) порядок составления, рассмотрения и утверждения, при котором сведения об этих статьях не могут быть доступны общественности. Такие статьи чаще всего связаны с обороноспособностью страны, что не должно быть достоянием широких кругов населения. Однако в ст. 36 Бюджетного кодекса Российской Федерации предусмотрено, что секретные статьи могут утверждаться только в составе федерального бюджета. Ни в бюджетах субъектов Российской Федерации, ни тем более в местных бюджетах секретные статьи не могут быть предусмотрены. Это обусловлено тем, что секретные статьи касаются только наиболее значимых общегосударственных вопросов, которые находятся в исключительном ведении Российской Федерации.