Dizaina modelis ir veidne, kas atrisina bieži atkārtotu programmatūras izstrādes problēmu.

Stāvokļa modelis ir uzvedības modelis, kas ļauj objektam mainīt savu uzvedību, mainoties tā iekšējam stāvoklim.

Šeit jūs uzzināsit, kā izmantot statusa modeli programmā TypeScript.

Kas ir valsts modelis?

Stāvokļa projektēšanas modelis ir cieši saistīts ar ierobežota stāvokļa mašīnu, kas apraksta programmu, kas pastāv ierobežots stāvokļu skaitu jebkurā brīdī un katrā stāvoklī uzvedas atšķirīgi.

Ir ierobežoti, iepriekš noteikti noteikumi — pārejas —, kas regulē pārējos stāvokļus, uz kuriem var pārslēgties katrs stāvoklis.

Kontekstam tiešsaistes veikalā, ja klienta iepirkšanās pasūtījums ir “piegādāts”, to nevar “atcelt”, jo tas jau ir “piegādāts”. “Piegādāts” un “Atcelts” ir ierobežoti pasūtījuma stāvokļi, un pasūtījums darbosies atšķirīgi atkarībā no tā stāvokļa.

Stāvokļa modelis izveido klasi katram iespējamajam stāvoklim ar stāvoklim raksturīgu uzvedību katrā klasē.

Stāvokļa lietojumprogrammas piemērs

Piemēram, pieņemsim, ka veidojat lietojumprogrammu, kas izseko izdevējsabiedrības raksta stāvokļus. Raksts var būt vai nu apstiprināšanai gaidīts, to ir sagatavojis rakstnieks, rediģējis redaktors vai publicēts. Tie ir publicējamā raksta ierobežotie stāvokļi; katrā unikālajā stāvoklī raksts darbojas atšķirīgi.

Varat vizualizēt dažādus raksta lietojumprogrammas stāvokļus un pārejas, izmantojot tālāk redzamo stāvokļu diagrammu.

Ieviešot šo scenāriju kodā, vispirms ir jādeklarē raksta saskarne:

saskarneRaksta saskarne{
piķis (): nederīgs;
melnraksts (): nederīgs;
rediģēt (): nederīgs;
publicēt(): nederīgs;
}

Šajā saskarnē būs visi iespējamie lietojumprogrammas stāvokļi.

Pēc tam izveidojiet lietojumprogrammu, kas ievieš visas saskarnes metodes:

// Pieteikums
klasēRakstsīstenoRaksta saskarne{
konstruktors() {
šis.showCurrentState();
}

PrivātsparādītCurrentState(): nederīgs{
//...
}

publiskipiķis(): nederīgs{
//...
}

publiskimelnraksts(): nederīgs{
//...
}

publiskirediģēt(): nederīgs{
//...
}

publiskipublicēt(): nederīgs{
//...
}
}

Privātais parādītCurrentState metode ir lietderības metode. Šajā apmācībā tas tiek izmantots, lai parādītu, kas notiek katrā valstī. Tā nav obligāta stāvokļa modeļa daļa.

Stāvokļa pāreju apstrāde

Tālāk jums būs jārīkojas ar stāvokļa pārejām. Stāvokļa pārejas apstrāde jūsu lietojumprogrammu klasē prasīs daudz nosacījuma paziņojumi. Tas izraisītu atkārtotu kodu, kuru ir grūtāk lasīt un uzturēt. Lai atrisinātu šo problēmu, varat deleģēt katra stāvokļa pārejas loģiku savai klasei.

Pirms katras stāvokļa klases rakstīšanas ir jāizveido abstrakta bāzes klase, lai nodrošinātu, ka jebkura nederīgā stāvoklī izsauktā metode rada kļūdu.

Piemēram:

abstraktsklasēRakstsValstsīstenoRaksta saskarne{
pitch(): ArticleState {
mestjaunsKļūda("Nederīga darbība: nevar veikt uzdevumu iekšā pašreizējais stāvoklis");
}

draft(): ArticleState {
mestjaunsKļūda("Nederīga darbība: nevar veikt uzdevumu iekšā pašreizējais stāvoklis");
}

edit(): ArticleState {
mestjaunsKļūda("Nederīga darbība: nevar veikt uzdevumu iekšā pašreizējais stāvoklis");
}

publicēt(): ArticleState {
mestjaunsKļūda("Nederīga darbība: nevar veikt uzdevumu iekšā pašreizējais stāvoklis");
}
}

Iepriekš minētajā bāzes klasē katra metode rada kļūdu. Tagad jums ir jāignorē katra metode, izveidojot noteiktas klases, kas pagarina katra štata bāzes klase. Katra konkrētā klase satur stāvoklim specifisku loģiku.

Katrai lietojumprogrammai ir dīkstāves stāvoklis, kas inicializē lietojumprogrammu. Šīs lietojumprogrammas dīkstāves stāvoklis iestatīs lietojumprogrammu uz melnraksts Valsts.

Piemēram:

klasēGaida melnraksta statusupagarinaRakstsValsts{
pitch(): ArticleState {
atgrieztiesjauns DraftState();
}
}

The piķis metode iepriekš minētajā klasē inicializē lietojumprogrammu, iestatot pašreizējo stāvokli uz DraftState.

Pēc tam ignorējiet pārējās metodes, piemēram:

klasēDraftStatepagarinaRakstsValsts{
draft(): ArticleState {
atgrieztiesjauns RediģēšanasState();
}
}

Šis kods ignorē melnraksts metodi un atgriež instanci Rediģēšanas stāvoklis.

klasēRediģēšanas stāvoklispagarinaRakstsValsts{
edit(): ArticleState {
atgrieztiesjauns PublishedState();
}
}

Iepriekš minētais koda bloks ignorē rediģēt metodi un atgriež gadījumu Publicēšanas valsts.

klasēPublicēšanas valstspagarinaRakstsValsts{
publicēt(): ArticleState {
atgrieztiesjauns PendingDraftState();
}
}

Iepriekš minētais koda bloks ignorē publicēt metodi un nodod lietojumprogrammu atpakaļ dīkstāves stāvoklī, Gaida melnraksta statusu.

Pēc tam jums ir jāļauj lietojumprogrammai mainīt savu stāvokli iekšēji, atsaucoties uz pašreizējo stāvokli, izmantojot privātu mainīgo. To var izdarīt, inicializējot dīkstāves stāvokli savā lietojumprogrammas klasē un saglabājot vērtību privātā mainīgā:

Privāts stāvoklis: ArticleState = jauns PendingDraftState();

Pēc tam atjauniniet parādītCurrentState pašreizējā stāvokļa vērtības drukāšanas metode:

PrivātsparādītCurrentState(): nederīgs{
konsole.log(šis.Valsts);
}

The parādītCurrentState metode konsolē reģistrē lietojumprogrammas pašreizējo stāvokli.

Visbeidzot, atkārtoti piešķiriet privāto mainīgo pašreizējā stāvokļa instancei katrā no lietojumprogrammas metodēm.

Piemēram, atjauniniet savas lietojumprogrammas piķis metode tālāk norādītajam koda blokam:

publiskipiķis(): nederīgs{
šis.state = šis.state.pitch();
šis.showCurrentState();
}

Iepriekš esošajā koda blokā piķis metode maina stāvokli no pašreizējā stāvokļa uz toņa stāvokli.

Tāpat visas pārējās metodes mainīs stāvokli no pašreizējā lietojumprogrammas stāvokļa uz to attiecīgajiem stāvokļiem.

Atjauniniet savas pieteikšanās metodes uz tālāk norādītajiem kodu blokiem.

The melnraksts metode:

publiskimelnraksts(): nederīgs{
šis.state = šis.state.draft();
šis.showCurrentState();
}

The rediģēt metode:

publiskirediģēt(): nederīgs{
šis.state = šis.state.edit();
šis.showCurrentState();
}

Un publicēt metode:

publiskipublicēt(): nederīgs{
šis.state = šis.state.publish();
šis.showCurrentState();
}

Pabeigtās lietojumprogrammas izmantošana

Jūsu pabeigtajai lietojumprogrammas klasei jābūt līdzīgai tālāk norādītajam koda blokam:

// Pieteikums
klasēRakstsīstenoRaksta saskarne{
Privāts stāvoklis: ArticleState = jauns PendingDraftState();

konstruktors() {
šis.showCurrentState();
}

PrivātsparādītCurrentState(): nederīgs{
konsole.log(šis.Valsts);
}

publiskipiķis(): nederīgs{
šis.state = šis.state.pitch();
šis.showCurrentState();
}

publiskimelnraksts(): nederīgs{
šis.state = šis.state.draft();
šis.showCurrentState();
}

publiskirediģēt(): nederīgs{
šis.state = šis.state.edit();
šis.showCurrentState();
}

publiskipublicēt(): nederīgs{
šis.state = šis.state.publish();
šis.showCurrentState();
}
}

Stāvokļa pārejas var pārbaudīt, izsaucot metodes pareizajā secībā. Piemēram:

konst dokumenti = jauns pants (); // Gaida melnraksta statusu: {}

docs.pitch(); // Melnraksta stāvoklis: {}
docs.draft(); // Rediģēšanas stāvoklis: {}
docs.edit(); // Publicēšanas valsts: {}
docs.publish(); // Gaida melnraksta statusu: {}

Iepriekš minētais koda bloks darbojas, jo lietojumprogrammas stāvokļi ir pareizi pārgājuši.

Ja mēģināt mainīt stāvokli tādā veidā, kas nav atļauts, piemēram, no augstuma stāvokļa uz rediģēšanas stāvokli, lietojumprogramma parādīs kļūdu:

konst dokumenti = jauns pants (); // Gaida melnraksta statusu: {}
docs.pitch() // Melnraksta stāvoklis: {}
docs.edit() // Nederīga darbība: nevar izpildīt uzdevumu pašreizējā stāvoklī

Šo modeli vajadzētu izmantot tikai tad, ja:

  • Jūs veidojat objektu, kas darbojas atšķirīgi atkarībā no tā pašreizējā stāvokļa.
  • Objektam ir daudz stāvokļu.
  • Stāvoklim raksturīga uzvedība bieži mainās.

Valsts modeļa priekšrocības un kompromisi

Šis modelis novērš apjomīgus nosacījumu paziņojumus un saglabā vienoto atbildību un atvērto/slēgto principu. Taču tas var būt pārspīlēti, ja lietojumprogrammai ir maz stāvokļu vai tās stāvokļi nav īpaši dinamiski.