Если Вы действительно не хотите, чтобы Ваше перечисление появилось в Вашем заголовочном файле И гарантировало, что только используется закрытыми методами, то одно решение может состоять в том, чтобы пойти с pimpl принципом.
Это - техника, которые удостоверяются для сокрытия внутренностей класса в заголовках, просто объявив:
class A
{
public:
...
private:
void* pImpl;
};
Тогда в Вашем файле реализации (cpp), Вы объявляете класс, который будет представлением внутренностей.
class AImpl
{
public:
AImpl(A* pThis): m_pThis(pThis) {}
... all private methods here ...
private:
A* m_pThis;
};
необходимо динамично создать реализацию в конструкторе класса и удалить его в деструкторе и при реализации открытого метода, необходимо использовать:
((AImpl*)pImpl)->PrivateMethod();
существуют профессионалы для использования pimpl, каждый - то, что оно разъединяет Ваш заголовок класса от своей реализации, никакая потребность перекомпилировать другие классы при изменении одной реализации класса. Другой, это, ускоряет Ваше время компиляции, потому что Ваши заголовки так просты.
, Но это - боль для использования, таким образом, необходимо действительно спросить себя, просто объявление Вашего перечисления как частное в заголовке является так очень проблемой.
Возможно, вас заинтересует Ocsigen , веб-фреймворк для OCaml . OCaml - довольно хороший язык для изучения функционального программирования IMO. Он действительно очень функциональный, в отличие от Ruby, Python или любого другого императивного объектно-ориентированного языка, люди будут пытаться продать вас как «способного выполнять функциональное программирование» (под этим они просто подразумевают, что он имеет первоклассные функции).
(Отказ от ответственности: I Сам не очень много использовал Ocsigen, но слышал о нем хорошие отзывы. Это в моем списке дел.)
Вы можете изучить F # в качестве функционального языка и ASP.NET MVC в качестве веб-платформы. Это дает вам доступ к инструментам и библиотекам в .NET framework.
Я сделал свои первые шаги в веб-разработке с помощью ASP.NET MVC, и мне показалось, что это довольно просто начать.
Я не знаю веб-фреймворка, который на 100% функционален с той же мощностью, что и ASP MVC / DotNetNuke / Ruby Rails.
Scala (смешанный объектно-ориентированный и функциональный язык) имеет фреймворк под названием Lift, похожий на Rails.
Это немного нестандартный и не строгий функциональный язык, но вы можете рассмотреть erlang .
Erlang имеет довольно хорошую структуру под названием Erlyweb и его собственный веб-сервер под названием Yaws .
Он мощный и предлагает удивительные возможности для параллелизма, но это очень большой интеллектуальный сдвиг с некоторых других языков.
С Haskell, безусловно, можно использовать CGI для написания веб-приложений. См .:
Хотя с haskell приложения должны быть скомпилированы и развернуты (либо скомпилированы на сервере, либо в среде, аналогичной серверной).
I недавно поигрался с этим ... в целом я почувствовал, что это не намного сложнее, чем использовать нормальный (статистически говоря) язык. Вот пример того, как может выглядеть код (в соответствии с своего рода подходом MVC):
CGI.hs:
module CGITest.CGI where
import Network.CGI
import qualified CGITest.Views as V
import qualified CGITest.Data as D
cgiMain = runCGI (handleErrors (do
rows <- liftIO D.getAllData
output $ V.drawPage $ V.drawTable rows
))
Data.hs:
module CGITest.Data where
import qualified Data.Map as Map
import Database.HDBC
import Database.HDBC.Sqlite3
getAllData :: IO [Map.Map String SqlValue]
getAllData = do
conn <- connectSqlite3 "C:\\Personal\\code\\Code\\Haskell\\CGITest\\test.db"
statement <- prepare conn "SELECT * FROM Test"
execute statement []
rows <- fetchAllRowsMap statement
return rows
Views.hs:
module CGITest.Views where
import qualified Data.Map as Map
import Data.Map ((!))
import Prelude hiding (div, id)
import Text.HTML.Light hiding (head)
import qualified Text.HTML.Light as H
import Text.XML.Light.Types (Content)
import Text.XML.Light
import Text.JSON
import Text.JSON.String
import Database.HDBC
tbody z e = Elem (Element (unqual "tbody") z e Nothing)
thead z e = Elem (Element (unqual "thead") z e Nothing)
drawPage x = renderXHTML xhtml_1_0_transitional $
html [] [
H.head [] [
title [] [cdata "Testing Haskell CGI"]
],
body [] [
div [id "outer-container"] [
div [id "inner-container"] x,
cdata $ show testJ
]
]
]
drawRow columns =
tr [class' "row"] [
td [] [cdata $ fromSql $ columns ! "id"],
td [] [cdata $ fromSql $ columns ! "name"]
]
where
tId = "row-" ++ (fromSql $ columns ! "id")
drawTable rows =
[
table [border "1"] [
thead [] [
tr [] [
th [] [cdata "ID"],
th [] [cdata "Name"]
]
],
tbody [] $ map drawRow rows
]
]
Сервер SML - это плагин для Apache, который позволяет вам писать на стандартном ML, функциональном языке общего назначения .
И в течение долгого времени мне было очень любопытно функциональное программирование, и где-то в глубине души я тайно полагал, что чем выше вы поднимаетесь на уровень абстракции, тем больше у вас возможностей (скрытое предположение : функциональное программирование более абстрактно, чем процедурно.)
Эта «более высокая степень абстракции», вероятно, применима только к коду, который вы сами пишете. Многие фреймворки / инструменты имеют вспомогательные средства, такие как генерация кода для привязки данных пользовательского интерфейса или сопоставлений баз данных. Этот сгенерированный код не будет работать.
Я не знаю веб-фреймворка, который на 100% функционирует с теми же функциями, что и ASP MVC / DotNetNuke / Ruby Rails.
Вам, вероятно, сначала следует потратить некоторое время на разработку в Seaside. Взгляните на учебники, написанные Джеймсом Фостером. Кажется, это самый высокоуровневый веб-фреймворк с сообществом