SlideShare a Scribd company logo
QUALITY EXCITES 2014
31 MAJA 2014
GRZEGORZ GAŁĘZOWSKI
MOTOROLA SOLUTIONS
GRZEGORZ GAŁĘZOWSKI
MOTOROLA SOLUTIONS
NIE ROZWIĄZUJ W TESTACH
JEDNOSTKOWYCH PROBLEMÓW
Z TESTOWANYM KODEM
BĘDZIE O...
TESTACH JEDNOSTKOWYCH
I PROJEKTOWANIU
ORAZ ICH ZWIĄZKU
NA 5 PRZYKŁADACH
Nie rozwiązuj w testach jednostkowych problemów z testowanym kodem.
TESTY
W MOIM
ŚWIECIE...
Lista TODO
Czy zaimplementowałem wszystko?
Analiza
Czy wiem, co buduję?
Wykonywalna dokumentacja
Czego "klient" może od kodu oczekiwać?
Projektowanie
Jak rozbić problem?
TESTY
JEDNOSTKOWE
DAWNIEJ I DZIŚ
"the tests must be kept to the same level
of high quality as the production code.
(...) Duplication must be eliminated from
them."
Robert C. Martin
ROZWIĄZANIA
NA POZIOMIE
AUTOMATYZACJI
METODY SETUP
[SetUp]
public void SetTheStage()
{
this.valueUsedEverywhere = 12;
}
DZIEDZICZENIE KLAS
[TestFixture] public class
AuthorizationBehaviors : TestBase
METODY POMOCNICZE
message = createMessageFor("Ala");
Nie rozwiązuj w testach jednostkowych problemów z testowanym kodem.
JAKOŚĆ
JEDNOSTKI:
SPÓJNOŚĆ
I POWIĄZANIA
SPÓJNOŚĆ ~ JEDNA RZECZ
A B
C D
A
B
C D
SPÓJNOŚĆ ~ JEDNA RZECZ
A
B
C
D
SPÓJNOŚĆ ~ JEDNA RZECZ
POWIĄZANIA – KOGO KLASA ZNA?
A
B
C
D
MOCKI – "SYMULATORY" OBIEKTÓW
ATEST
SPÓJNOŚĆ
I POWIĄZANIA
A TESTY
TEST JEDNOSTKOWY TO KLIENT KODU
Jednostka
Klient
Test
Test
Test
Test
Test
Test
Test
ŹLE ZAPROJEKTOWANA JEDNOSTKA...
Jednostka
Klient
Test
Test
Test
Test
Test
Test
Test
...JEST TRUDNO TESTOWALNA
Jednostka
Klient
Test
Test
Test
Test
Test
Test
Test
SŁUCHAJ
ŚLEPO
SWOICH
TESTÓW
KORZYŚCI Z ˶SŁUCHANIA TESTÓW˝
Lepszy design produktu
• większa spójność
• mniej powiązań
Lepsza utrzymywalność testów
PIĘĆ
PRZYKŁADÓW
UWAGA! ZŁY KOD!
PRZYKŁAD 1:
NACHODZENIE
ZAKRESU
TESTÓW
validation = new SanityValidation();
info = new PersonInfo();
info.Name = "Zenek";
info.Surname = "Kowalski";
info.Age = VALID_AGE;
Assert.DoesNotThrow(
() => validation.Of(info)
);
validation = new SanityValidation();
info = new PersonInfo();
info.Name = "$";
info.Surname = "Kowalski";
info.Age = VALID_AGE;
Assert.Throws<InvalidValueException>(
() => validation.Of(info)
);
validation = new SanityValidation();
info = new PersonInfo();
info.Name = "Zenek";
info.Surname = "$";
info.Age = VALID_AGE;
Assert.Throws<InvalidValueException>(
() => validation.Of(info)
);
validation = new SanityValidation();
info = new PersonInfo();
info.Name = "Zenek";
info.Surname = "Kowalski";
info.Age = VALID_AGE – 1;
Assert.Throws<InvalidValueException>(
() => validation.Of(info)
);
PÓKI CO...
Name Surname Age
UTRZYMYWALNOŚĆ
Name Surname Age Country
Name Surname Age Country
UTRZYMYWALNOŚĆ
Wskazówka:
Nachodzenie na siebie zakresów testów.
˶NADPISZ JEDNO POLE˝ - OK, ALE...
validation = new SanityValidation();
info = CreateValidPersonInfo();
info.Name = CreateInvalidName();
Assert.Throws<InvalidValueException>(
() => validation.Of(info)
);
˶NADPISZ JEDNO POLE˝ - OK, ALE...
validation = new SanityValidation();
info = CreateValidPersonInfo();
info.Name = CreateInvalidName();
Assert.Throws<InvalidValueException>(
() => validation.Of(info)
);
Wskazówka:
Testy różnych zachowań
padają z tego samego powodu
MAŁA SPÓJNOŚĆ
SanityValidation
Walidacja Surname
Walidacja Age
Testy Surname
Testy Age
Of(x)
Testy Name Walidacja Name
Walidacja Surname
Walidacja Age
ZACHOWANIA SOBIE PRZESZKADZAJĄ
SanityValidation
Walidacja Name
Walidacja Surname
Walidacja Age
Testy Surname
Testy Age
Of(x)
Testy Name
ZACHOWANIA SOBIE PRZESZKADZAJĄ
SanityValidation
Walidacja Surname
Walidacja AgeTesty Age
Of()
Testy Name Walidacja Name
Walidacja Surname
Walidacja Age
Testy Surname
ZACHOWANIA SOBIE PRZESZKADZAJĄ
SanityValidation
Walidacja Surname
Walidacja Age
Testy Surname Of(x)
Testy Name Walidacja Name
Walidacja Surname
Walidacja AgeTesty Age
PODZIAŁ  LEPSZA SPOJNOSĆ
PartialValidations
Walidacja Name
Walidacja Surname
Walidacja Age
SanityValidation
Of(x)
PersonInfo
UWSPÓLNIENIE
SanityValidation PartialValidations
Walidacja Napisu
Walidacja Minimum
Of(x)
PersonInfo
MAMY DANE I FUNKCJĘ
SanityValidation PartialValidations
Walidacja Napisu
Walidacja Minimum
Of(x)
PersonInfo
LEPSZA ABSTRAKCJA
Person
Validate()
PartialValidations
Walidacja Napisu
Walidacja Minimum
PersonInfo
TEST PERSON: UŻYWA WALIDACJI?
Person
Validate()
PersonInfo
Test Validate()
Partial
Validations
Mock
TESTY WALIDACJI NAPISU
PartialValidations
Walidacja Napisu
Walidacja Minimum
Testy Napisu
Testy Minimum
TEST WALIDACJI MINIMUM
Validations
Walidacja MinimumTesty Minimum
Walidacja NapisuTesty Napisu
PRZYKŁAD 2:
KOMBINACJE
FUNKCJONALNOŚCI
var processing = new MessageProcessing();
messageProcessing.Encryption = true;
messageProcessing.Translation = true;
messageProcessing.Compression = true;
processing.For(message);
...
...
var processing = new MessageProcessing();
messageProcessing.Encryption = true;
messageProcessing.Translation = true;
messageProcessing.Compression = true;
processing.For(message);
...
...
Wskazówka:
Eksplozja Kombinacji
[TestCase(true, true, true)]
public void ShouldProcessMessage(
bool encrypt,
bool translate,
bool compress)
{
processing = new MessageProcessing();
processing.Encryption = encrypt;
processing.Translation = translate;
processing.Compression = compress;
//...
[TestCase(true , true , true )]
[TestCase(false, true , true )]
[TestCase(true , false, true )]
[TestCase(true , true , false)]
[TestCase(false, false, true )]
[TestCase(true , false, false)]
[TestCase(false, true , false)]
[TestCase(false, false, false)]
public void ShouldProcessMessage(
bool encrypt,
bool translate,
bool compress)
ZBYT WIELE ODPOWIEDZIALNOŚCI
MessageProcessing
Walidacja Surname
Walidacja Age
For(msg)
Encryption
Translation
Compression
PODZIAŁ NA MNIEJSZE OBIEKTY
MessageProcessing
For(msg)
Encryption
Translation
Compression
WYŁĄCZANIE TRANSFORMACJI
MessageProcessing
For(msg)
NullEncryption
Translation
Compression
TEST PRZETWARZANIA - LEPIEJ, ALE...
MessageProcessing
For(msg)
(1)
(2)
(3)
TEST PRZETWARZANIA - LEPIEJ, ALE...
MessageProcessing
For(msg)
Wskazówka:
Dużo różnych mocków na test
WSPÓLNY MIANOWNIK...
MessageProcessing
Encryption
Translation
Compression
For(msg)
PODZIAŁ OBIEKTÓW
MessageProcessing
For(m)
EncryptionTranslation Compression
TransformationTransformationTransformation
TEST PRZETWARZANIA – JESZCZE RAZ
MessageProcessing
For(m)
PRZYKŁAD 3:
ŁAŃCUCHY
ZALEŻNOŚCI
MOCKI - LEGENDA
Utworzenie:
mock = Substitute.For<Interface>()
Zaprogramowanie rezultatu wywołanie metody:
mock.GetSomething().Returns(something);
system = Substitute.For<System>();
radio = Substitute.For<Radio>();
owner = Substitute.For<User>();
system.GetRadio(1).Returns(radio);
radio.GetOwner().Returns(owner);
owner.GetName().Returns(name);
ZESTAWIANIE ŁAŃCUCHA MOCKÓW
Test
Name
WSZYSTKO WIDOCZNE PUBLICZNIE
System
Radio
Owner
Name
Klient
PROBLEM Z ZALEŻNOŚCIAMI
System
Radio
Owner
Name
Klient
PROBLEM Z ZALEŻNOŚCIAMI
System
Radio
Owner
Name
Klient
Wskazówka:
mocki zwracające mocki
NAJPROSTSZE ROZWIĄZANIE
System
Radio
Owner
RadioOwnerName
Klient
ŁATWIEJSZE TESTY
RadioOwnerName
Klient
PRZYKŁAD 4:
MUSZĘ
TESTOWAĆ
PRYWATNE
METODY
Obiekt
D()B()
C()
A()
- CHCĘ TESTOWAĆ PRYWATNĄ METODĘ
- ZRÓB TO PRZEZ PUBLICZNE API
Test Obiekt
B()
C()
A()
D()
- ALE ONA JEST NA TYLE ODRĘBNA...
Test 2 Obiekt
B()
C()
A()
D()
... ŻE CHCĘ JĄ TESTOWAĆ OSOBNO.
Test 2 Obiekt
B()
C()
A()
D()
Wskazówka:
Chęć testowania prywatnych metod
- TO JĄ WYDZIEL!
Test 2 Obiekt
B()
C()
A()
Inny
Obiekt
D()
PRZYKŁAD 5:
CIĘŻKI
KONTEKST
configData = new ConfigData();
configData.GetHeader().SetStdState(StdState.SUBMITTED);
configData.GetHeader().SetType(FileType.NECB);
ge1 = CreateGroupEntry(1, TALKGROUP, null, configData.Id);
ge2 = CreateGroupEntry(2, TALKGROUP, null, configData.Id);
ge3 = CreateGroupEntry(3, MULTIGROUP, null, configData.Id);
ge4 = CreateGroupEntry(4, MULTIGROUP, null, configData.Id);
ge5 = CreateGroupEntry(5, MULTIGROUP, null, configData.Id);
talkgroup1 = CreateTalkgroup(1, 1, null, configData.Id);
talkgroup2 = CreateTalkgroup(1, 3, null, configData.Id);
talkgroup3 = CreateTalkgroup(2, 0, null, configData.Id);
talkgroup4 = CreateTalkgroup(3, 5, null, configData.Id);
context = new ValidationObjectContext(configData);
configData = new ConfigData();
configData.GetHeader().SetStdState(StdState.SUBMITTED);
configData.GetHeader().SetType(FileType.NECB);
ge1 = CreateGroupEntry(1, TALKGROUP, null, configData.Id);
ge2 = CreateGroupEntry(2, TALKGROUP, null, configData.Id);
ge3 = CreateGroupEntry(3, MULTIGROUP, null, configData.Id);
ge4 = CreateGroupEntry(4, MULTIGROUP, null, configData.Id);
ge5 = CreateGroupEntry(5, MULTIGROUP, null, configData.Id);
talkgroup1 = CreateTalkgroup(1, 1, null, configData.Id);
talkgroup2 = CreateTalkgroup(1, 3, null, configData.Id);
talkgroup3 = CreateTalkgroup(2, 0, null, configData.Id);
talkgroup4 = CreateTalkgroup(3, 5, null, configData.Id);
context = new ValidationObjectContext(configData);
Wskazówka:
pracochłonne ustawianie kontekstu
WNIOSKI
Słuchaj ślepo swoich testów
Uważaj na:
• eksplozje kombinacji
• długie testy
• testowanie prywatnych metod
• mocki zwracające mocki
• ciężki kontekst
Szukaj najpierw źródła problemu w designie
PYTANIA?
Słuchaj ślepo swoich testów
Uważaj na:
• eksplozje kombinacji
• długie testy
• testowanie prywatnych metod
• mocki zwracające mocki
• ciężki kontekst
Szukaj najpierw źródła problemu w designie
MOTOROLA, MOTO, MOTOROLA SOLUTIONS and the Stylized M Logo are trademarks or registered trademarks of Motorola Trademark Holdings, LLC
and are used under license. All other trademarks are the property of their respective owners. © 2010 Motorola, Inc. All rights reserved.
iProtect Classification: Public

More Related Content

PDF
05 - Testowalność
PDF
4Developers 2018: Unit testing - introduction (Marek Kawczyński)
PPTX
Bilans korzyści i kosztów z automatyzacji.
PPTX
Behaviour Driven Development
PPTX
Koncert życzeń + niekończące się zmiany w koncepcji = katastrofa? Jak to posk...
PPTX
Biznes nie dorósł do Agile.
PDF
[QE 2015] Krzysztof Trzewiczek - Specification by Example w praktyce
PDF
Wydajne API dla aplikacji mobilnych
05 - Testowalność
4Developers 2018: Unit testing - introduction (Marek Kawczyński)
Bilans korzyści i kosztów z automatyzacji.
Behaviour Driven Development
Koncert życzeń + niekończące się zmiany w koncepcji = katastrofa? Jak to posk...
Biznes nie dorósł do Agile.
[QE 2015] Krzysztof Trzewiczek - Specification by Example w praktyce
Wydajne API dla aplikacji mobilnych

Viewers also liked (20)

PDF
Michał Sajdak, Testy bezpieczeństwa -­‐ teoria a praktyka
PPTX
[QE 2015] Katarzyna Mrowca - Refaktoring historyjek
PPTX
[FDD 2016] Krzysztof Bartnicki - Wszechświat kontra programista systemów wbud...
PDF
[QE 2015] Mateusz Kocielski - W każdym programie jest jeszcze jeden błąd
PDF
Testy to za mało – czyli słów kilka o jakości w oprogramowaniu: czym jest, ja...
PPSX
Wyboista droga do dobrego kodu. ...
PDF
DailyArt – jak zaprojektować aplikację mobilną kochaną przez ludzi?/WUD Siles...
PPTX
Kim jest Agile Coach?
ODP
Continuous Delivery – kolejny krok na drodze do Agile.
PPTX
Jakość jest w nas
PPTX
Jak aspekty uporządkują twój kod.
PDF
[QE 2015] Jarosław Pałka - Systematyczny architekt na drodze ku planowanemu p...
PDF
Coś zupełnie offline: badania etnograficzne są kluczem do skutecznego zaangaż...
PPTX
Czy warstwa sprzętowa wyklucza testy automatyczne?
PPTX
TDD – w poszukiwaniu źródeł jakości.
PDF
[QE 2015] Łukasz Szydło - Continuous Delivery – Architektura i Praktyka
PPTX
[FDD 2016] Jarosław Porwoł - Koncert na 144 rdzenie i czterech dyrygentów
PPTX
[FDD2016] Rafał Brzoska - Angular2 - nadchodzi nowe!
PDF
Analiza wydajności następnej generacji - przykłady.
PPTX
[FDD 2016] Pablo Ribalta - Deep Learning
Michał Sajdak, Testy bezpieczeństwa -­‐ teoria a praktyka
[QE 2015] Katarzyna Mrowca - Refaktoring historyjek
[FDD 2016] Krzysztof Bartnicki - Wszechświat kontra programista systemów wbud...
[QE 2015] Mateusz Kocielski - W każdym programie jest jeszcze jeden błąd
Testy to za mało – czyli słów kilka o jakości w oprogramowaniu: czym jest, ja...
Wyboista droga do dobrego kodu. ...
DailyArt – jak zaprojektować aplikację mobilną kochaną przez ludzi?/WUD Siles...
Kim jest Agile Coach?
Continuous Delivery – kolejny krok na drodze do Agile.
Jakość jest w nas
Jak aspekty uporządkują twój kod.
[QE 2015] Jarosław Pałka - Systematyczny architekt na drodze ku planowanemu p...
Coś zupełnie offline: badania etnograficzne są kluczem do skutecznego zaangaż...
Czy warstwa sprzętowa wyklucza testy automatyczne?
TDD – w poszukiwaniu źródeł jakości.
[QE 2015] Łukasz Szydło - Continuous Delivery – Architektura i Praktyka
[FDD 2016] Jarosław Porwoł - Koncert na 144 rdzenie i czterech dyrygentów
[FDD2016] Rafał Brzoska - Angular2 - nadchodzi nowe!
Analiza wydajności następnej generacji - przykłady.
[FDD 2016] Pablo Ribalta - Deep Learning
Ad

Similar to Nie rozwiązuj w testach jednostkowych problemów z testowanym kodem. (12)

PPT
Testy Jednostokowe
PPTX
Katarzyna Bylec, Testowanie - perspektywa programisty
PPTX
Testowanie bezpieczeństwa – jak dostosować zakres do realnych zagrożeń i budżetu
PPS
Poznańska grupa .Net spotkanie VI - Test Driven Development
PDF
Wprowadzenie do PHPUnit
PDF
Testowanie. Wprowadzenie do testowania oprogramowania.
PDF
[Quality Meetup] Jacek Sowiński – SecDevOps – w codziennej pracy każdego deve...
PPTX
Podstawy testowania oprogramowania INCO 2023.pptx
PDF
xUnit - narzędzie do testowania
PDF
01 - Wprowadzenie do TDD
PDF
Testy jednostkowe - 8 rzeczy, które musisz wiedzieć
PPTX
Więcej testów/mniej kodu - Michał Gaworski, kraQA 13
Testy Jednostokowe
Katarzyna Bylec, Testowanie - perspektywa programisty
Testowanie bezpieczeństwa – jak dostosować zakres do realnych zagrożeń i budżetu
Poznańska grupa .Net spotkanie VI - Test Driven Development
Wprowadzenie do PHPUnit
Testowanie. Wprowadzenie do testowania oprogramowania.
[Quality Meetup] Jacek Sowiński – SecDevOps – w codziennej pracy każdego deve...
Podstawy testowania oprogramowania INCO 2023.pptx
xUnit - narzędzie do testowania
01 - Wprowadzenie do TDD
Testy jednostkowe - 8 rzeczy, które musisz wiedzieć
Więcej testów/mniej kodu - Michał Gaworski, kraQA 13
Ad

More from Future Processing (20)

PDF
DPTO_Inżynieria oprogramowania to proces uczenia się.pdf
PDF
DPTO_QA w świecie wartości biznesowych.pdf
PDF
DPTO_Hello_Clean_Architekture.pdf
PDF
[Quality Meetup #20] Michał Górski - Continuous Deployment w chmurze
PDF
[Quality Meetup #20] Dorota Tadych - Hyperion - wystarczy jeden shake
PDF
[Quality Meetup #19] Magdalena Drechsler-Nowak - Tester w pułapce myślenia
PDF
[Quality Meetup #19] Adrian Gonciarz - Testerska ruletka
PDF
[FDD 2018] Krzysztof Sikora - Jak Service Fabric rozwiąże twoje problemy z mi...
PDF
[FDD 2018] Ł. Turchan, A. Hulist, M. Duchnowski - CUDA - results over coffee ...
PDF
[FDD 2018] Lech Kalinowski - Prywatny Blockchain
PPTX
[FDD 2018] W. Malara, K. Kotowski - Autoenkodery – czyli zalety funkcji F(X)≈X
PPTX
[FDD 2018] Jarosław Ogiegło - Ludzie, zabezpieczajcie się! Wprowadzenie do OA...
PDF
[JuraSIC! Meetup] Krzysztof Sikora- Jak Service Fabric rozwiąże twoje problem...
PDF
[JuraSIC! Meetup] Mateusz Stasch - Monady w .NET
PDF
[QE 2018] Aleksandra Kornecka – Kognitywne podejście do testowania aplikacji ...
PDF
[QE 2018] Adam Stasiak – Nadchodzi React Native – czyli o testowaniu mobilnyc...
PDF
[QE 2018] Łukasz Gawron – Testing Batch and Streaming Spark Applications
PDF
[QE 2018] Marek Puchalski – Web Application Security Test Automation
PDF
[QE 2018] Rob Lambert – How to Thrive as a Software Tester
PDF
[QE 2018] Paul Gerrard – Automating Assurance: Tools, Collaboration and DevOps
DPTO_Inżynieria oprogramowania to proces uczenia się.pdf
DPTO_QA w świecie wartości biznesowych.pdf
DPTO_Hello_Clean_Architekture.pdf
[Quality Meetup #20] Michał Górski - Continuous Deployment w chmurze
[Quality Meetup #20] Dorota Tadych - Hyperion - wystarczy jeden shake
[Quality Meetup #19] Magdalena Drechsler-Nowak - Tester w pułapce myślenia
[Quality Meetup #19] Adrian Gonciarz - Testerska ruletka
[FDD 2018] Krzysztof Sikora - Jak Service Fabric rozwiąże twoje problemy z mi...
[FDD 2018] Ł. Turchan, A. Hulist, M. Duchnowski - CUDA - results over coffee ...
[FDD 2018] Lech Kalinowski - Prywatny Blockchain
[FDD 2018] W. Malara, K. Kotowski - Autoenkodery – czyli zalety funkcji F(X)≈X
[FDD 2018] Jarosław Ogiegło - Ludzie, zabezpieczajcie się! Wprowadzenie do OA...
[JuraSIC! Meetup] Krzysztof Sikora- Jak Service Fabric rozwiąże twoje problem...
[JuraSIC! Meetup] Mateusz Stasch - Monady w .NET
[QE 2018] Aleksandra Kornecka – Kognitywne podejście do testowania aplikacji ...
[QE 2018] Adam Stasiak – Nadchodzi React Native – czyli o testowaniu mobilnyc...
[QE 2018] Łukasz Gawron – Testing Batch and Streaming Spark Applications
[QE 2018] Marek Puchalski – Web Application Security Test Automation
[QE 2018] Rob Lambert – How to Thrive as a Software Tester
[QE 2018] Paul Gerrard – Automating Assurance: Tools, Collaboration and DevOps

Nie rozwiązuj w testach jednostkowych problemów z testowanym kodem.

Editor's Notes

  • #2: Title Page Option 3 Solid-colored Background Date/location information is Arial16pt. Headline copy is Arial Bold 54pt in all caps. Use Paragraph Line Spacing Multiple of 0.8 with 0pt spacing before and after. Presenter information is Arial Bold 18pt in all caps. The Paragraph Line Spacing is Exactly 0.9pt with 0pt spacing before and after. Background can be changed to any color is white.
  • #3: Title Page Option 3 Solid-colored Background Date/location information is Arial16pt. Headline copy is Arial Bold 54pt in all caps. Use Paragraph Line Spacing Multiple of 0.8 with 0pt spacing before and after. Presenter information is Arial Bold 18pt in all caps. The Paragraph Line Spacing is Exactly 0.9pt with 0pt spacing before and after. Background can be changed to any color is white.
  • #4: Agenda Slide Example Note: All slide titles in deck are 44pt BOLD ALL CAPS Arial, Subject Titles 24pt Bold ALL CAPS, Arial. Title color should be consistent with color in presentation. To change title colors you will need to do so in Slide Master view. Images can be swapped out using any of the new brand imagery at www.motorolasolutionscollective.com, go to page 21 for instructions on sizing/modifying. Image for agenda can have three sided bleed.
  • #6: Section Slide Example – No Image, Solid Color TITLE ALL CAPS ARIAL 44 PT BOLD, line spacing .8 lines. A divider slide can use a color block on half the page, color consistent with color choice used in presentation.
  • #11: Wróćmy na chwilę do samych testów
  • #13: Section Slide Example – No Image, Solid Color TITLE ALL CAPS ARIAL 44 PT BOLD, line spacing .8 lines. A divider slide can use a color block on half the page, color consistent with color choice used in presentation.
  • #18: Section Slide Example – No Image, Solid Color TITLE ALL CAPS ARIAL 44 PT BOLD, line spacing .8 lines. A divider slide can use a color block on half the page, color consistent with color choice used in presentation.
  • #24: Section Slide Example – No Image, Solid Color TITLE ALL CAPS ARIAL 44 PT BOLD, line spacing .8 lines. A divider slide can use a color block on half the page, color consistent with color choice used in presentation.
  • #28: Section Slide Example – No Image, Solid Color TITLE ALL CAPS ARIAL 44 PT BOLD, line spacing .8 lines. A divider slide can use a color block on half the page, color consistent with color choice used in presentation.
  • #30: Section Slide Example – No Image, Solid Color TITLE ALL CAPS ARIAL 44 PT BOLD, line spacing .8 lines. A divider slide can use a color block on half the page, color consistent with color choice used in presentation.
  • #32: Section Slide Example – No Image, Solid Color TITLE ALL CAPS ARIAL 44 PT BOLD, line spacing .8 lines. A divider slide can use a color block on half the page, color consistent with color choice used in presentation.
  • #53: Section Slide Example – No Image, Solid Color TITLE ALL CAPS ARIAL 44 PT BOLD, line spacing .8 lines. A divider slide can use a color block on half the page, color consistent with color choice used in presentation.
  • #66: Section Slide Example – No Image, Solid Color TITLE ALL CAPS ARIAL 44 PT BOLD, line spacing .8 lines. A divider slide can use a color block on half the page, color consistent with color choice used in presentation.
  • #68: struktura odzwierciedla świat rzeczywisty. Nawigowanie po łańcuchu może prowadzić do problemów. Zamiast tego mogę próbować to przykryć fasadą. problem z enkapsulacją. Pokazać poprawny przykład. Zmienić zamiast danych zwraca boola?
  • #75: Section Slide Example – No Image, Solid Color TITLE ALL CAPS ARIAL 44 PT BOLD, line spacing .8 lines. A divider slide can use a color block on half the page, color consistent with color choice used in presentation.
  • #81: Section Slide Example – No Image, Solid Color TITLE ALL CAPS ARIAL 44 PT BOLD, line spacing .8 lines. A divider slide can use a color block on half the page, color consistent with color choice used in presentation.
  • #86: Thank you or Q&A wrap up slide example. Font arial 80pt. Legal disclaimer bottom of page arial 8pt font with I Protect
  • #93: Rozwiązanie 1: testuj przez publiczne API.
  • #97: TODO zastąpić pseudokodem