Przejdź do głównej zawartości

Prezentacja aktorów

Myślę, nad pierwszym problemem, który mógłby rozwiązywać nasz system.
Wydaje mi się, że na początku potrzebne jest nawiązanie kontaktu pomiędzy właścicielami biznesów - klientami, a posiadaczami programistycznej wiedzy tajemnej  - ludźmi z IT.

Poprzedni odcinek tu: https://michalkulinski.blogspot.fr/2017/03/no-dobra-to-czas-moze-utworzyc-pierwsza.html

Może to się dziać za pomocą jakiegoś medium. Dodaję aktorów do systemu:


def test_if_there_are_actors_of_that_tragedy                                                                                         
                                                                                                                                       
    client = Client.new                                                                                                                
    it_people = ItPeople.new                                                                                                           
    media = Media.new                                                                                                                  
                                                                                                                                       
    assert_not_null(client);                                                                                                           
    assert_not_null(people);
    assert_not_null(media);                                                                                                            
                                                                                                                                       
end 


Niestety mamy błędy kompilacji:


coola@sv26 [/home/coola/dsp2017/xp-simulator]# ruby smoke_test.rb                                                                      
Loaded suite smoke_test                                                                                                                
Started                                                                                                                                
E                                                                                                                                      
=======================================================================================================================================
Error: test_if_there_are_actors_of_that_tragedy(FirstSmokeTestClass): NameError: uninitialized constant FirstSmokeTestClass::Client    
smoke_test.rb:13:in `test_if_there_are_actors_of_that_tragedy'                                                                         
     10:                                                                                                                               
     11:   def test_if_there_are_actors_of_that_tragedy                                                                                
     12:                                                                                                                               
  => 13:     client = Client.new                                                                                                       
     14:     it_people = ItPeople.new                                                                                                  
     15:     media = Media.new                                                                                                         
     16:                                                                                                                               
=======================================================================================================================================
.                                                                                                                                      
                                                                                                                                       
Finished in 0.001111911 seconds.                                                                                                       
---------------------------------------------------------------------------------------------------------------------------------------
2 tests, 1 assertions, 0 failures, 1 errors, 0 pendings, 0 omissions, 0 notifications                                                  
50% passed                                                                                                                             
---------------------------------------------------------------------------------------------------------------------------------------
1798.71 tests/s, 899.35 assertions/s                                                                                                   


Zanim zacznę tworzyć brakujące klasy warto wprowadzić strukturę katalogów z kodem produkcyjnym i testowym oddzielnie:


coola@sv26 [/home/coola/dsp2017/xp-simulator]# mkdir src                                                                               
coola@sv26 [/home/coola/dsp2017/xp-simulator]# mkdir test                                                                              
coola@sv26 [/home/coola/dsp2017/xp-simulator]# mv smoke_test.rb ./test/smoke_test.rb                                                   
coola@sv26 [/home/coola/dsp2017/xp-simulator]# ls                                                                                      
README  src  test                                 


Teraz odpalam swoje testy tak:


coola@sv26 [/home/coola/dsp2017/xp-simulator]# ruby ./test/smoke_test.rb                                                               
Loaded suite ./test/smoke_test                                                                                                         
Started                                                                                                                                
E                                                                                                                                      
=======================================================================================================================================
Error:

Do katalogu ze źródłami dodaję pliki klas:


coola@sv26 [/home/coola/dsp2017/xp-simulator]# touch ./src/Client.rb                                                                   
coola@sv26 [/home/coola/dsp2017/xp-simulator]# touch ./src/ItPeople.rb                                                                 
coola@sv26 [/home/coola/dsp2017/xp-simulator]# touch ./src/Media.rb                                                                    
coola@sv26 [/home/coola/dsp2017/xp-simulator]# ls ./src/                                                                               
Client.rb  ItPeople.rb  Media.rb  

i kod klas:

class Client                                                                                                                           
end


class ItPeople                                                                                                                         
end


class Media                                                                                                                            
end

Teraz - jak zrobić, żeby te klasy były widoczne z pliku testowego?

Posiłkując się Stackiem:

http://stackoverflow.com/questions/3672586/what-is-the-difference-between-require-relative-and-require-in-ruby?noredirect=1&lq=1

Dowiedziałem się, że słówko kluczowe require powinno załatwić sprawę.


coola@sv26 [/home/coola/dsp2017/xp-simulator]# ruby ./test/smoke_test.rb                                                               
/usr/share/ruby-2.3.1/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- src/Client.rb (LoadE
rror)                                                                                                                                  
        from /usr/share/ruby-2.3.1/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require'                                  
        from ./test/smoke_test.rb:2:in `<main>'                                                                                        
