Toon posts:

[C++] with .... do constructie

Pagina: 1
Acties:

Verwijderd

Topicstarter
Delphi kent een with ... do constructie, zie het onderstaande voorbeeld.

with OrderDate do
if Month = 12 then
begin
Month := 1;
Year := Year + 1;
end
else
Month := Month + 1;


Dit is hetzelfde als:

if OrderDate.Month = 12 then

begin
OrderDate.Month := 1;
OrderDate.Year := OrderDate.Year + 1;
end
else
OrderDate.Month := OrderDate.Month + 1;


Kent C++ ook een dergelijke constructie? Want als ik with ... do letterlijk overneem in C++ werkt dit namelijk niet.

  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
Kent C++ ook een dergelijke constructie?
nee :)

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:04
Neen.
'k Vind dat trouwens geen mooie constructie en ik gebruik ze nauwelijks (nooit eigenlijk). Ik vind dat die constructie nogal tot wat verwarring kan leiden.
(Alhoewel dat die constructie wel een performance-winst opleverd).

https://fgheysels.github.io/


  • Reefer
  • Registratie: Mei 2000
  • Laatst online: 21-02-2025

Reefer

madness

lijkt mij op een switch?

A Breakbeat A Day Keeps Religion Away.


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:04



Neen, een switch is een 'selectie-statement'.
Een With-Do is heel iets anders.
bv:
code:
1
2
3
4
With Button1 do begin
  Text      := 'OK';
  OnClick := UpdateData;
end;

https://fgheysels.github.io/


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
Ja :) een class. In de functies van class COrderDate hoef je geen OrderDate.Month te gebruiken, als Month een data member van COrderDate is.
Dus
code:
1
2
3
4
5
6
7
8
9
10
COrderDate::telaat( )
{
  if (m_Month == 12 )
  {
    m_Month = 1;
    ++m_Year;
  }
  else
    ++m_Month;
}

member m_Month hoef je dus niet te prefixen; als je OrderData.telaat() aanroept weet de compiler dat functie telaat() OrderData.m_Month gebruikt.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:04
MSalters schreef op 02 september 2002 @ 14:24:
Ja :) een class. In de functies van class COrderDate hoef je geen OrderDate.Month te gebruiken, als Month een data member van COrderDate is.
Dus
code:
1
2
3
4
5
6
7
8
9
10
COrderDate::telaat( )
{
  if (m_Month == 12 )
  {
    m_Month = 1;
    ++m_Year;
  }
  else
    ++m_Month;
}

member m_Month hoef je dus niet te prefixen; als je OrderData.telaat() aanroept weet de compiler dat functie telaat() OrderData.m_Month gebruikt.


Hmmmz... Dit is toch nog iets anders hoor... (Of ik interpreteer jouw reply verkeerd).
Met dat With/Do statement, kun je buiten de class de members van die class aanspreken zonder ze te prefixen.

Dus:
code:
1
2
3
With OrderData do begin
  teLaat()
end;

https://fgheysels.github.io/


  • johnwoo
  • Registratie: Oktober 1999
  • Laatst online: 21:46

johnwoo

3S-GTE

Visual Basic heeft ook een dergelijke constructie: With <object> ... End With
Deze is makkelijk bij het veelvuldig gebruik van het object (het scheelt typwerk), en levert inderdaad performance winst op: de member operator hoeft niet telkens gebruikt te worden (om deze reden is het in VB bijvoorbeeld ook goed om default properties te gebruiken, dus txtBlaat ipv txtBlaat.Text).

C++ beschikt dus niet over een dergelijke constructie... Als je meervoudige member operators in geneste structuren gebruikt kan je wel enigszins optimizen door alles behalve de laatste eenmalig uit te voeren en in een tijdelijke variabele te stoppen (scheelt alleen wanneer je veel members uit dezelfde struct gebruikt).

4200Wp ZO + 840Wp ZW + 1680Wp NW | 14xIQ7+ + 1xDS3-L | MTVenusE | HWP1


Verwijderd

(om deze reden is het in VB bijvoorbeeld ook goed om default properties te gebruiken, dus txtBlaat ipv txtBlaat.Text).
Neen. Juist niet. Hoe verder je je statements uitschrijft hoe beter. Als je de default properties gebruikt gaat het systeem bij elke aanroep kijken wat de default property is en daarna die waarde terug geven. Als je een statement helemaal uitschrijft vermijd je die lookup.

code:
1
Debug.Print oText.Text


