global vs context variable
QAston
qaston at gmail.com
Wed Dec 11 01:53:19 PST 2013
On Wednesday, 11 December 2013 at 08:21:33 UTC, luka8088 wrote:
> Hi everyone!
>
> I would like to address the issue of global variables (or
> states). In
> general my opinion is that they are bad solely because they (in
> most
> cases) lack the ability of alternative values (or states) or
> ability to
> alter them in user friendly way.
>
> For example, take write function from std.stdio. For a third
> party
> function that uses write to output to screen user is unable to
> redirect
> that output to, for example, file without altering third party
> function's body. Or if there is a way it rarely user friendly.
> For
> example, in php there are function for buffering output but you
> have to
> manually start buffering and manually stop it. In python active
> output
> is a global variable and you are able to replace it with a
> custom file
> stream but you are responsible maintain a custom stack in case
> of
> recursion and switching it back to default output when no
> longer needed.
> There are also examples of loggers, database connections, etc.
>
> I have a proposal to generalize this issue. Attached is a
> example
> library that implements context based approach and I would like
> to see
> this kind of library in phobos (std.context). It is very simple
> and yet
> in my experience it has shown to be very useful.
>
> Examples using such library:
>
> void writeOutput () {
> writeln("example output");
> }
>
> void main () {
>
> writeOutput();
>
> standardOutputContext(file("example.txt"), {
> writeOutput();
> });
>
> }
>
> MVC example:
>
> void databaseToView () {
> auto result = db.query("select;");
> view.populate(result);
> }
>
> void myAction () {
>
> auto customView = new View();
>
> viewContext(customView, {
> databaseToView();
> });
>
> view.regionA.append(customView);
>
> }
>
> void main () {
>
> dbContext(defaultDbConnection {
> viewContext(defaultView, {
> myAction();
> });
> });
>
> }
>
>
> I would like to add this to phobos and document it but I would
> like to
> know if this is desirable at all and to get a community
> feedback.
>
> Thoughts?
This issue is probably nearly as old as programming itself.
There are several sollutions already developed: dependency
injection (requires complex configuration rules), manually
passing deps as args (cumbersome), service locator or global
variables.
Your sollution as far as I understand it relies on swapping a
global variable when inside a context and restoring it
afterwards. While this would be perfectly fine in environment
where code is executed in OS threads, there will be a problem in
the case of Vibe.d which uses fibers. But I guess the problem is
solvable there aswell.
Just to note - you have to bind to globals at some point - what
if someone wants to swap writeln function whith his own (for
example to call logger, or for whatever reason)? Or he may want
to swap dbContext :).In my practice I make swappable only things
I think I'll need to swap in future.
More information about the Digitalmars-d
mailing list