private
является предпочтительным для данных элемента. По умолчанию членами класса C ++ являются private
.
public
является предпочтительным для функций-членов, хотя это вопрос мнения. По крайней мере, некоторые методы должны быть доступны. public
доступен для всех. Это самый гибкий вариант и наименее безопасный. Любой может использовать их, и кто-то может их неправильно использовать.
private
недоступен вообще. Никто не может использовать их вне класса, и никто не может злоупотреблять ими. Даже в производных классах.
protected
является компромиссом, поскольку он может использоваться в производных классах. Когда вы выходите из класса, вы хорошо понимаете базовый класс и стараетесь не злоупотреблять этими членами.
MFC - это C ++-оболочка для Windows API, она предпочитает public
и protected
. Классы, созданные мастером Visual Studio, имеют уродливое сочетание элементов protected
, public
и private
. Но есть некоторые логики для самих классов MFC.
Членами, такими как SetWindowText
, являются public
, потому что вам часто приходится обращаться к этим членам.
Члены, такие как OnLButtonDown
, обрабатывать уведомления, полученные окном. Они не должны быть доступны, поэтому они protected
. Вы можете получить к ним доступ в производном классе, чтобы переопределить эти функции.
Некоторые члены должны выполнять потоки и контуры сообщений, им не следует обращаться или переопределять, поэтому они объявляются как private
В структурах C ++ члены public
по умолчанию. Структуры обычно используются только для данных, а не для методов, поэтому декларация public
считается безопасной.
Безусловно лучшей веб-платформой Clojure, с которой я все же встретился, является Compojure: http://github.com/weavejester/compojure/tree/master
Это является маленьким, но мощным, и имеет красиво изящный синтаксис. (Это использует Причал под капотом, но это скрывает API Сервлета от Вас, если Вы не хотите его, который часто не будет). Пойдите посмотреть на README в том URL, затем загрузите снимок и начните играть.
Webjure, платформа веб-программирования для Clojure.
Функции: сервлет Отправки вызывает функции Clojure. Поколение Динамического HTML. Интерфейс SQL-запроса (через JDBC).
Этот ответ предназначен как заполнитель для получения информации о Webjure.
Compojure, что я раньше создавал крошечное приложение блоггинга. Это смоделировано на Sinatra, который является минимальной, легкой веб-платформой для Ruby. Я главным образом просто использовал маршрутизацию, которая является точно так же, как Sinatra. Это похоже:
(GET "/post/:id/:slug"
(some-function-that-returns-html :id :slug))
нет никакой библиотеки ORM или шаблонной обработки, но это действительно имеет функции, которые превращают векторы в HTML.
Compojure больше не является полноценным фреймворком для разработки веб-приложений. Начиная с релиза 0.4, compojure был разделен на несколько проектов.
Ring обеспечивает основу, абстрагируясь от процесса HTTP-запроса и ответа. Ring анализирует входящий запрос и генерирует карту, содержащую все части запроса, такие как uri, имя сервера и метод запроса. Затем приложение обрабатывает запрос и на его основе генерирует ответ. Ответ представляется в виде карты, содержащей следующие ключи: status, headers и body. Таким образом, простое приложение будет выглядеть следующим образом:
(def app [req]
(if (= "/home" (:uri req))
{:status 200
:body "<h3>Welcome Home</h3>"}
{:status 200
:body "<a href='/home'>Go Home!</a>"}))
Еще одной частью Ring является концепция промежуточного программного обеспечения. Это код, который располагается между обработчиком и входящим запросом и/или исходящим ответом. Некоторые встроенные промежуточные программы включают сессии и stacktrace. Посредническое ПО сессий добавляет ключ :session в карту запроса, который содержит всю информацию о сессии пользователя, делающего запрос. Если ключ :session присутствует в карте ответа, он будет сохранен для следующего запроса, сделанного текущим пользователем. В то время как промежуточное ПО для трассировки стека будет фиксировать любые исключения, возникающие при обработке запроса, и генерировать трассировку стека, которая будет отправлена обратно в качестве ответа, если возникнут какие-либо исключения.
Работа непосредственно с Ring может быть утомительной, поэтому Compojure построен поверх Ring, абстрагируясь от деталей. Теперь приложение может быть выражено в терминах маршрутизации, поэтому вы можете получить что-то вроде этого:
(defroutes my-routes
(GET "/" [] "<h1>Hello all!</h1>")
(GET "/user/:id" [id] (str "<h1>Hello " id "</h1>")))
Compojure все еще работает с картами запросов/ответов, поэтому вы всегда можете получить к ним доступ при необходимости:
(defroutes my-routes
(GET "*" {uri :uri}
{:staus 200 :body (str "The uri of the current page is: " uri)}))
В данном случае часть {uri :uri} получает доступ к ключу :uri в карте запросов и устанавливает uri в это значение.
Последний компонент - это Hiccup, который облегчает генерацию html. Различные html-теги представлены в виде векторов, первый элемент которых представляет собой имя тега, а остальные - тело тега. "
становится Заголовок
"[:h2 "Заголовок"]
. Атрибуты тега находятся в необязательной карте. "Log In Page"
становится [:a {:href "/login"}"Log In Page"]
. Вот небольшой пример с использованием шаблона для генерации html.
(defn layout [title & body]
(html
[:head [:title title]]
[:body [:h1.header title] body]))
(defn say-hello [name]
(layout "Welcome Page" [:h3 (str "Hello " name)]))
(defn hiccup-routes
(GET "/user/:name" [name] (say-hello name)))
Вот ссылка на черновой вариант документации, которую в настоящее время пишет автор compojure, и которая может оказаться вам полезной: Compojure Doc