is dus sneller dan:

code:
1
Debug.Print oText


Alhoewel het ongeveer 0.1 seconde op 200.000 calls scheelt. Maar toch.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 02:09
Volgens mij hoeft er geen enkel prestatieverschil te zijn. De compiler zou zelf best kunnen afleiden dat wanneer meerdere keren de leden van eenzelfde structure/object aangesproken worden, het adres daarvan elke keer hetzelfde is. Ik weet niet in hoeverre dat gebeurt bij complexere expressies (a.b.c.d = x; bijvoorbeeld) maar zeker in het (simpele) geval van "object.methode()" of "object.attribuut = x" is er geen sprake van overhead. Uiteindelijk zijn ook de complexere expressies hier wel naar terug te leiden (met gebruikmaking van pointers), dus een gebrek is het niet.

Misschien kan iemand een voorbeeld stukje met gecompileerde code aanvoeren om het argument van performancewinst kracht bij te zetten?

Ik vond het in Pascal trouwens wel een handige constructie; maakt de code er vaak beknopter en duidelijker op.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
whoami schreef op 02 september 2002 @ 14:29:

[...]


Hmmmz... Dit is toch nog iets anders hoor... (Of ik interpreteer jouw reply verkeerd).
Met dat With/Do statement, kun je buiten de class de members van die class aanspreken zonder ze te prefixen.
Heiden! Op de brandstapel! })
Members van m'n class molesteren buiten die class, hoe durf je ?:)

De with...do constructie wordt typisch gebruikt om een aantal wijzigingen in een class in een operatie uit te veoern. Blijkbaar is er dus een samenhang tussen die members. Die samenhang is in OO-development een zaak van de class implementatie, en moet dus binnen die class gehouden worden. Vanuit een OO-oogpunt is het dus goed dat de do...with constructie niet bestaat.
Dus:
code:
1
2
3
With OrderData do begin
  teLaat()
end;
smiley?

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:04
Soultaker schreef op 02 september 2002 @ 16:08:
Volgens mij hoeft er geen enkel prestatieverschil te zijn.

Misschien kan iemand een voorbeeld stukje met gecompileerde code aanvoeren om het argument van performancewinst kracht bij te zetten?

Ik vond het in Pascal trouwens wel een handige constructie; maakt de code er vaak beknopter en duidelijker op.


Uit de Delphi help:
f the interpretation of obj involves indexing arrays or dereferencing pointers, these actions are performed once, before statement is executed. This makes with statements efficient as well as concise.
Dit is natuurlijk nog altijd geen bewijs dat het with-statement performanter is...

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:04
MSalters schreef op 02 september 2002 @ 19:04:
[...]

Heiden! Op de brandstapel! })
Members van m'n class molesteren buiten die class, hoe durf je ?:)

De with...do constructie wordt typisch gebruikt om een aantal wijzigingen in een class in een operatie uit te veoern. Blijkbaar is er dus een samenhang tussen die members. Die samenhang is in OO-development een zaak van de class implementatie, en moet dus binnen die class gehouden worden. Vanuit een OO-oogpunt is het dus goed dat de do...with constructie niet bestaat.

[...]

smiley?

Hoe bedoel je?
* whoami snapt het ff niet.

Het With statement zorgt er toch voor dat je bv ipv
code:
1
2
MijnObject.TeLaat();
MijnObject.NogEensTelaat();

kan schrijven als
code:
1
2
3
4
with MijnObject do begin
  TeLaat();
  NogEensTelaat();
end;


* whoami snapt je punt niet....

https://fgheysels.github.io/


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 02:09
MSalters schreef op 02 september 2002 @ 19:04:
De with...do constructie wordt typisch gebruikt om een aantal wijzigingen in een class in een operatie uit te veoern. Blijkbaar is er dus een samenhang tussen die members. Die samenhang is in OO-development een zaak van de class implementatie, en moet dus binnen die class gehouden worden. Vanuit een OO-oogpunt is het dus goed dat de do...with constructie niet bestaat.
Hier snap ik niets van. Het is slechts een duidelijke korte schrijfwijze. Als ik bijvoorbeeld een bepaalde operatie wil uitvoeren, maakt het toch niet uit of ik:
code:
1
2
3
4
matrix.getRow(2).multiply(3);
matrix.getRow(2).subtract(v);
matrix.getRow(2).divide(matrix.getRow(2).length);
};


