Wat is de beste manier om 'diepe' configuratie-opties in te stellen?

Stel dat er een functie is waarvoor een configuratie-instelling als invoer vereist is, maar deze functie wordt verschillende niveaus genoemd diep van de 'hoofd'-functie op het hoogste niveau.

Wat is de beste manier, in termen van de beste programmeermethoden, om deze instelling door te geven aan de functie?

Eén manier is om gewoon een globale variabele te gebruiken en die op de bovenste functie in te stellen en deze in de doelfunctie te lezen, maar ik neem aan dat dat als slechte programmeerpraktijk wordt beschouwd.

Een andere manier is om de instelling als een argument door te geven helemaal vanaf de top, via de verschillende tussenfuncties, helemaal tot aan de laatste doelfunctie. Dit lijkt echter erg vervelend en misschien foutgevoelig.

Zijn er andere benaderingen?

U kunt uw taal naar keuze gebruiken voor uw antwoord, maar Ter info: ik gebruik C/C ++, Perl en Matlab.

0
Waarom weet de functie op het hoogste niveau dat een zeer diep geneste functie die configuratie-opties nodig heeft?
toegevoegd de auteur Xeo, de bron
"Echte systemen hebben geen top" - Bertrand Meyer
toegevoegd de auteur Cheers and hth. - Alf, de bron
R heeft een mooie ... die zonder moeite kan worden doorgegeven.
toegevoegd de auteur John Colby, de bron
@Xeo: stel dat de geneste functie 'generate_signal' is en genereert een ander type signaal, afhankelijk van of dit een GSM- of CDMA-simulatie is. Hoe weet de geneste functie dat dit een GSM- of CDMA-simulatie is? Deze informatie is meestal bekend op het hoogste niveau van de simulatie. Als er betere manieren zijn om hiermee om te gaan, zou het interessant zijn om erover te horen.
toegevoegd de auteur eyio, de bron

4 antwoord

Ik hou van singleton-objecten voor configuratie. Het is een gedeelde bron die maar één instantie mag hebben. Wanneer u een nieuw object probeert te maken, krijgt u de bestaande. U maakt zich geen zorgen over globale variabelen of subroutine- of methodeparameters. Haal gewoon een nieuw configuratieobject en gebruik het zo lang als u het nodig hebt.

Er is een voorbeeld in Gang of Four voor C ++.

3
toegevoegd
Verdomme. Ik raakte afgeleid om de kinderen 15 minuten te voeden en je nam het antwoord weg :)
toegevoegd de auteur DVK, de bron

Laat de procedurele programmeerstijl met diepe oproepstapels achter en het antwoord wordt een banaliteit.

Verander uw programma om te profiteren van moderne object-oriëntatie. Perl-rollen zorgen voor platte hiërarchieën. Een configuratie is dan gewoon een attribuut.

2
toegevoegd
Er zijn waarschijnlijk manieren waarop u altijd globale variabelen kunt hebben, maar er zijn manieren om dezelfde dingen zonder hen ook te bereiken. Ze zijn niet noodzakelijk in vele talen.
toegevoegd de auteur brian d foy, de bron
Welke programmeerstijl u ook gebruikt, zijn er niet altijd enkele parameters op het hoogste niveau die door iedereen moeten worden gebruikt? Laat in mijn voorbeeld van een opmerking hierboven zeggen dat u een simulatie uitvoert voor een GSM- of CDMA-systeem. Alle functies en/of objecten in het systeem moeten worden verteld dat dit een GSM- of een CDMA-simulatie is. Wat is de beste manier om hiermee om te gaan?
toegevoegd de auteur eyio, de bron

Een systeem waarmee ik werk, maakt gebruik van een Publish-Subscribe (Observer Pattern) -implementatie om instellingen/configuratiewijzigingen door te geven aan objecten die deze moeten kennen.

Het object (Subscriber or Observer in de originele Gang of Four-beschrijving ) dat moet zijn op de hoogte gebracht van wijzigingen in instellingen:

  1. Overnemen van abonnee.
  2. Hecht zichzelf (subscribes) aan de Publisher via de Publisher Attach-methode.
  3. Wordt door de uitgever op de hoogte gesteld wanneer er instellingen/configuratiewijzigingen optreden

We gebruiken een variant waarmee abonnees opiniepeilingen kunnen publiceren voor instellingen/configuratiegegevens op aanvraag.

Het patroon Publish-Subscribe gebruiken minimaliseert de koppeling tussen het object dat de instellingen beheert en de objecten die ze nodig hebben.

1
toegevoegd

In matlab heb ik altijd een script allParam.m, waar ik alle parameters instel.

Als een functie een van die parameters nodig heeft, roep ik gewoon het script en het is ingesteld.

0
toegevoegd