Je procesem i produktem plánování, návrhu a konstrukce staveb
nebo jiných struktur.
| Písmeno | Znamená | Koncept |
| S | Single responsibility principle | Třída by měla mít jenom jediný důvod pro změnu (specifikace chování) |
| O | Open/closed principle | Třídy mají být otevřené pro rozšíření, ale uzavřené pro modifikaci |
| L | Liskov substitution principle | Potomek třídy může v implementaci vždy nahradit předka |
| I | Interface segregation principle | Více jednoduchých klientských rozhraní je zpravidla lepší než jedno velké univerzální rozhraní |
| D | Dependency inversion principle | Závislosti na abstrakci nikoli konkrétní implementaci. Také spojováno s Hollywood principle = “Don’t call us, we’ll call you” |
The Law of Demeter = Princip minimální znalosti
Třídy mají komunikovat pouze s blízkými spřátelenými třídami.
"Talk only to your immediate friends"
| Abstract factory | Adapter | Builder |
| Chain of responsibility | Command | Decorator |
| Flyweight | Observer | Proxy |
| Mediator | Memento | Singleton |
| Strategy | State | Template method |
Lékař, architekt a programátor se přou o to, čí povolání je nejstarší. Lékař praví “Eva byla stvořena z žebra Adamova. Byl to první chirurgický výkon. Medicína je tedy nejstarším povoláním.” Architekt se nesouhlasně zamručí. “I kdepak! Bůh musel nejdříve svět navrhnout a za šest dní postavit. Byl tedy první architekt. Předtím byla jenom prázdnota a chaos.” Programátor, který dosud jen poslouchal se zle pousmál “Pánové, odkud si myslíte, že se vzal ten chaos?”
“Sometimes, the elegant implementation is just a function.
Not a method.
Not a class.
Not a framework.
Just a function.”
-- John Carmack @ twitter
Které království byste si vybrali?
OOP. Komponenty. Služby. Třídy s metodami.
Detekce změny stavu = Dirty checking. Změny se aplikují dle šablony do DOMu a na obraz.
RxJS, reaktivní asynchronní streamy. Modelují koncept hodnot v čase pomocí operátorů - podoba s API objektu Array.
Komponenty označujeme dekorátorem @Component, který může obsahovat dodatečná metadata
Metadata říkají Angularu kde se nacházejí bloky, nutné pro spuštění komponenty.
@Component({
selector: 'nice-button',
template: ``,
styles: [...]
})
export class NiceButton {
constructor() {}
// methods
}
<p><i>Vyber superhrdinu ze seznamu</i></p>
<ul>
<li *ngFor="let hero of heroes" (click)="selectHero(hero)">
{{hero.name}}
</li>
</ul>
<hero-detail *ngIf="selectedHero" [hero]="selectedHero"></hero-detail>
{{obj.name}}[member](click)="pickOne(data)"[(banana)]Znovupoužitelná business logika
Služba je obvykle třída s úzce vymezenou zodpovědností
Je označena dekorátorem @Injectable() aby mohla participovat v DP
@Injectable()
export class SuperService {
doTrick() {
return "Trick one";
}
doAnotherTrick(a: number, b: number) {
return Math.max(a, b) / 2;
}
}
@Component({
selector: 'time-picker', template: '',
providers: [TimePickerService]
})
export class TimePicker {
constructor(public service: TimePickerService) { }
// ^^^^^^^^^^^^^^^^^^^^^^^^^^
ngOnInit() { this.service.pick(); }
// ^^^^^^^^^^^^^^^^^^^ použití závislosti
}
@Injectable()
export class TimePickerService {
pick() {...}
}
@Injectable()
export class TimePickerService {
constructor(private conversion: ConversionService) {}
pick() { this.conversion.convert(10); }
}
@Injectable()
export class ConversionService {
constructor() { }
convert(a: number): string { }
}
V kostce... dávají existujícím prvkům nové vlastnosti.
Mění strukturu a složení v závislosti na přidávání, odstraňování nebo změně stavu.
<li *ngFor="let hero of heroes"></li>
<hero-detail *ngIf="selectedHero"></hero-detail>
Mění vzhled nebo chování existujících elementů. V šabloně jsou deklarované jako běžné atributy html prvků a proto nesou toto označení.
Signál
Deaktivovat
Vestavěné direktivy*
Odpovídá přibližně tomuto:
<input
[ngModel]="firstName"
(ngModelChange)="firstName = $event">
Funguje jen pro elementy formulářů.
@NgModule({
imports: [ BrowserModule ],
declarations: [ AppComponent ],
bootstrap: [ AppComponent ],
providers: [ AppService ]
})
export class AppModule {}
Směrování požadavků
const appRoutes: Routes = [
{ path: 'hero/:id', component: HeroDetailComponent },
{ path: 'crisis-center', component: CrisisListComponent },
{ path: 'heroes', component: HeroListComponent,
data: { title: 'Heroes List' }},
{ path: '', component: HomeComponent },
{ path: '**', component: PageNotFoundComponent }
];
@NgModule({
imports: [ RouterModule.forRoot(appRoutes) ]
})
The hero's birthday is {{ birthday | date: "MM/dd/yy" }}
async pipe
Architektura tvorby aplikací populární převážně ve světě Reactjs
function reducer(state, action) { ... return newState; }