schrijf, of:
code:
1
2
3
4
5
with (matrix.getRow(2)) {
   multiply(3);
   subtract(v);
   divide(length);   
};

Het is slechts een notatieverschil. Het tweede is duidelijk compacter en niet minder helder. Er wordt geen encapsulatie gebroken (in feite wordt in beide gevallen precies hetzelfde uitgedrukt) of anderszins tegen OO beginselen in gehandeld.

Waar is het dan "vanuit OO oogpunt goed" dat de with-constructie niet in een taal als C (die toch al geen OO ondersteund, maar dit terzijde) zit?

edit:
Ah, what whoami dus ook al zei. ;)

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
whoami schreef op 02 september 2002 @ 19:59:
* whoami snapt het ff niet.

Het With statement zorgt er toch voor dat je bv ipv
code:
1
2
MijnObject.TeLaat();
MijnObject.NogEensTelaat();

kan schrijven als
code:
1
2
3
4
with MijnObject do begin
  TeLaat();
  NogEensTelaat();
end;
Ja, in deze vorm (methods aanroepen ipv data members veranderen) is do...with onschuldiger. Het punt is dat de with...do suggereert dat de instructries bij elkaar horen. Dat suggereert weer dat die groepering in een class hoort, mogelijk zelfs de MijnObject class.
Mijn punt was dus dat with...do z'n origine heeft in niet-OO talen en dat OO-talen een alternatief hebben (this-> weglaten in class methods)

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:04
:?
In m'n voorbeeld is MijnObject een instance van een class (stel de TMijnObject class).
Ik wil de memberfuncties TeLaat en NogEensTelaat aanroepen, maar ipv de gebruikelijke notatie
code:
1
2
MijObject.Telaat();
MijnObject.NogEensTeLaat();

te gebruiken, gebruik ik het with-statement.
With Do suggereert toch helemaal niet dat de instructies bij elkaar horen?

Stel bijvoorbeeld volgende Delphi code:
code:
1
2
3
4
5
6
with Button1 do begin
  Caption      := 'Ok';
  Left            := 15;
  Top            := 20;
  Width        := 75;
end;

Hier ga je een aantal properties van die Button initialiseren.
Ik zie totaal het probleem niet (uit OO standpunt) als je dat nu zo schrijft of zo:
code:
1
2
3
Button1.Text := 'Ok';
Button1.Top  := 15;
...

https://fgheysels.github.io/


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
whoami schreef op 03 september 2002 @ 09:15:
:?
Stel bijvoorbeeld volgende Delphi code:
code:
1
2
3
4
5
6
with Button1 do begin
  Caption      := 'Ok';
  Left            := 15;
  Top            := 20;
  Width        := 75;
end;

Hier ga je een aantalproperties van die Button initialiseren.
Ik zie totaal het probleem niet (uit OO standpunt) als je dat nu zo schrijft of zo:
code:
1
2
3
Button1.Text := 'Ok';
Button1.Top  := 15;
...
Het OO-equivalent daarvan in C++ is toch ook niet lang:
code:
1
2
3
4
5
6
OK_Button::OK_Button( ) :
    text( "Ok" ),
    top( 15 ),
    ...
{
}

Daarvoor heb je ook geen herhaling van de objectnaam. Wat jij laat zien is typische code van een niet-OO taal. C++ heeft equivalente schrijfwijzes binnen een class. Die zijn idd niet zo breed bruikbaar als with..do

De reden dat je dit soort code bij elkaar moet houden is vanwege de samenhang tussen al die properties. Een button met text "Cancel" moet breder zijn dan een button met text "Ok". vanuit een OO-standpunt moet je die twee dingen dus samen in een Button member wijzigen.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:04
Hmmm.... Daarmee ga ik niet akkoord. Dat C++ equivalent is geen equivalent van de With/Do constructie imho, want daar doe je het binnen de class.

Met de With Do constructie roep je properties en memberfuncties aan buiten de class zelf.
M'n voorbeeld was misschien niet zo'n goed voorbeeld en je kunt idd properties enzo gaan initialiseren inde constructor (zoals het eigenlijk hoort).

Dat een button met de text cancel breder moet zijn dan een button met de text ok is een kwestie van smaak. Ik zie ze liever alletwee even breed. ;)