coola@sv26 [/home/coola/dsp2017/xp-simulator]#     

Nope, Nie działa. Okazuje się że ruby szuka klas tylko w tych katalogach:


coola@sv26 [/home/coola/dsp2017/xp-simulator]# ruby -e "puts $:"                                                                       
/usr/share/ruby-2.3.1/lib/ruby/site_ruby/2.3.0                                                                                         
/usr/share/ruby-2.3.1/lib/ruby/site_ruby/2.3.0/x86_64-linux                                                                            
/usr/share/ruby-2.3.1/lib/ruby/site_ruby                                                                                               
/usr/share/ruby-2.3.1/lib/ruby/vendor_ruby/2.3.0                                                                                       
/usr/share/ruby-2.3.1/lib/ruby/vendor_ruby/2.3.0/x86_64-linux                                                                          
/usr/share/ruby-2.3.1/lib/ruby/vendor_ruby                                                                                             
/usr/share/ruby-2.3.1/lib/ruby/2.3.0                                                                                                   
/usr/share/ruby-2.3.1/lib/ruby/2.3.0/x86_64-linux    

Nie ma tam mojego katalogu z kodem.
Mogę podejść do tego problemu dwojako:


  1. Albo mogę dodać mój katalog z kodem do tej listy.
    • ruby -Ilib [katalog_z kodem źródłowym]
  2. Albo mogę ustawić w pliku testowym ścieżki względne przez require_relative 
    • require_relative "../src/Client.rb"
Rozwiązanie pierwsze nie podoba mi się, ponieważ uzależniam odpalenie mojego kodu od zmiennej środowiskowej. Ktoś, kto by chciał ściągnąć mój kod musiałby ustawić tę zmienną ręcznie chcąc uruchomić mój kod. 

Drugie rozwiązanie odpycha mnie wizją skomplikowania zależności. Gdybym chciał zmienić położenie pliku z kodem testowym, musiałbym zmieniać ścieżki zaraz za require_relative 

Może warto zaprząc do pracy jakieś narzędzie do budowania automatycznego. Coś, co by automatycznie ustawiało ścieżkę do katalogu z kodem i odpalało testy.

To może Rake?


coola@sv26 [/home/coola/dsp2017/xp-simulator]# gem install rake                                                                        
Fetching: rake-12.0.0.gem (100%)                                                                                                       
Successfully installed rake-12.0.0                                                                                                     
1 gem installed              


Najpierw trzeba napisać plik Rakefile.


task default: %w[test]                                                                                                                 
                                                                                                                                       
task :test do                                                                                                                          
  ruby "test/smoke_test.rb"                                                                                                            
end

Kod do ustawiania katalogu dodam w następnym wpisie.

Komentarze

  1. Rzucasz czytelnika w sam środek akcji, przez co trudno poznać kontekst tego, co się czyta, a szkoda, bo czyta się lekko i przyjemnie ;]

    (sorki za podwójny komentarz, możesz usunąć jeden - pomyliłem konta)

    OdpowiedzUsuń
  2. Michale,
    Rzeczywiście powinienem dać na początku artykułu link do poprzedniego i na końcu do następnego.
    Dzięki za dobre słowa. Polałeś miód na mą zbolała programistyczną duszę :)

    OdpowiedzUsuń