Als jij een object hebt, waarvan je een aantal member-functies wilt aanroepen, dan doe je dat in C++ door iedere keer de objectnaam te schrijven, de '. operator' te gebruiken en de functienaam te schrijven.
In Delphi doe je dat ook zo, maar daar kun je gebruik maken van die With do. (Merk op dat je in die With/do constructie ook nog andere statements kunt gebruiken die niets met het object te maken hebben dat je specifieert in 'With'.

https://fgheysels.github.io/


Verwijderd

Het grootste argument tegen with ... do is het breken van de (global) namespace. Deze construct gebruiken is vergelijkbaar met using namespace std; of iets dergelijks in je code zetten. Alle argumenten die gelden tegen het gebruik van "using namespace ...", gelden ook als argumenten tegen het gebruik van "with ... do".

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:04
Verwijderd schreef op 03 september 2002 @ 12:44:
Het grootste argument tegen with ... do is het breken van de (global) namespace. Deze construct gebruiken is vergelijkbaar met using namespace std; of iets dergelijks in je code zetten. Alle argumenten die gelden tegen het gebruik van "using namespace ...", gelden ook als argumenten tegen het gebruik van "with ... do".


Idd, en daarom gebruik ik hem dan ook niet. (Zoals ik al eerder aangaf).

https://fgheysels.github.io/


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 02:09
Verwijderd schreef op 03 september 2002 @ 12:44:
Het grootste argument tegen with ... do is het breken van de (global) namespace. Deze construct gebruiken is vergelijkbaar met using namespace std; of iets dergelijks in je code zetten. Alle argumenten die gelden tegen het gebruik van "using namespace ...", gelden ook als argumenten tegen het gebruik van "with ... do".
Met het verschil dat with-constructies duidelijk gedefinieerd zijn (er ontstaat een nieuw code blok) waar "using namespace" overal in het bestand kan voorkomen (waardoor onduidelijk is op welk punt welke namespace in gebruik is). Daarbij zijn with-constructies doorgaans kort (een paar regels tot hooguit een scherm vol, weet ik uit mijn Pascal-verleden) waardoor de scope echt maar tijdelijk verplaatst wordt en op een veel minder ingrijpende manier dan met "using namespace" het geval is.

Mij lijkt de with-constructie vooral handig in combinatie met expressies die ik niet elke keer opnieuw wil evalueren, maar waarvoor ik ook geen tijdelijke variabele wil instantieren. Het is dan een alternatief voor:
code:
1
2
3
4
  Color color = getCurrentWindow()->getBackGroundColor();
  color->setRed = 123;
  color->setBlue = 45;
  color->setGreen = 67;


Naar mijn idee is de variant met with-.... dan wel erg duidelijk. Een fundamentele feature wordvoegt 't echter niet toe.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
Nog een puntje; in C++ kun je method calls best chainen:
code:
1
2
3
cout << "Hello"
        << ", world"
        << std::endl;

of
code:
1
2
3
MijnObject
  .Telaat()
  .NogEensTeLaat();

Gewoon *this returnen (by reference).

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:04
MSalters schreef op 03 september 2002 @ 15:49:
Nog een puntje; in C++ kun je method calls best chainen:
code:
1
2
3
cout << "Hello"
        << ", world"
        << std::endl;

of
code:
1
2
3
MijnObject
  .Telaat()
  .NogEensTeLaat();

Gewoon *this returnen (by reference).


In jouw eerste geval (cout) is '<<' toch een operator en geen method?

https://fgheysels.github.io/


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Een operator overload is per definitie een method.

Ter verduidelijking:
code:
1
2
3
4
5
6
const cout& cout::operator << (const char* p_String)
{
...

return *this;
}

[ Voor 0% gewijzigd door curry684 op 03-09-2002 16:54 . Reden: Verduidelijking ]

Professionele website nodig?


Verwijderd

:?

Ik definieer io-ops zo:
code:
1
2
std::ostream& operator << (std::ostream&, const MyClass&);
std::istream& operator >> (std::istream&, MyClass&);

En dan is het zeker geen method. Als het wel methods waren zou dat betekenen dat classes "open" zijn, maw. dat je later cq. op een andere plek in je code nog methods (en data-members) aan een class definition kunt toevoegen. Dat breekt natuurlijkt met de hele ontwerpfilosofie van C++.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Nu is het mijn beurt om :? te roepen, want je laat nu 2 method-signatures zien en beweert dat dat geen methods zijn..... het enige verschil is dat jij 'm buiten de class globaal definieert (gatver imho :) ) maar dat maakt het niet minder een method...

Of is in jouw woordenboek een method per definitie een class-method?

Professionele website nodig?


Verwijderd

curry684 schreef op 04 september 2002 @ 12:05:
Nu is het mijn beurt om :? te roepen, want je laat nu 2 method-signatures zien en beweert dat dat geen methods zijn..... het enige verschil is dat jij 'm buiten de class globaal definieert (gatver imho :) ) maar dat maakt het niet minder een method...
Methods zijn voor mij nooit global, ze staan altijd in de namespace van de class waartoe ze behoren. Het verschil met jouw definitie is dat jij:
a) Een class/object definition probeert uit te breiden met een method (en dat kan niet).
b) Een method probeert toe te kennen aan een object (cout) en niet aan een class (kan ook niet).