Prześlij komentarz

Popularne posty z tego bloga

Kursy IT na Pluralsight. Dlaczego warto?

Bardzo sobie cenię kursy na Pluralsight. Mam wrażenie, że każdy kurs, który przeszedłem na tej platformie, w dużym stopniu podniósł moje zdolności. Wiem, dostęp do tej platformy nie jest tani, ale w mojej ocenie warty swojej ceny. To nie jest reklama, ale forma entuzjazmu jaki mam do tej formy samodoskonalenia. O to kilka punktów pokazujących ofertę tego serwisu i dlaczego warto skorzystać: Pluralsight to kursy z Javascript, C#, Java, Angular, Python, MySQL i wielu innych technologii i umiejętności. Kursy na Pluralsight w większości mają wyższą jakość niż te, które możemy znaleźć na przykład na YouTube. Są wyselekcjonowane, mają wysoką jakość dźwięku i obrazu. Często wgryzają się głęboko w dany problem daleko poza standardowe „Hello World” danej technologii. Twórcy Pluralsight to często osoby znane ze świata IT i konferencji branżowych, jak: Scott Hanselman, Microsoft John Somnez, SimpleProgrammer.com John Skeet, Google Pluralsight udostępnia funkcjonalność ścieżek – paths....

Bicie piany

Czy słyszałeś o tym gościu, który powiedział, że Object Oriented to przeżytek? No nie. Następny. Co powiedział? Opisał wszystkie obietnice OO, i jak żadna z nich tak naprawdę nigdy nie została spełniona i o tych wszystkich możliwościach OO, które kosztują więcej, niż są warte i że funkcjonalne programowanie jest lepsze i ... Phi. Tak słyszałem już to wcześniej. No, więc OO jest martwe, leży i kwiczy i możemy przejść dalej. Przejść dalej do czego? Co? No do NASTĘPNEJ WIELKIEJ RZECZY oczywiście. Aaaa, do tego. Czy wiesz już co to jest? Nie bałdzo, ale jestem podekscytowany na myśl o mikroserwisach; jaram się Elixirem; i słyszałem, że React jest fantastyczny; i ... Tak, tak. Bicie piany. Dałeś się nabrać na bicie piany. Co? Co masz na myśli. Przecież mamy takie wspaniałe czasy. Tak naprawdę postrzegam te czasy jako depresyjne. Ale dlaczego? Przecież co kilka dni wyskakują nowe wspaniałe technologie! Wspinamy się na coraz wyższe szczyty. Phi. To, co tak napraw...

Podstawy Programowania Funkcyjnego Epizod 1

O czym jest programowanie funkcyjne? Zakładam, że słyszałeś już kiedyś o programowaniu funkcyjnym. No cóż, któż nie słyszał? Wszyscy o tym gadają. Wychodzi dużo nowych języków funkcyjnych takich, jak Scala, F# i Clojure. Ludzie rozmawiają też o starszych językach jak Erlang, Haskell, ML i innych. A więc, o co w tym wszystkim chodzi? Dlaczego programowanie funkcyjne jest Następną Wielką Rzeczą™? I co jest w tym takiego pociągającego? Poniższy tekst jest luźnym tłumaczeniem wpisu bloga Roberta Cecila "Wujka Boba" Martina z dnia 22 grudnia 2012 ze strony: https://blog.cleancoder.com/uncle-bob/2012/12/22/FPBE1-Whats-it-all-about.html Proszę o komentarze, jeżeli ta luźność jest zbyt daleko posunięta. Po pierwsze, prawie na pewno programowanie funkcyjne jest następną wielką rzeczą. Są ku temu dobre, solidne powody i poznamy je w tym artykule. Ale najpierw, aby zrozumieć te powody, musimy poznać, czym programowanie funkcyjne jest....