Maw. jouw operator geeft een boel errors, maar doet zeker niet wat jij wilt.
Of is in jouw woordenboek een method per definitie een class-method?
Ja. Methods zijn functies die gerelateerd zijn aan een bepaald object of beter klasse van objecten.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Verwijderd schreef op 04 september 2002 @ 14:24:
Methods zijn voor mij nooit global, ze staan altijd in de namespace van de class waartoe ze behoren. Het verschil met jouw definitie is dat jij:
a) Een class/object definition probeert uit te breiden met een method (en dat kan niet).
b) Een method probeert toe te kennen aan een object (cout) en niet aan een class (kan ook niet).
Maw. jouw operator geeft een boel errors, maar doet zeker niet wat jij wilt.
Oh DAAR had je het over... sinds wanneer gaan we mierenneuken over voorbeelden ter verduidelijking? :'( Ik klopte gewoon iets in dat het verhaal over operator overloads verduidelijkte voor whoami, maar ik zal de volgende keer weer 'MyClass' intypen ipv 'cout'... O-)
Ja. Methods zijn functies die gerelateerd zijn aan een bepaald object of beter klasse van objecten.
En da is dus nie zo, zelfs Microsoft in deel 1 van cursus C# heeft het nog over 'global methods' als tegenhanger van class methods. Of hier in een recente .NET cursus van DNJ online de volgende passage:
"Every executable must have an entry point. In C++ this is either main() or WinMain(). The .NET Framework does allow you to have global methods, but of all the .NET languages only Managed C++ allows you to declare global methods. The other languages only allow methods to be declared as part of a class. You access a global method from outside of the assembly where it is defined by using an instance of the Module class for the module in which it is defined. When the compiler sees a main() or WinMain() method in your code it generates code to initialise the CRT and makes the method the entry point for the assembly."
Meer voorbeelden zijn er genoeg te vinden overigens.

Professionele website nodig?


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

In C++ heten het trouwens gewoon functions, en member functions. "method" is een java-isme hehe ;)

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Zoijar schreef op 04 september 2002 @ 15:57:
In C++ heten het trouwens gewoon functions, en member functions. "method" is een java-isme hehe ;)
:P

Professionele website nodig?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21:01

.oisyn

Moderator Devschuur®

Demotivational Speaker

Zoijar schreef op 04 september 2002 @ 15:57:
In C++ heten het trouwens gewoon functions, en member functions. "method" is een java-isme hehe ;)


onzin, methode is een OO term (nou ja eigenlijk meer een design term -> UML), net als attribuut, wat een membervar is

ikzelf noem het trouwens ook functions en memberfunctions :P

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Ja weet ik toch :) Vond het alleen een leuk woord; en het valt me op dat voornamelijk de Java mensen over methoden spreken.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21:01

.oisyn

Moderator Devschuur®

Demotivational Speaker

ja idd... :)

oh, en dan is er ook nog de term 'procedure' :P

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Dit lijkt W&L wel, het draait uit op definitiekwesties :)

Mijn definitie is trouwens best wel verdedigbaar, want in zuiver OO-design bestaat er niet zoiets als een "global method"; zuivere OO kent geen globals.

Daarom is in een pure OO-taal zelfs de main() niet global, iets wat leuk naar voren komt in de quote van curry684. (You shot yourself in the foot there ;))

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21:01

.oisyn

Moderator Devschuur®

Demotivational Speaker

de global namespace kun je in principe ook gewoon zien als een singleton zonder naam, dus waarom zou het niet passen in zuivere OO ?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

In zuivere OO hanteer je alleen objecten, en zijn alle objecten instances van eoa. class. Een namespace is per definitie geen class en is ook niet op een zelfde manier adresseerbaar; je kunt geen instance van een namespace creeeren.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21:01

.oisyn

Moderator Devschuur®

Demotivational Speaker

vandaar dat ik ook zei 'singleton'

of is dat volgens jou ook geen OO concept?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
.oisyn: de global namespace kun je in principe ook gewoon zien als een singleton zonder naam
:D :D Wat een fantatische, amusante en formele benadering! _/-\o_

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21:01

.oisyn

Moderator Devschuur®

Demotivational Speaker

ja ik vond m wel creatief :)

maar even serieus, niet dan?
Of je 'm nou benaderd met of zonder naam boeit eigenlijk niet zoveel... dat is alleen een syntactisch iets

en stel ik heb dit stukje code:
C++:
1
2
3
4
5
6
7
8
namespace Printer
{
    int status;

    void print (const char *);
    void println (const char *);
    void lineFeed ();
}


(even niet letten op wat ik code, het gaat om het principe ;))

En vergelijk dit met een singleton met de naam Printer. Wat is dan het wezenlijke verschil?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

.oisyn schreef op 04 september 2002 @ 20:42:
maar even serieus, niet dan?
Of je 'm nou benaderd met of zonder naam boeit eigenlijk niet zoveel... dat is alleen een syntactisch iets
Ok, ff serieus :) Een singleton is een design-pattern, classes en objects zijn de fundamentele bouwstenen van OO; maw. je bouwt een singleton door te zorgen dat er maar een object van een bepaalde class geinstantieerd kan worden.
En vergelijk dit met een singleton met de naam Printer. Wat is dan het wezenlijke verschil?
Stel dat Printer een echte singleton is:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
class SingletonPrinter {
public:
    static int status;
    static device_t device;
    static void print(const char *);
};

extern SingletonPrinter Printer;

...

typeof(Printer) p;
p.print("Je kunt een alias van een singleton maken, maar niet van een namespace");

Er bestaat dus wel degelijk semantisch verschil tussen een singleton en een namespace: een singleton heeft als object een type, een namespace niet. (Maar dat zei ik al met andere woorden.)

[ Voor 0% gewijzigd door Verwijderd op 05-09-2002 01:03 . Reden: code verduidelijkt ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21:01

.oisyn

Moderator Devschuur®

Demotivational Speaker

Wat is het verschil tussen een class met alleen statische functies/variabelen en een namespace? Je kunt geen van beiden instantieren. En een class is ook een namespace

(en je kunt van namespaces wel aliases maken ;))

de definitie van een singleton is a set containing a single member. De vraag is alleen of je een namespace kunt zien als een set. Een namespace heeft idd geen type... maar moet dat dan per se?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

.oisyn schreef op 05 september 2002 @ 01:03:
Wat is het verschil tussen een class met alleen statische functies/variabelen en een namespace?
Dat zeg ik toch? In zuivere OO is ook een singleton een object, het direct benaderen van statics is not-done. Om een echte singleton te maken moet je die class instantieeren.
en afgezien van het feit dat jouw voorbeeldcode niet werkt (ik neem aan dat het C++ is), kun je van namespaces wel aliases maken
Ik had te vroeg gepost, had de de typeof haakjes vergeten :)

edit:

.oisyn: de definitie van een singleton is a set containing a single member.

Dit is eigenlijk de definitie uit verzamelingenleer. In OO-termen zou je "set" moeten vertalen met "class" en "member" met "object".

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21:01

.oisyn

Moderator Devschuur®

Demotivational Speaker

! major edit alert !
Ik heb mijn vorige post nogal gewijzigd :)

en typeof is overigens een gcc iets volgens mij :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21:01

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op 05 september 2002 @ 01:11:
.oisyn: de definitie van een singleton is a set containing a single member.

Dit is eigenlijk de definitie uit verzamelingenleer. In OO-termen zou je "set" moeten vertalen met "class" en "member" met "object".


mmja daar zat ik dus ook aan te denken toen ik die defnitie tegen kwam... ik ben het eigenlijk wel met je eens :D

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Ik ben blij dat we het in het major edit-slachtveld eens worden :)

typeof is idd. een gnu-extensie, ik wilde het voorbeeld zo mooi mogelijk maken en ging daarom de bonen in denk ik :z

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Wat is het verschil tussen een class met alleen statische functies/variabelen en een namespace? Je kunt geen van beiden instantieren.
Een class met alleen statische functies kun je best instantieren... het is alleen een beetje pointless :)

Professionele website nodig?

Pagina: 1