title: Jak opisać złożoność projektu bez ujawniania informacji?

text: Będę szukał pracy po długiej przerwie, więc potrzebuję wszelkiej możliwej pomocy. Problem w tym, że moim najlepszym punktem w portfolio jest nietypowa aplikacja, wykorzystująca dość nietypowe algorytmy, które na pierwszy rzut oka mogą wydawać się proste dla każdego, kto nie musiał ich projektować i implementować. Naturalną rzeczą do zrobienia byłoby opisanie szczegółów projektu i implementacji, aby każdy programista mógł ocenić, ile umiejętności i determinacji wymagało ukończenie projektu. Ale zamierzam jeszcze trochę doszlifować aplikację i ją sprzedać. Nie chcę, żeby w najbliższym czasie pojawiły się klony. Obecnie bariera wejścia jest wysoka, ale gdybym miał dawać wskazówki dotyczące mojej implementacji, to już tak nie jest. Nie wierzę w uczciwość rekrutowania programistów. Mam doświadczenie w chodzeniu na rozmowy kwalifikacyjne i w niektórych przypadkach wydaje mi się, że głównym punktem rozmowy było uzyskanie informacji o naszym rurociągu, stosowanych technologiach i niestandardowych rozwiązaniach, a nie zatrudnianie mnie :) EDIT: Nie powiedzenie, co robi aplikacja, lub brak linku do niego nie spowoduje nawet oddzwonienia na rozmowę kwalifikacyjną. Nie będę aplikował do firm, które mogłyby sprzedawać rozwiązanie podobne do mojego. Martwię się raczej o udzielanie porad poszczególnym programistom, jak zrobić klona, bez wchodzenia w ślepe zaułki i długich badań.


title: Implementacja MVP na poziomie UserControl

text: Próbuję dowiedzieć się, jak należy zaimplementować MVP na poziomie `UserControl`. Myślałem, że to mam, ale skończyło się na przeczytaniu posta na blogu, który prawie mnie zablokował. Teraz jestem z powrotem na starcie i nie mam pojęcia, jak postąpić. Powiedzmy, że moja kontrola użytkownika jest czymś prostym, jak dwa pola tekstowe i ComboBox. Jest to wywoływane z formularza głównego (który ma własny widok i prezenter). Teraz rozumiem, że MVP jest taki, że prezenter formularza głównego powinien wywołać drugiego prezentera, aby obsłużyć całą komunikację z UserControl, która zostanie tam upuszczona. I tutaj zupełnie się gubię. Moje poprzednie implementacje `UserControl` (zanim nauczyłem się MVP) zawsze zawierały logikę stojącą za kontrolką (np. zaznaczenie `ComboBox` zmieni etykietę tekstową związaną z `TextBox1`). W związku z tym implementacja `UserControl` odbywa się poprzez przeciągnięcie jej do projektanta, a następnie wywołanie poleceń takich jak `UserControl1.Update()` lub `UserControl1.DisplayData(data)`. W każdej kontroli użytkownika zewnętrznego, wszystkie komendy do kontroli użytkownika są wykonywane przez komendy do kontrolki. Nie ma "prezentera", który musi być wywoływany, na przykład, kiedy upuszczam `ComboBox`, `ListView`, lub jakąkolwiek inną kontrolkę WinForms na moim formularzu. Jednak mają wewnętrzną logikę, która dyktuje sposób wyświetlania, a w istocie testowania powinna mieć "prezenter" oddzielone **gdzieś**. _Pomyślałem_, że dobrym rozwiązaniem byłoby to, że **konstruktor** mojego `UserControl` utworzy prezenter. Wszelkie polecenia do `UserControl` byłyby delegowane bezpośrednio do prezentera. Pozwoliłoby to mojemu `UserControl` na posiadanie własnej logiki prezentacji oddzielonej od jej „widoku”, tak abym mógł ją przetestować i tak, że implementator (Formularz Główny) musiałby tylko wrzucić `UserControl` i wykonać wysyłanie danych i otrzymuje jako część lokalnej logiki prezentacji. `UserControl` ma własną logikę prezentacji, która pozostaje niewidoczna dla realizatora. I właśnie wtedy, gdy myślałem, że wszystko zrozumiałem, dowiaduję się, że to zła praktyka (Pogląd samoświadomy). Więc proszę ludzi, którzy rozumieją to lepiej niż ja: Jak zbudować `UserControl`, który utrzymuje logikę prezentacji niewidoczną dla użytkownika końcowego, tak aby nie musiałem konstruować opakowania prezentującego w moim formularzu głównym, * *bez** naruszania zasad, które Matt Wynne omawia w powyższym linku? Czy może kompletnie nie rozumiem tutaj koncepcji MVP?


title: jaki jest właściwy sposób organizowania kodu, który obejmuje wiele obiektów?

text: Załóżmy, że mam następujące klasy: osoba, widżet, foo_bars. Osoba może mieć wiele widżetów i foo_bars. Gdy administrator usunie osobę, chcę, aby mój kod wykonał usuwanie kaskadowe... i usunięcie wszystkich powiązanych rekordów w bazie danych dla tej osoby. W mojej klasie widżetów mam metodę usuwania... i to samo dotyczy mojego Klasa foo_bars Ale aby pomieścić coś w rodzaju funkcji usuwania osoby, uważam, że powinienem stworzyć klasę "Person Manager", która faktycznie powtórzy wersję całej logiki wewnątrz obu metod usuwania w klasach widżetów / foo_bars. (zamiast tylko wywoływania istniejących metod w klasach. Oto, o czym myślę: **Przykład 1** public class PersonManager{ delete_person(personID as int) { // załóżmy, że pytałem o listę wszystkich widżetów i identyfikatory foobars //1. usuń wszystkie widżety dla personID success = true dim obj_widget = nowy widżet; pętla przez wszystkie widżety result = obj_widget.delete(widgetID) jeśli nie wynik to success = false wyjdź z błędem end if end pętla //2 usuń wszystkie foo bary dla personID jeśli sukces, to dim objfoobar= nowe foo_bars; pętla przez wszystkie foobars result = objfoobar.delete(foobarid) jeśli nie wynik to success = false pętla wyjścia koniec koniec pętli koniec //3. usuń rekord osoby. jeśli sukces then wynik = databaseobj.deleteperson(personID) jeśli nie wynik to zwróć false, "Usunięcie osoby nie powiodło się, ponieważ...." else return true end end } } W powyższym przykładzie próbuję zademonstrować ponowne użycie istniejącego istniejące metody usuwania w każdej klasie ... a następnie, jeśli pomyślnie usunie wszystkie widżety i foobary dla osoby, usuwam sam rekord osoby. Problem polega na tym, że jeśli widżety usuwają się poprawnie, a foo_bars nie, to jak mogę cofnąć? Każda metoda usuwania ma zdefiniowaną własną transakcję, ponieważ usunięcie widżetu lub paska foo obejmuje, powiedzmy, 2-3 kroki. Innymi słowy, metoda usuwania w klasie widżetu wygląda obecnie tak: public class widget{ delete_widget{ database.execute("ROZPOCZNIJ TRANSAKCJĘ") database.execute("USUŃ Z XYX...") jeśli się powiedzie, to baza danych .execute("USUŃ Z yyy...") else database.execute("ROLL COFNIJ") return false end if database.execute("COMMIT") return true } } Dla każdego widżetu będę wywoływał tę metodę. .. A co, jeśli wszystkie widżety zostaną usunięte, ale umrze, usuwając pierwszy foobar? Myślę, że muszę przepisać kod, aby usunąć wszystko bezpośrednio z klasy Person manager i owinąć go w transakcję, zamiast wywoływać istniejące metody usuwania w klasach. Przynajmniej tak myślę. Jeśli istnieje inny sposób spojrzenia na ten problem, daj mi znać. Mógłbym po prostu napisać kaskadową instrukcję usuwania SQL w klasie PersonManager i nie wywoływać metod na dwóch klasach. Ale nie wiem, czy użycie kaskadowego usuwania SQL jest dobrą rzeczą... Dzięki!


title: Czy należy unikać metod zwracających hashmap ciągu do obiektu?

text: W moim obecnym kodzie wielokrotnie odczuwałem pragnienie posiadania metod pomocniczych, które generują kolekcję obiektów i zwracają je jako mapę ciągu do obiektu, przy czym ciąg jest jakimś unikalnym identyfikatorem, takim jak etykieta obiektów. Wiele z moich obiektów ma zagwarantowane unikalne etykiety, ponieważ te etykiety są używane za pośrednictwem spokojnego interfejsu podczas wysyłania zapytań do obiektu. Powodem, dla którego chcę to zrobić, jest efektywność. Mogę mieć przyzwoitą kolekcję i wiem, że metoda wywołująca dowolną prywatną metodę pomocniczą, którą napisałem, na pewno będzie chciała wyszukać określone obiekty w mojej kolekcji, więc zwrócenie ich jako mapy pozwala zamiast tego uruchomić metodę wywołującą w O(n) z O(n^2). Czuję jednak, że powrót nie jest samodokumentujący. Klucz jest po prostu ciągiem, nic nie wskazuje na to, że ciąg jest konkretnie etykietą obiektu. Oczywiście będę miał komentarz w tym zakresie, ale najlepiej, aby samodokumentujący się kod był napisany tak dobrze, że nie trzeba przechodzić do delaracji metod, aby coś wymyślić. Mam więc kilka pytań: 1) Czy fakt, że muszę zwrócić mapy, jest sam w sobie zapachem kodu? (inna niż prawdopodobnie przedwczesna optymalizacja, za którą wiem, że mogę być trochę winna, ale nie czuję się źle, martwiąc się o duże O metody) 2) Czy jest to ogólnie akceptowalne, czy powinienem się tym zająć czystsze podejście? Na przykład, czy powinienem tworzyć jakiś obiekt mapy, który automatycznie mapuje dowolny obiekt według etykiety? A co z miejscami, w których chcę zwrócić mapę, w której kluczem jest inny klucz, czy powinienem zrobić dla nich obiekt opakowujący? czy moja mapa jest wystarczająco dobra? EDIT: Poproszono o więcej szczegółów, aby wyjaśnić moją konkretną sytuację. Pracuję w javie. Chociaż mogę mieć unikalne łańcuchy, nie są one znane do czasu kompilacji, a wyliczenia nie pasują do siebie, w przeciwnym razie użyłbym ich! Nie używam refleksji ani żadnych innych systemów do dynamicznego generowania danych, metody i ich znaczenie są za każdym razem dość standardowe. Zwykle przy użyciu odpowiednika UUID obiektów (który w tym przypadku jest ciągiem używanym w całej domenie) lub etykiety, która jest gwarantowanym unikalnym ciągiem używanym do odwoływania się do danego obiektu w przypadku wywołania spokojnego.


title: Najlepsze praktyki dotyczące łączenia interfejsu Java Applet/Android?

text: Pracuję nad grą online, do której poważnie rozważam napisanie do niej apletu Java. Gra nie jest zbyt skomplikowana pod względem funkcji. Rozważam w pewnym momencie posiadanie co najmniej 3 wersji gry, w tym samodzielną wersję Java, aplet i grę na Androida. Wiem z wzorców projektowych, że najlepszym sposobem na użycie różnych rzeczy, takich jak przyciski i tym podobne, jest użycie interfejsu Bridge, gdzie mam wspólny szablon dla wspólnych przycisków. Mam jednak trochę trudności ze zrozumieniem, co zrobić z poniższymi informacjami. Wiem, że programy na Androida używają struktury Activity, którą dobrze znam, oraz że aplety rozszerzają interfejs apletu, z którym nie jestem zaznajomiony. Wiem również, że samodzielny program Java używa zasadniczo funkcji main(), która nie ma zbyt wiele struktury. Jestem przekonany, że powinien istnieć sposób na zaprojektowanie wspólnego wzorca projektowego między nimi, ale jakoś brakuje mi tego, co to jest dokładnie. Co mogę zrobić, aby różne frameworki działały z jak największą ilością wspólnego kodu?


title: Czy lokalizatory usług są naprawdę takie złe?

text: Ludzie mówią, że lokalizatory usług są złe, ponieważ ujawniają zależności w jakiejś losowej metodzie z klasy (a nie w argumentach konstruktora, jak powinno): class A{ function F(){ DB::query(...) } } klasy A{ chronione $db; funkcja __construct(DB $db){ $this->db = $db; } funkcja F(){ $this->db->zapytanie(...); } } Ale rozważ funkcję, taką jak `imagejpeg()` z GD. Oczywiście nie możesz tego "wstrzyknąć", więc musisz to wywołać gdzieś w swojej klasie, tak jak twoja usługa. Czy to nie to samo? Ta funkcja też jest zależnością. A co z tworzeniem instancji obiektu gdzieś w metodach klasy, takich jak PDO. Czy te rzeczy nie są w końcu dokładnie jak usługi? Po co więc całe zamieszanie, że lokalizatory usług są złe?


title: Licencja kodu źródłowego: bezpłatna do użytku osobistego i modyfikacji, ale bez publicznej dystrybucji

text: W przypadku jednej z moich aplikacji chcę, aby kod źródłowy był „open source”, aby inni mogli dostosować kod do swoich osobistych potrzeb, a nawet wnieść ulepszenia, ale nie chcę, aby ktokolwiek inny publikował „moją aplikację”. Co więcej, nadal chcę móc sprzedawać aplikację w przyszłości. Czy jest na to zwykła licencja, taka jak GPL lub podobna? Znalazłem podobne pytania z 2010 roku, które mówią coś o podwójnym licencjonowaniu, ale może jest licencja odpowiadająca moim potrzebom? * Oprogramowanie komercyjne, ale otwarte i bezpłatne do użytku osobistego/edukacyjnego. Jak licencjonować? * Bezpłatna licencja do użytku osobistego? * Open Source, ale nie Wolne Oprogramowanie (lub odwrotnie) * Licencjonowanie oprogramowania: open source, bez reklam, bez pochodnych


title: Jak przeszukujesz bazę kodów?

text: Używam egrep do przeszukiwania naszej bazy kodu, ale przy około 300 MB kodu źródłowego, który zaczyna działać trochę wolno. Jak przeszukujesz bazę kodów?


title: Gdzie znajdę przykłady specyfikacji funkcjonalnych?

text: Piszę specyfikację funkcjonalną programu komputerowego (a dokładnie aplikacji Mac OS X). Chcę to poprawić, patrząc na inne (dobre) specyfikacje funkcjonalne, ale nie mogę ich znaleźć. Czy są jakieś projekty (open source), których specyfikacje są publicznie dostępne, abym mógł się od nich uczyć i doskonalić swoje umiejętności pisania specyfikacji?


title: Testowanie jednostkowe indeksu tekstowego

text: Rozważmy indeks tekstowy, taki jak drzewo sufiksów lub tablica sufiksów, obsługująca zapytania _Count_ (liczba wystąpień wzorca) i zapytania _Locate_ (pozycje wszystkich wystąpień wzorca) nad danym tekstem. Jak byś podszedł do testowania jednostkowego takiej klasy? Mam na myśli wygenerowanie dużego losowego ciągu, a następnie wyodrębnienie losowego podciągu z tego dużego ciągu i porównanie wyników obu zapytań z naiwnymi implementacjami (takimi jak string::find). Innym pomysłem, jaki mam, jest znalezienie najczęstszego podłańcucha o długości `l` występującego w oryginalnym łańcuchu (być może za pomocą naiwnej metody) i użycie tych podciągów do testowania indeksu. To nie jest najlepszy sposób, więc jaki byłby dobry projekt testów jednostkowych dla indeksu tekstowego? Jeśli ma to znaczenie, jest to w C++ przy użyciu testu Google.


title: Testowanie automatyzacji UI (w szczególności FLEX)

text: Zastanawiałem się, czy społeczność wykorzystuje testy automatyzacji w zakresie UI? Czy istnieje kilka typowych sprawdzonych metod testowania interfejsu użytkownika? Ponadto - produkt nad którym pracuję jest oparty na flexie. Chętnie poznałbym pomysły, jak to przetestować. Głównie chcę przetestować: 1. Dane pojawiają się na ekranie zgodnie z oczekiwaniami 2. Walidacje pól (na przykład: pole nie jest liczbą) działają zgodnie z oczekiwaniami 3. Wyrównanie pól I tak dalej


title: Jakie są wszystkie rzeczy, które robią/mogą się zdarzyć, gdy użytkownik wprowadzi adres URL strony internetowej?

text: Przepraszam, jeśli to naiwny tytuł. Próbuję włamać się do tworzenia stron internetowych. Kilka lat temu zrobiłem podstawowe wprowadzenie do systemu operacyjnego, wprowadzenie do sieci w ramach studiów licencjackich. Nie mogę powiedzieć, że wchodziliśmy w sprawy głęboko, poza zadania akademickie. Chciałbym lepiej zrozumieć rzeczy związane z tym konkretnym zadaniem (np. co dzieje się na poziomie systemu operacyjnego, na poziomie sieci, jakie są zaangażowane inne komputery, gdzie wchodzą serwery proxy i hakerzy). Ponownie, na bardzo podstawowym poziomie zostało to omówione, ale chciałbym dokładniej przyjrzeć się tej konkretnej rzeczy. Czy polecasz rozdział(y) jakiejś konkretnej książki lub konkretnej KRÓTKIEJ lektury? Nie mam nic przeciwko twojej liście 20 ulubionych książek, ale chcę lepiej zrozumieć tę jedną rzecz w 2-3 tygodnie czytania po pracy / w weekendy (realistycznie 5-10 godzin tygodniowo, więc szukam około 15- 20 godzin lektury, NIE WIĘCEJ). Nie jestem szybkim czytelnikiem :) Dzięki.


title: Co mogę zrobić, jeśli mój szef co godzinę pyta o mój program?

text: Oto sytuacja: pracujesz nad swoim złożonym, zaawansowanym technologicznie kodem, a Twój szef ciągle pyta, czy jest gotowy. Ale projekt rozpoczął się dopiero wczoraj i masz dwa tygodnie przed końcem. Co mogę zrobić? Czy mam dalej odpowiadać „Jestem na tym!”? :)


title: Dlaczego interfejsy API biblioteki Pythona są bardziej intuicyjne niż interfejsy API biblioteki C++ STL?

text: Nie jestem pewien, czy jest to osobista perspektywa, czy tylko wspólne odczucie. Myślę, że w większości przypadków API Pythona jest znacznie bardziej intuicyjne niż API biblioteki C++ STL. Jeśli nie jest to subiektywna ocena, czy ktoś mógłby wyjaśnić dlaczego?


title: Czy ważna jest indywidualna własność kodu?

text: Jestem w trakcie sporu z niektórymi współpracownikami o to, czy własność zespołowa całego kodu jest lepsza niż indywidualna własność jego składników. Jestem wielkim zwolennikiem przydzielania każdemu członkowi zespołu mniej więcej równej części kodu. Pozwala ludziom być dumnym ze swojego dzieła, daje wykrywaczom błędów oczywiste pierwsze miejsce do przypisywania przychodzących biletów i pomaga złagodzić „syndrom zepsutego okna”. Koncentruje również wiedzę na temat konkretnej funkcjonalności z jednym (lub dwoma) członkami zespołu, co znacznie ułatwia naprawę błędów. Przede wszystkim decyduje o ważnych decyzjach jedna osoba, która ma duży wkład, a nie komisja. Nie opowiadam się za żądaniem zgody, jeśli ktoś inny chce zmienić twój kod; być może, aby przegląd kodu był zawsze dla właściciela, jasne. Nie sugeruję też budowania silosów wiedzy: nie powinno być nic wyłącznego w tej własności. Ale kiedy sugerowałem to moim współpracownikom, dostałem mnóstwo odpowiedzi, z pewnością znacznie więcej, niż się spodziewałem. Pytam więc społeczność: jakie są wasze opinie na temat pracy z zespołem na dużej bazie kodu? Czy brakuje mi czegoś w czujnym utrzymywaniu zbiorowej własności?


title: Czy powinienem oceniać firmę IT po wyglądzie wnętrza biura?

text: Niedawno uczestniczyłem w rozmowie kwalifikacyjnej dla firmy IT. Choć sam przebieg rozmowy kwalifikacyjnej był przyzwoity, szokowały mnie raczej złe warunki pracy i wnętrze biura. Kilka rzeczy wyróżniało się: 1. Budynek znajduje się w zacienionej części tętniącego życiem megamiasta. 2. Wnętrza nie są dobrze umeblowane. Żadnych fałszywych dachów z kanałami AC, przewodami i rurociągami rozrzuconymi losowo nad głową, żadnych kabin/biurków/przegród, żadnych odpowiednich sal konferencyjnych. 3. Miejsce pracy miało nieprzyjemny zapach. 4. Sam wywiad został przeprowadzony w prowizorycznym pokoju - dla mnie prawie wyglądał jak bezpieczna szafka w banku. Kiedy zapytałem, czy są w trakcie remontu lokalu, usłyszałem: „Nie, tak zawsze było”. Właściwie, jeśli wierzyć własnym uszom, wspomniał, że budynek był kiedyś stodołą, zanim zajęła go firma informatyczna. Czy naprawdę powinienem się martwić o wszystkie te aspekty mojego następnego pracodawcy? Czy nie wskazuje to wyraźnie, że nie mają wystarczających środków i odsetek na poprawę własnego miejsca pracy?


title: Wyciąganie głównego artykułu ze strony internetowej/kanału. Czy to jest legalne/etyczne?

text: Istnieje kilka aplikacji, takich jak Readability i Pocket, które umożliwiają użytkownikom czytanie głównej zawartości stron internetowych w przejrzystym interfejsie lub podobnym. Ale artykuły powinny być dodawane do zakładek z innej aplikacji lub przeglądarki internetowej. Jednak tworzę aplikację do czytania wiadomości (Zite i Flipboard są popularnymi aplikacjami do czytania wiadomości) i chcę stworzyć przejrzyste środowisko dla użytkowników, więc chcę wyświetlać pełną zawartość artykułów w mojej aplikacji. Niektóre strony internetowe mają kanały pełnotekstowe i korzystam z nich. Ale jeśli chodzi o inne strony internetowe, które nie mają pełnych kanałów tekstowych: Chcę wiedzieć, czy używanie na przykład Readability API (lub może napisanie własnego kodu) do wyświetlania pełnego tekstu artykułów w mojej aplikacji jest legalne/etyczne ?


title: Czy można używać adresu e-mail jako identyfikatora w URI RESTful?

text: Współpracuję z zespołem budującym usługę sieciową RESTful, a nasza obecna implementacja wykorzystuje adres e-mail użytkownika jako unikalny identyfikator zasobu użytkownika, uzyskując identyfikatory URI takie jak: `https://www.domain.com/users/example @gmail.com/resource` Wiadomości e-mail są unikatowe w naszym systemie, a my poradziliśmy sobie ze zmianą adresu e-mail użytkownika, więc wydaje się, że jest OK. Ale czy to jest _poprawne_? Dyskusja dotyczy tego, czy zamiast tego powinniśmy użyć niezmiennego identyfikatora użytkownika, który w naszym przypadku wyglądałby bardziej jak: `https://www.domain.com/users/a36571b87be464728c8d/resource` A może coś zupełnie innego. Na przykład kilka interfejsów Google API po prostu używa `/users/me/resource` i identyfikuje użytkownika za pomocą danych uwierzytelniających. Krótko mówiąc, czy dopuszczalne jest używanie unikalnego, ale zmiennego identyfikatora w naszych identyfikatorach URI, czy też powinniśmy używać niezmiennego? Dziękuję!


title: Wolniejsza odpowiedź Ajax

text:
Czy umieszczenie logiki widoku wewnątrz kontrolera zwiększa szybkość ładowania strony? Ponieważ mam akcję kontrolera wywołującą widok, który ładuję przez ajax i otrzymuję bardzo powolną odpowiedź. Dlaczego tak się dzieje? Czy umieszczenie logiki widoku wewnątrz kontrolera, jak... echo "
View echoed
" to dobry sposób na kodowanie? czy to zwiększa wydajność? Napisałem akcję kontrolera, taką jak klasa Ajax extends CI_Controller{ foo ($id){ $data = $this->model->get_data();//ma sprzężenia w zapytaniu $this->load->view($data) ; } } W związku z tym użyłem dwóch zagnieżdżonych pętli foreach, aby uzyskać tabelę mającą około 100 wierszy i ładuję widok przez żądanie jquery ajax do adresu url ajax/foo/1 Moje pytanie wyraźnie brzmi, czy jest to dobra praktyka view-logika do kontrolera dla wywołań ajax? czy zwiększy to prędkość ładowania strony. Jestem nowy w bardzo profesjonalnym kodowaniu. Czy to dobra i profesjonalna metoda, czy jakakolwiek inna dostępna alternatywa.


title: Przejścia Epsilon w NFA

text: Próbuję nauczyć się podstaw automatów skończonych i badam różnice między deterministycznymi automatami skończonymi a niedeterministycznymi automatami skończonymi. Jedną z rzeczy, która pojawia się dość często w przykładach on-line, slajdach z wykładów i filmach różnych instruktorów CS, jest przejście epsilon. Problem polega na tym, że żaden z nich nie bardzo dobrze wyjaśnia przejścia epsilon. Po prostu wyskakują je znikąd jako ta tajemnicza właściwość, która pozwala ci przeskakiwać z jednego stanu do drugiego bez czytania znaku wejściowego. OK. Rozumiem, ale w jaki sposób te arbitralne skoki są semantycznie ułatwione, gdybyśmy mieli stworzyć te automaty? Weźmy na przykład obrazek poniżej. Powiedzmy, że jesteśmy w S0, są dwa przejścia epsilon do s1 i s4. Jak decyduje się, który z nich zejść. Jeśli przejdziesz do S1 i nie masz a, czy możesz się cofnąć i spróbować b? Mówię to, ponieważ strzałki zdają się tego nie wywnioskować. A może źle to sobie wyobraziłem, czy automaty rzeczywiście mogą znajdować się w obu stanach S1 i S2 jednocześnie? Również s3 i s6 mają przejścia epsilon do s7, więc dlaczego nie mamy zamiast tego dwóch akceptujących stanów S3 i s4? Wreszcie S2 ma dwie ścieżki, które reagują na a, s5 ma dwie ścieżki, które reagują na b. Jak to działa w praktyce. Jak określana jest ścieżka, którą należy podążać? Odpowiadając, postaraj się ograniczyć użycie matematyki ezoterycznej, a jeśli używasz operatorów i symboli, wyjaśnij je jasno. Nie jestem geniuszem matematyki. ![NFA z przejściami Epsilon](http://i.stack.imgur.com/qUDyA.png)


title: Kiedy „klonowanie”, a nie ponowne używanie, jest akceptowanym rozwiązaniem projektowym modułu?

text: Na to pytanie podam przykładowy moduł, aby ułatwić dyskusję. Załóżmy, że moduł jest silnikiem obliczeniowym, który obecnie obsługuje swoje przeznaczenie dla obecnych odbiorców. Wymagane jest **sklonowanie** tego samego silnika, ale z pewnymi **poprawkami** dla zupełnie nowych odbiorców. Biorąc pod uwagę to, że są to czynniki/czynniki, które będą miały wpływ na rozwiązanie projektowe: 1. Użytkownik oczekuje, że obecny silnik pozostanie **niezmieniony** , ponieważ nie jest to część wymagań (zauważ, że nowy silnik jest przeznaczony dla nowych odbiorców i nie ma wpływu na użytkowników obecnego silnika). 2. Oprócz #1, oczekuje się **braku testowania regresji** dla bazy kodu obecnego silnika, ponieważ nie wprowadzono żadnych zmian. 3. Tylko w celu osiągnięcia celu, refaktoryzacja obecnego silnika, aby uczynić go elastycznym w zakresie obsługi zarówno obecnych, jak i nowych silników, nie będzie podaną opcją, która nie spełni dwóch powyższych punktów. 4. Możemy się spodziewać, że w przyszłości nastąpią **wyłączne zmiany** dla każdego silnika, tj. zmiana dotyczy tylko nowego silnika, dlatego nie powinna wpływać na obecny. 5. Napięty termin. Jednak nadal jestem skonfliktowany, ponieważ: 1. Z natury będzie to rozwiązanie typu kopiuj-wklej. 2. Zduplikuj kod. 3. Problem z utrzymaniem zmian w kodzie, które powinny być wspólne dla obu. 4. Nie rozwiązuje kwestii rozszerzenia, czyli tzw. trzeci silnik i tak dalej wszystko może być możliwe. Czy **kompromis** jest akceptowalny w tej sytuacji, biorąc pod uwagę powyższe oczekiwania użytkowników? I pytanie uzupełniające, czy mogę dodać coś do rozwiązania, które rozwiąże sprzeczne problemy, ale jednocześnie spełni wymagania użytkownika?


title: Jak uniknąć pełzania funkcji w solowym projekcie?

text: Mam więc program, nad którym pracowałem w 2011 roku i przez cały 2012 rok, ale ostatnie wydanie miało miejsce w grudniu _2011_. Aktywnie nad tym pracowałem, ale pełzanie funkcji zwabiło jego brzydką głowę i teraz jest wypełniony tonami niedokończonych funkcji. Złą częścią jest to, że gdy implementuję funkcję, wkrada się nowa. Co mogę zrobić, aby uniknąć pełzania funkcji w przyszłości, abym mógł **właściwie wydać wydanie** w ciągu _roku_? Projekt jest oparty na systemie iOS i miał wydania wokół każdej aktualizacji wersji iOS, ale ostatnia powróciła w wersji 5.1 (2011). Chciałbym móc odzyskać ten stały cykl wydawniczy, ale okazało się to zbyt trudne.


title: Określanie, czy algorytm to O (log n)

text: Odświeżam moją teorię CS i chcę wiedzieć, jak zidentyfikować złożoność algorytmu O (log n). W szczególności, czy istnieje łatwy sposób na jego identyfikację? Wiem, że z O(n) zwykle masz pojedynczą pętlę; O(n^2) to podwójna pętla; O(n^3) to potrójna pętla itd. A co z O (log n)?


title: Jakich osobistych kamieni milowych możesz użyć do pomiaru rozwoju swoich umiejętności programistycznych?

text: Jak z czasem obiektywnie określić, że robisz się coraz lepszy w tworzeniu kodu? Na przykład mogę tu siedzieć i czuć, że „teraz znam `<język>` i używam teraz `<technika>`, więc muszę być lepszy”. Ale to nie wyjaśnia moich własnych uprzedzeń ani faktu, że mogę być coraz lepszy w wolniejszym tempie, niż zamierzałem, lub mogę faktycznie ssać w „<technice>” i nie zdawać sobie z tego sprawy. Jakie metody są dostępne, aby **obiektywnie** ocenić własne umiejętności? A co z obiektywnym porównaniem ich z ich grupami rówieśniczymi?


title: Dlaczego oprogramowanie wciąż jest wydawane ze znanymi błędami?

text: Wydaje się, że często w dużych projektach oprogramowanie jest nadal wypuszczane z narzędziem do śledzenia błędów pełnym błędów. Teraz rozumiem prośby o nowe funkcje, ale kilka razy widziałem dużą liczbę błędów wciąż nierozwiązanych, niesprawdzonych lub nieukończonych, ale wydanie jest nadal wypychane. Czemu? Dlaczego projekt open source lub projekt w ogóle miałby zostać wydany z **znanymi** błędami? Dlaczego nie mieliby czekać, aż bug tracker będzie miał 0 otwartych błędów?


title: W jaki sposób Go poprawia produktywność dzięki „niejawnym” interfejsom i jak to się ma do pojęcia metod rozszerzających w języku C#?

text: W samouczku języka Go wyjaśniają, jak działają interfejsy: > Go nie ma klas. Można jednak zdefiniować metody na typach struktur. > _Odbiornik metody_ pojawia się na swojej własnej liście argumentów między słowem > func > a nazwą metody. type Vertex struct { X, Y float64 } func (v *Vertex) Abs() float64 { return math.Sqrt(v.X*v.X + v.Y*v.Y) } > Typ interfejsu jest definiowany przez zestaw metod. Wartość typu interfejsu > może zawierać dowolną wartość, która implementuje te metody. To jedyny sposób na stworzenie interfejsu w Go. Google dalej wyjaśnia, że: > Typ implementuje interfejs poprzez implementację metod. Nie ma > wyraźnej deklaracji intencji [tj. deklaracje `interfejsu`]. > > Niejawne interfejsy oddzielają pakiety implementacyjne od pakietów, które > definiują interfejsy: żaden z nich nie zależy od drugiego. > > Zachęca również do definiowania precyzyjnych interfejsów, ponieważ nie musisz > znajdować każdej implementacji i oznaczać jej nową nazwą interfejsu. To wszystko brzmi podejrzanie jak Metody rozszerzające w C#, z wyjątkiem tego, że metody w Go są bezwzględnie polimorficzne; będą działać na _dowolnym typie_, który je implementuje. Google twierdzi, że to zachęca do szybkiego rozwoju, ale dlaczego? Czy rezygnujesz z czegoś, odchodząc od jawnych interfejsów w C#? Czy metody rozszerzające w C# mogą umożliwić czerpanie niektórych korzyści, jakie interfejsy Go mają w C#?


title: Wydawanie źle napisanego oprogramowania

text: Zrobiłem słabo napisaną, ale w pełni działającą stronę internetową, w _(szok, przerażenie, szok)_ PHP. Wszystko działa zgodnie z oczekiwaniami, zaimplementowałem niezbędne zabezpieczenia: http://php.net/manual/en/security.php i phpsec.org/projects/guide/ Jest kiepsko napisany w tym sensie, że to garść funkcji zestawione razem, które robią coś… co dziwne, byłem zgodny z konwencją nazewnictwa. Czy wypuściłbyś coś, z czego nie byłeś zadowolony, ale zadziałał? Chciałbym również zwrócić uwagę, że nie zbieram zbyt wielu informacji o użytkowniku (nazwy użytkownika, adresu e-mail i hasła) o to - ale tak naprawdę nie martwię się o bezpieczeństwo, to kod spaghetti, który napisałem.


title: Jaki język jest najbardziej podobny do JavaScript?

text: Szukam języka, który 1. ma funkcje pierwszej klasy 2. jest dynamiczny 3. ma prototypowe dziedziczenie 4. nie ma zbyt wielu funkcji (tj. jest łatwy do napisania i napisania pierwszego programu). Od dłuższego czasu programuję w JavaScript i bardzo mi się to spodobało. Czy istnieją inne języki o podobnym wyglądzie? Edytuj (tylko kilka wyjaśnień) Znam trochę c#. Po programowaniu w węźle js naprawdę zacząłem doceniać javascript i łatwość jego użycia. Jednak poza tworzeniem stron internetowych javascript jest niewystarczający. Jasne, że istnieją biblioteki takie jak app.js, które pozwala na programowanie pulpitu, ale to wszystko. Dlatego szukałem bardziej ogólnego języka skryptowego, który ma wyżej wymienione funkcje. Wymieniłem te funkcje, aby pytanie było bardziej zgodne z zasadami wymiany stosu, w przeciwnym razie prawdopodobnie byłoby Zamknięte.


title: Ćwiczenie wdrażania wzorców projektowych

text: Zacząłem studiować wzorce projektowe, korzystając z kursu pluralsight i książki o gangu czterech. Chociaż czuję, że rozumiem to, czego do tej pory się uczyłem, myślę, że byłoby bardzo pomocne, gdybym miał jakiś sposób na ich praktykowanie. Wiem, że dostanę szansę na czas, ale czuję, że lepiej zrozumiem każdy wzorzec projektowy, jeśli wykonam dla każdego z nich kilka ćwiczeń. Chciałbym, żeby ktoś znał jakieś strony internetowe lub dokumenty, które zawierają ćwiczenia do wdrażania wzorców projektowych. Szczególnie interesują mnie te, w których autor podaje trochę kodu źródłowego i problem do rozwiązania i muszę zaimplementować wzorzec projektowy, aby go rozwiązać. nie interesują mnie przykłady i teoria; Mam to już pokryte z tego, co czytam.


title: Dlaczego w testach jednostkowych miałbym dwukrotnie utworzyć repozytorium?

text: Któregoś dnia czytałem trochę o testowaniu jednostkowym i widziałem kilka przykładów, w których ludzie tworzą interfejs repozytorium (tj. `IExampleRepository`), a następnie tworzą prawdziwe repozytorium (`klasa publiczna ExampleRepository : IExampleRepository`) i repozytorium do wykorzystania testowanie jednostkowe (`FakeExampleRepository : IExampleRepository`). W `IExampleRepository` implementowali te same metody, co w `ExampleRepository`, jednak z różnymi zapytaniami Linq. Jaki jest dokładnie cel tutaj? Myślałem, że jedną z części testów jednostkowych twojego kodu jest upewnienie się, że metoda działa poprawnie? Ale kiedy używam dwóch zupełnie różnych zapytań, jednego dla „prawdziwego”, a drugiego w teście, jaki sens ma ten test?


title: Recenzje kodu, jakie są zalety?

text: W moim zespole nie robimy formalnych przeglądów kodu. Wydaje nam się, że często wystarczy programowanie i rotacja par. Czy powinniśmy rozważyć przeprowadzenie formalnych przeglądów kodu? Jakie byłyby zalety?


title: Projekt interfejsu do wyszukiwania czegoś lub listy

text: Opracowuję model rozmowy telefonicznej i zastanawiam się, jak najlepiej zaprojektować interfejs. Jednym z podstawowych pomysłów jest to, że połączenie ma unikalny identyfikator połączenia. Mam listę połączeń i znalezienie konkretnego połączenia jest łatwe dzięki callid. Każde połączenie ma zero lub więcej stron. Strona posiada identyfikator urządzenia (np. numer wewnętrzny 201) i stan. Np. mój numer wewnętrzny 201 może być alarmujący lub ustanowiony lub cokolwiek innego. Mam klasę do reprezentowania połączenia, która ma funkcje do znalezienia uczestnika połączenia, mam następujące funkcje findxxx: party* find_party_by_dn(const std::string& dn) const; int find_parties_by_dn(const std::string& dn, std::list<party*> pties) const; find_party_by_dn wydaje się być w porządku, ale ma problem polegający na tym, że połączenie może mieć 2 strony z tym samym identyfikatorem urządzenia. Np. użytkownik może zawiesić połączenie i wykonać nowe połączenie konsultacyjne z innym urządzeniem. W takim przypadku połączenie ma na przykład stronę z numerem dn 201 w stanie wstrzymania i inną stronę z numerem dn 201 i wybieraniem stanu. Więc jeśli użyję funkcji find_party_by_dn, tylko pierwsza strona na liście z tym dn zostanie zwrócona. Więc pomyślałem ach, dlaczego nie zwrócić (dobrze przez referencję) listy imprez o danym dn. Stąd druga funkcja. Czy to wydaje się przydatnym interfejsem? Czy można to poprawić? Mam też te funkcje: party* find_party_by_state(const std::string& dn, pstate state) const; party* find_party_by_states(const std::string& dn, int states) const; W takim przypadku osoba wywołująca musi określić konkretny stan lub liczbę stanów - np. stan1 | state2 Szukam opinii na temat tego interfejsu. Czy to wydaje się logiczne? Czy można go ulepszyć, aby był bardziej przyjazny dla użytkownika lub solidny?


title: Wdrażanie automatycznych aktualizacji

text: Jaki jest najlepszy sposób na wdrożenie automatycznych aktualizacji? Doszedłem do libcurl, wyobrażam sobie, że muszę od czasu do czasu pingować serwer z aktualną wersją oprogramowania. Ale co mam zrobić? Jaka technologia serwerowa musi odpowiedzieć i jak?


title: Pisanie testów opartych na odbiciach opartych na danych w celu zapewnienia kompletności projektu

text: Kiedy piszę oprogramowanie, często jestem zmuszony w pewnym momencie podjąć decyzję, która obejmuje wzorce projektowe polegające na nazewnictwie „zgodnie z konwencją” i wzorcach zachowań. Zwykle sprawia to, że jako programista .NET czuję się trochę ślisko, ponieważ prawie wszystko jest typowane statycznie (prawdopodobnie nawet typ dynamiczny jest typowany statycznie, ale inni dobrze to omówili, idź czytać ich blogi, będą ci za to wdzięczni). Spotkałem innych o odmiennych poglądach, którzy uważali, że w wielu przypadkach nazewnictwo oparte na konwencjach i wzorce zachowań są rzeczywiście pomocne, ponieważ pozwalają na czystszy, bardziej czytelny i spójny kod. Stwierdzono nawet, że w zależności od tego, jak daleko ta konwencja jest zastosowana, na przykład w scenariuszu zachowania z określeniem odbicia typu, może to nawet wymusić dobre nazewnictwo poprzez złamanie funkcjonalności, jeśli nazewnictwo jest niezgodne z ustalonymi konwencjami. Wszystko to doprowadziło mnie do miejsca, w którym umiera miłość i pasja do rozwoju, „Testowanie”. Postawiłem następującą hipotezę: > Stosując konwencje nazewnictwa i związane z nimi reguły behawioralne lub strukturalne > związane z tymi konwencjami, powinno być możliwe pisanie testów > produktu, który wymusza, aby zachowania i struktury powiązane z nazwami > były poprawnie implementowane poprzez odzwierciedlenie dostępne docelowe pliki binarne. > Co więcej, powinno być również możliwe egzekwowanie projektu przez konwencję, który nie pozwala na nadużywanie konwencji nazewnictwa poprzez posiadanie nazw, które podlegają konwencjom nazewnictwa, które nie są zgodne z tymi samymi regułami behawioralnymi lub strukturalnymi być użyte niewłaściwie (tj. coś > ze słowem Locator w nazwie typu, które nie implementuje usługi > wzorzec lokalizatora). Czy ktoś kiedykolwiek badał tego rodzaju testy i sprawdzalność architektury i projektu? Jakie masz doświadczenia z pisaniem testów architektury i konwencji? Z jakimi wyzwaniami się zmierzyłeś i jakie rozwiązania wymyśliłeś? Czy istnieją ramy lub narzędzia do tego? Czy przeprowadzono badania na ten temat, które zostały zrecenzowane?


title: Jak mogę napisać HTML, CSS i JavaScript, aby ułatwić pracę programistom zaplecza?

text: Kiedy dostaję projekt od projektanta, otrzymuję go jako plik PSD (Photoshop). Zawsze oczekuję odpowiednich nazw warstw i folderów, w zasadzie czystego i zarządzanego pliku PSD. Od tego projektu zajmuję się tworzeniem HTML, CSS i JavaScript oraz dostarczam je programistom back-endowym. Aby ułatwić im zrozumienie, * piszę kod semantyczny, * przechowuję JavaScript i CSS w plikach zewnętrznych, * dodaję przydatne komentarze w plikach HTML, CSS i JS, * używam sprite'ów CSS (choć deweloperom to się nie podoba), * używaj kotła HTML5, * używaj jQuery dla JavaScript, * staraj się używać nowych tagów HTML5 i CSS3 tam, gdzie to możliwe i * wyślij plik Zip zawierający HTML, CSS, JS i obrazy. Spodziewam się, że jeśli trzeba będzie dokonać drobnych zmian w układzie, programiści sobie z tym poradzą. Chciałbym usłyszeć od backendowców i innych ninja CSS, co jeszcze można zrobić w zakresie organizacji plików i znaczników, aby ułatwić integrację z systemami backendowymi (tj. technologiami backendowymi, PHP, .NET , Ruby itp.) Różne klienty używają różnych systemów.


title: Czy istnieją ogólne zasady lub najlepsze praktyki tworzenia nowych ram?

text: Muszę rozpocząć projektowanie i rozwój nowego frameworka do interakcji z open source ECM. Obejmuje to dostosowany model danych, który pomaga twórcom witryn internetowych w interakcji z tym ECM, dzięki czemu nie muszą się przejmować szczegółami manipulacji węzłami i innymi szczegółami niskiego poziomu. To tylko kilka klas i metod do opracowania. Mam pewne wątpliwości co do tego, jak poradzić sobie z organizacją i zarządzaniem tym projektem: Czy są jakieś ogólne zasady, których należy przestrzegać, wskazówki, najlepsze praktyki lub coś, o czym należy pamiętać przy rozwijaniu tego rodzaju projektu? Jestem pewien, że istnieje pewna różnica między rozwojem frameworka lub biblioteki a aplikacją.


title: „Extends is evil” a OCP?

text: O ile zrozumiałem(?), idea „Rozszerza jest zła” jest w bezpośredniej opozycji do zasady otwartego zamkniętego? W tym miejscu koncepcja OCP jest przedstawiona jako nieodłącznie przy użyciu Extends: http://www.oodesign.com/open-close-principle.html Podczas, na przykład w tym artykule, akt rozszerzenia jest uważany za przestępstwo śmierci? http://www.javaworld.com/javaworld/jw-08-2003/jw-0801-toolbox.html?page=1 Jaki jest właściwy sposób na zapewnienie zarówno OCP, jak i nieużywania Extends? Rozważmy prostą klasę BulletinBoard, która ma Posty, które mogą być zarówno NewsPosts, jak i GuestbookPosts z różnymi właściwościami, ale tymi samymi metodami/zachowaniem.


title: Jak zastosować jedną z koncepcji OOP (zamknięte na modyfikację i otwarte na rozszerzenie)?

text: Kilka dni wcześniej stworzyłem klasy Question, Quiz i Main. Jeden quiz zawiera jedno lub więcej pytań. Z klasy głównej najpierw tworzę obiekty Question (konstruktor przyjmuje tablicę liczb). Quiz jest taki, jak gdy wyświetlam pytania, pomijam ostatnią liczbę w tablicy, a użytkownik spróbuje ustalić tę liczbę. Następnie z Main stworzyłem Quiz Object. Z Main wywołuję tylko metody klasy Quiz, az Quiz Class wywołuję tylko metody z klasy Question. Następnie stworzyłem również aplikację internetową (z JSP i Servlets), która używa tych samych klas Question i Quiz, ale nie Main. Zamiast Main do wyświetlania danych użyłem JSP i Servletów. Więc bez modyfikowania klas modeli (Quiz i Pytanie) jestem w stanie używać ich z innych aplikacji. Ale teraz muszę dodać PODPOWIEDŹ, która da użytkownikowi wskazówki na każde pytanie. Jeśli przejdę i zmodyfikuję te 2 klasy modeli, złamię zasadę Open-Close. Jeśli mam zamiar utworzyć klasę o nazwie Podpowiedź (jedna podpowiedź na pytanie) i rozszerzyć ją z klasy pytań, nie ma to sensu, ponieważ podpowiedź nie jest pytaniem. Ale pytanie ma podpowiedź. Czy możesz poinstruować, jak mieć WSKAZÓWKĘ w mojej aplikacji, abym mógł korzystać z poprzednich klas bez modyfikacji i naruszania jakichkolwiek koncepcji OOP?


title: Jakie są odłączone scenariusze w Entity Framework?

text: Nie jestem pewien, czy rozumiem, co wszystkie mieszczą się w scenariuszach rozłączonych kontekstów w EF (zobacz to i to). Ten link mówi, że użyj internetowego interfejsu API lub usług WCF, aby uniknąć złożoności rozłączonych rozwiązań EF w warstwie. Oto moje zrozumienie. Jeśli utworzę nowy DbContext, pobiorę jakieś encje, przekażę je do innego procesu/maszyny (cokolwiek poza zakresem bieżącego kontekstu), a tam dokonam pewnych zmian w tych encjach i spróbuję je zapisać, to jest to odłączony scenariusz . EF nie będzie wiedział, czy jest to dodanie lub aktualizacja, ani jakie pola uległy zmianie, chyba że wyraźnie to powiem. Załóżmy, że mam aplikację MVC z UserController. UserController pobiera IUsserService przez iniekcję zależności. UserService, konkretna implementacja IUserService przyjmuje UnitOfWork. Mój DbContext jest tworzony dla UnitOfWork, a SaveChanges() jest wywoływana tylko w Commit() UnitOfWork. Ustawiłem też czas życia DbContext w Unity jako PerRequestLifetime -> co oznacza, że dla każdego HttpRequest tworzona jest jedna instancja. My UserService współpracuje z różnymi podmiotami wymaganymi do wykonywania swojej pracy. Uważam, że to nie jest oderwany scenariusz, **ponieważ mój kontekst jest taki sam przez cały czas**? Jeśli mój kontroler MVC znajdował się na jednej maszynie (sieci), a usługa UserService na innej maszynie (aplikacja — punkty końcowe http uwidocznione przy użyciu webapi), czy coś się zmieni? W tym przypadku potrzebuję DbContext tylko zaczynając od ApiController i wszystko pozostanie w warstwie aplikacji. Dlatego nadal unikam rozłączonych kontekstów. Czy mam rację? Jeśli nie mam jasności, mogę umieścić jakiś kod, ale nic się tam nie zmieni.


title: Czy to zły pomysł, aby zwracać różne typy danych z jednej funkcji w dynamicznie typowanym języku?

text: Pochodzę ze statycznie wpisanego języka (Java). W Javie musisz zwrócić jeden typ z każdej metody. Na przykład nie możesz mieć metody, która warunkowo zwraca `String` lub warunkowo zwraca `Integer`. Ale na przykład w JavaScript jest to bardzo możliwe. W statycznie pisanym języku rozumiem, dlaczego to zły pomysł. Jeśli każda metoda zwróciła `Object` (wspólny rodzic, z którego dziedziczą wszystkie klasy), to ty i kompilator nie macie pojęcia, z czym mamy do czynienia. Będziesz musiał odkryć wszystkie swoje błędy w czasie wykonywania. Ale w dynamicznie typowanym języku może nawet nie istnieć kompilator. W języku dynamicznie typowanym nie jest dla mnie oczywiste, dlaczego funkcja zwracająca wiele typów jest złym pomysłem. Moje doświadczenie w językach statycznych sprawia, że unikam pisania takich funkcji, ale obawiam się, że jestem blisko związany z funkcją, która może sprawić, że mój kod będzie czystszy w sposób, którego nie widzę. * * * **Edytuj** : zamierzam usunąć swój przykład (dopóki nie wymyślę lepszego). Myślę, że to skłania ludzi do odpowiedzi na punkt, którego nie próbuję poruszyć.


title: Dlaczego sugeruje się, że historie mają długość 2-3 dni?

text: Jeśli sprinty trwają średnio 10 dni, dlaczego często sugeruje się, aby historie miały długość 2-3 dni? **Pytanie pokrewne:** Jak radzić sobie z elementami zaległości, które są dłuższe niż jeden sprint?


title: Czy złą praktyką jest używanie narzędzi projektanta GUI z generowaniem kodu do programowania aplikacji w Java/C++?

text: W pytaniu stackOverflow przeczytałem, że używanie programu do projektowania GUI może generować dużo niechlujnego kodu i jest uważane za złą praktykę, chyba że tworzysz mniejsze programy. Moje pytanie brzmi: dlaczego i jak. Czy korzystanie z programu do projektowania GUI jest złe? Czemu? Dodatkowe szczegóły: * Programowanie na platformie Windows; * Tylko programowanie w C++/Java dla programów windowsowych. * W przypadku IDE używam Visual Studio 2010 (nie edycji ekspresowej), ponieważ jest dostarczane z projektantem GUI.


title: Czy jest jakaś praca nad zastosowaniem miar złożoności Halsteada do określenia jakości oprogramowania?

text: W 1977 Maurice Howard Halstead przedstawił swoje miary złożoności dla systemów oprogramowania, które obejmowały pomiary słownictwa programu, długości programu, objętości, trudności, wysiłku i szacunkowej liczby błędów w module. Według Wikipedii trudność odnosi się do trudności w zrozumieniu programu podczas czytania lub pisania go, a wysiłek można przełożyć na czas potrzebny do zakodowania aplikacji, gdzie czas = (wysiłek / 18) sekund. Pomiar jest bezużyteczny, chyba że dane i obliczenia odnoszą się do jakiegoś aspektu tworzenia oprogramowania. Nie znalazłem jednak żadnej pracy, w której stwierdza się, że trudność o określonej wartości lub wyższej prowadzi do statystycznie istotnego wzrostu defektów lub związku między trudnością a czasem czytania kodu (trudność N daje średnią M godzin spędzonych zrozumienie bazy kodu) lub jakąkolwiek analizę możliwości obliczenia czasu po fakcie przydatnego w określaniu jakości (zwłaszcza, że czas pisania powinien być już zarejestrowany jako pomiar). Szczególnie interesuje mnie szacowanie błędów Halsteada (o czym nie ma w Wikipedii) - liczbę błędów w aplikacji można oszacować za pomocą Volume/3000 lub Effort^(2/3)/3000. Szukam dwóch rzeczy: * Czy ktoś używał miar złożoności oprogramowania Halsteada w rzeczywistej aplikacji do oceny jakości oprogramowania? Jeśli tak, w jaki sposób je zastosowałeś i czy okazały się przydatnym, trafnym i/lub wiarygodnym pomiarem? * Czy są jakieś badania naukowe w formie ankiet, analiz lub studiów przypadków, które omawiają ważność (lub nieważność) miar złożoności Halsteada w zastosowaniu do jakości oprogramowania? * Czy są jakieś badania naukowe w formie ankiet, analiz lub studiów przypadków, które demonstrują użycie Source Lines of Code (SLOC) do obliczenia czegoś podobnego do metryk Halsteada dotyczących objętości, trudności, wysiłku, czasu i błędów? Podejrzewam, że objętość może po prostu odpowiadać liczbie SLOC, a poziom trudności może odpowiadać złożoności cyklomatycznej (i prawdopodobnie innym miarom). Doskonale zdaję sobie również sprawę z tego, że mierzenie wysiłku, produktywności lub czasu w SLOC jest potencjalnie mylące.


title: Naprawianie luki w zabezpieczeniach — ale wtedy wszyscy o tym wiedzą

text: Wcześniej otrzymałem wiadomość o potencjalnym zagrożeniu bezpieczeństwa w jednym z moich projektów. Sprawdziłem to i stwierdziłem, że pozwala na "wykonanie dowolnego kodu". (Cytaty, ponieważ działa w maszynie wirtualnej, ale szkody, które można wyrządzić, są jednak ogromne) Ponieważ jest to projekt open source, wyobrażam sobie, że inni już go znaleźli i wykorzystali. Jednak niechętnie to naprawiam, ponieważ każdy będzie mógł zobaczyć commit i wiedzieć o exploitie. Ponieważ nie mam możliwości skontaktowania się z użytkownikami ani wymuszenia aktualizacji (aktualizacje są ręczne), nie wiem, co tutaj zrobić. Jeśli pozwolę mu zostać, ludzie to wykorzystają. Jeśli to naprawię, ludzie będą to jeszcze bardziej wykorzystywać. Jak mogę postępować?


title: Czy problem z sumą podzbiorów jest NP-zupełny?

text: Jeśli dobrze wiem, problem sumy podzbiorów jest NP-zupełny. Tutaj masz tablicę n liczb całkowitych i otrzymujesz docelową sumę t, musisz zwrócić liczby z tablicy, które mogą sumować się do celu (jeśli to możliwe). Ale czy ten problem nie może być rozwiązany w czasie wielomianowym za pomocą dynamicznej metody programowania, w której konstruujemy tabelę n X t i bierzemy przypadki takie jak powiedzmy, że ostatnia liczba jest **z pewnością** uwzględniona na wyjściu, a następnie cel staje się t- a[n] . W innym przypadku, ostatnia liczba jest **nie** uwzględniona, wtedy cel pozostaje taki sam t, ale tablica ma rozmiar n-1. W ten sposób zmniejszamy rozmiar problemu. Jeśli to podejście jest poprawne, czy nie jest złożonością tego n * t, które jest wielomianowe? a więc jeśli to należy do P i także NP-zupełne (z tego co słyszę) to P=NP. Na pewno czegoś mi tu brakuje. Gdzie jest luka w tym rozumowaniu? Dziękuję,


title: Czy wszystkie odwołania do tabel obcych powinny używać ograniczeń klucza obcego?

text: Ściśle związane z: Ograniczenia klucza obcego -> tak czy nie? Zadałem pytanie na SO i skłoniło mnie to do zadania tego tutaj. Jeśli mam do wyboru odwołanie okrężne lub po prostu nieegzekwowanie ograniczenia, który jest lepszym wyborem? W moim konkretnym przypadku mam klientów i adresy. Chcę, aby adres miał odniesienie do klienta i chcę, aby każdy klient miał domyślny identyfikator adresu rozliczeniowego i domyślny identyfikator adresu wysyłki. Mogę zapytać o wszystkie adresy, które mają określony identyfikator klienta lub mogę zapytać o adres o identyfikatorze, który odpowiada domyślnym identyfikatorom adresu wysyłki lub adresu rozliczeniowego. Nie jestem jeszcze pewien, jak ograniczenia (lub ich brak) wpłyną na system jako moją aplikację i wiek danych.


title: Jako programista .NET WPF, jakie są kluczowe różnice, o których powinienem pamiętać podczas pracy z ASP.NET MVC?

text: Jestem dość doświadczonym programistą .NET na komputery stacjonarne z solidnym wyczuciem MVVM i WPF, a w przeszłości pracowałem z JavaScript, jQuery i HTML/CSS - chociaż jestem dość przestarzały i nie miałem mnóstwa doświadczenie z nowymi ramami (Angular i in.). Moje pytanie brzmi: dla każdego, kto musiał to zrobić, jakie są kluczowe problemy i różnice, o których powinienem wiedzieć podczas pracy nad projektem ASP.NET MVC? Mam ogólne wyczucie wzorca MVC i gdzie różni się on od MVVM, ale ASP.NET oszukuje mnie, wyglądając znajomo, ale z subtelnymi i nie tak subtelnymi różnicami w implementacji i wykonaniu. Pomagam z projektem ASP.NET w pracy i chociaż moja znajomość języka C# pomaga, moje nawyki dotyczące komputerów stacjonarnych wydają się być obciążeniem. Przydałyby się linki do materiałów, które mogę przejrzeć, lub zwięzłe podsumowanie tego, co muszę zmienić w swoim sposobie myślenia.


title: Oddzielenie prezentacji i logiki

text: Piszę teraz program, który umożliwi przetwarzanie danych wyrażonych w postaci wykresów. Wykresy te będą określać przebieg przetwarzania i są właściwie esencją tego programu (w sensie bycia głównym obiektem edytowanym przez użytkownika). Bardzo, _bardzo_ kuszące jest umieszczenie całego przetwarzania, przechowywania danych i prezentacji w jednej kontrolce, która będzie również wyświetlać te wykresy i obsługiwać interakcję z użytkownikiem. Z jednej strony wydaje się to naruszeniem zasady prezentacji/logiki, ale z drugiej jestem pewien, że na pewno napiszę co najmniej 2x lub 3x mniej kodu, ponieważ nie będę musiał dbać o ciągłą synchronizację pomiędzy modelami danych oraz kontrolkę, która zaprezentuje ten model (+enkapsulacja, interfejsy, klasy proxy itp.) Zastanawiam się, jak to się robi w edytorach typu Word. Czy dane wyświetlane przez kontrolkę są rzeczywiście fizycznie oddzielone od prezentera, czy też są połączone? Jeśli używasz kontrolki dokumentu Word w swoim programie, prosisz kontrolkę o wykonanie operacji na tekście, co sugerowałoby, że nie ma separacji (ale nie wiemy, jak to działa pod maską). Tak więc pytanie: czy warto oddzielić prezentację danych od logiki _nawet_ jeśli wymaga to 2x lub 3x więcej kodu, aby wszystko było spójne i zsynchronizowane? (tak, mam na myśli 2x lub 3x). * * * Dokładniej opisałem sytuację w kolejnym pytaniu: Jak oddzielić logikę od prezentacji?


title: Jak upewnić się, że metoda zakończy działanie przed ponownym uruchomieniem?

text: Jestem nowy i próbuję coś wymyślić. Mam prosty program, który wykonuje metodę, gdy nastąpi zdarzenie lub gdy mój zegar tyka. Powiedzmy, że metoda trwa 5 sekund. W ciągu tych 5 sekund mogło dojść do zdarzenia. **Co bym użył/zrobił, aby upewnić się, że moja metoda nie jest wywoływana, gdy jest już uruchomiona.** Czy jest to coś, o co nie musiałbym się martwić w prostym programie, ponieważ nie uruchomiłby się, dopóki metoda nie zostanie uruchomiona mimo to zrobione? Trochę tła i przykładu. Używam System.Windows.Forms.Timer, nie używam żadnych wątków ani niczego, a po prostu mam prostą aplikację formularza systemu Windows z zegarem, metodę do rzeczy i dwie procedury obsługi zdarzeń. Program{ public Program(){ DoCos(); Event.EventHappened += HandleEvent; } void DoCoś(){ MyTimerVariable.Stop(); InitMyTimer(); //Po prostu zrób coś, sprawdź sieć, uzyskaj dostęp do wiersza zapisu db, //coś, co w tym przykładzie zajmuje 5 sekund na przykład MyTimerVariable.Start(); } void HandleEvent(){ DoCos(); } void InitMyTimer(){ // Utwórz Timer i dodaj zdarzenie ticku Timer } void TimerTickedEvent(){ DoSomething(); } } Pominąłem kilka rzeczy z tego programu, ale chciałem tylko pokazać, jakie to proste. Właśnie myślałem o zwiększeniu wydajności, aby powiedzmy, że w trakcie wykonywania "DoSomething()" wyzwalane jest zdarzenie, nie chciałbym, aby działały dwie metody "DoSomething()".


title: Najlepsze praktyki dotyczące funkcji użytkowych

text: **Aktualizacja:** większość odpowiedzi dotyczy tego, jak napisać interfejs do owijania lub co jest dobrym opakowaniem wokół ADO. ale moje pytanie bardziej dotyczy tego, kiedy to zrobić, a kiedy nie. Nigdy nie znalazłem dobrej zasady decydowania, kiedy pisać opakowanie, a kiedy nie. Ponieważ nikt nie wysunął takiej sugestii, myślę, że recenzenci mają rację, że to pytanie nie ma ogólnej odpowiedzi i jest zbyt szerokie. Nawet w konkretnym przypadku ADONET odpowiedź może zależeć od przypadku użycia i dla większości przypadków użycia opakowanie zostało już napisane. Dapper i Orseis m.in. jak wskazuje MainMa. Chciałbym usunąć pytanie, ale nie chcę niczego drastycznie ucinać 8-) **Pytanie oryginalne** Weźmy na przykład kod wykonujący zapytanie za pomocą ADONET. var cmd = connection.CreateCommand(); cmd.CommandText = "WYBIERZ 1 Z PODWÓJNYCH"; cmd.CommandTimeout = 1000; var dataReader = cmd.ExecuteReader(); Wiele osób będzie chciało napisać to jako jednowierszowe i utworzyć kilka funkcji narzędziowych w tym przykładzie o nazwie (lub klasach rozszerzeń): var cmd = connection.CreateCommand(); Utility.SelectToReader (połączenie, "SELECT 1 FROM DUAL", 1000); Więc jakie są dobre zasady wprowadzania lub odrzucania funkcji narzędziowych? Oprócz ADONET to pytanie pojawia się przy prawie każdym frameworku.


title: Budowanie złożonych algorytmów z TDD

text: Staram się zaadoptować TDD w mojej codziennej praktyce programistycznej. Używam go w pracy bardzo efektywnie, ale mam problemy z moimi osobistymi projektami, w których używam skomplikowanych algorytmów. Konkretnym algorytmem, który każe mi zadać to pytanie, jest rozszerzony filtr Kalmana. Jest na tyle złożony, że nie mam pewności co do kodu, który napisałem, ale jest na tyle prosty, że trudno go rozbić. Mógłbym napisać test dla algorytmu z wejściem i oczekiwanym wyjściem, ale zrobię dużo thrashingu i kodowania shotguna w środku, ponieważ nie mam zaufania do tych pośrednich kroków. Jeśli pracowałeś z rozsądnie złożonymi algorytmami i używasz TDD, jakie jest twoje podejście?


title: Wzorzec projektowy dla dwukierunkowych sygnałów/zdarzeń

text: Ten problem wydaje się dość podstawowy, ale nigdy nie znałem świetnego rozwiązania. Szukam sposobu na to, aby składniki w aplikacji powiadamiały się nawzajem, będąc jak najbardziej oddzielonymi (zarówno w czasie kompilacji/kompilacji, jak i w czasie wykonywania), ale także ** unikając powiadomień cyklicznych ** w taki sposób, że składniki nie są potrzebne samołagodzenia. Tak się składa, że trafiam teraz na ten problem (po raz setny) w JavaScript, ale to jest przypadkowe. Niektóre sposoby rozdzielania obejmują: * **Wstrzykiwanie zależności (DI)**. W tym przypadku używam `require.js`, który pozwala na przykład na zastępowanie mock implementacji w testach jednostkowych poprzez tworzenie alternatywnych ustawień `require.config()`. * **Wysyłanie zdarzeń**. Np. `fooInstance.listen('ciąg akcji', barInstance.actionHandler)` * **Publikuj/subskrybuj** (aka pub/sub). Ostatnie dwa to zasadniczo warianty wzoru Observer z różnymi zaletami i wadami. Problem, który chcę rozwiązać, nie jest konkretnie rozwiązywany przez te wzorce i nie jestem pewien, czy jest to szczegół implementacji, czy też istnieje wzorzec do zastosowania: * `fooObj` wysyła komunikat (odpala zdarzenie, cokolwiek), że Właściwość `"baz"` uległa zmianie * `barObj.bazChanged()` obsługuje to zdarzenie poprzez wywołanie własnej metody `setBaz()` * `barObj.setBaz()` uruchamia zdarzenie, które zmieniło się "baz" * `fooObj. bazChanged()` obsługuje to zdarzenie ... W prawdziwym przypadku wyobraź sobie, że `fooObj` jest komponentem GUI, z suwakiem dla `"tempo"`, a `barObj` to komponent sekwencjonowania muzyki, który odtwarza partyturę. Suwak powinien wpływać na tempo sekwencera, ale partytura może zawierać zmiany tempa, więc podczas odtwarzania sekwencera powinno wpływać na pozycję suwaka. Rozwiązanie powinno być bezmodowe. Jednym ze sposobów jest dodanie strażników, na przykład: function handleTempoChanged(tempo) { if (this.tempo == tempo) return; ... } Działa to, ale wydaje się słabym rozwiązaniem, ponieważ oznacza to, że każdy program obsługi zdarzeń musi albo zakładać, że potrzebuje osłony, która jest brzydkim szablonem i często nie jest wymagana, LUB musi być świadomy innych komponentów w systemie, które umożliwić cykl. Prawdopodobnie ten punkt jest błędny, należy zawsze używać strażników, _jeśli_ program obsługi ma zamiar wywołać zmienione zdarzenie bezpośrednio lub pośrednio, ale nadal wydaje się to być logiką wzorcową. To może być jedyna odpowiedź na moje pytanie... Czy istnieje ogólny wzór postępowania z potencjalnymi cyklami, jak opisano? Zauważ, że _nie_ chodzi o synchroniczne kontra asynchroniczne; tak czy inaczej cykle mogą wystąpić. EDYTOWANE, aby odzwierciedlić spostrzeżenia komentatorów: Zdaję sobie sprawę, że można wyeliminować boilerplate za pomocą jakiegoś mixina. W pseudokodzie: class ObservablePropsMixin: // generic setter z funkcją gaurd set(propName, value): if this[propName] = value: return this[propName] = value _fire(propName, value) // ogólna metoda dodawania słuchaczy function Observe(propName, handler): _observers[propName].add(handler) // prywatna metoda wywoływania zdarzeń function _fire(propName, value): foreach obserwator w _observers[propName]: Observer.call(propName, value) ... Jest to uproszczone, aby skoncentrować się na moim pytaniu, ale prawdziwy mixin zaimplementowałby inną semantykę pubsub lub zdarzenia lub sygnału, analogicznie do dowolnej implementacji dyspozytora zdarzeń. Komponenty, które muszą być obserwatorami lub obserwowalnymi, dziedziczą/rozszerzają się z domieszki (powyżej zakłada, że w języku możliwa jest jakaś forma dziedziczenia wielokrotnego lub agregacyjnego. Można to zmodyfikować, aby działały z kompozycją, np. ObservableMixin.constructor(observedObject) zamiast używając "tego".


title: Włączanie projektantów front-end do tworzenia stron internetowych dla przedsiębiorstw

text: Tworzymy aplikację internetową z wykorzystaniem Java EE. Stos jest ciężki, wdrożenie skomplikowane, a teraz chcemy włączyć do zespołu projektanta wyłącznie CSS. Chcemy dołączyć tego projektanta bez konieczności rozumienia przez niego budowy i wdrażania naszej aplikacji. Chcemy, aby został włączony do kontroli wersji projektów. Jaki jest skuteczny sposób na umożliwienie projektantowi pracy bez kontaktu z resztą projektu? Sama praca z inspektorami przeglądarek jest niewystarczająca, ponieważ nie daje mu możliwości przesyłania obrazów.


title: Jak działają generatory liczb losowych?

text: Jestem programistą z Oregonu, obecnie pracuję jako web developer dla lokalnej firmy i tej zimy zaczynam studia na kierunku informatyka. Właśnie zastanawiałem się nad funkcją `rand()` php i zastanawiałem się, jak mógłbym ją przerobić, i wyszedłem kompletnie oszołomiony. Jak do cholery działają generatory liczb losowych?


title: Jaka jest różnica między SOAP a usługami sieciowymi?

text: Nie mieszaj się z tymi dwoma. Czy ktoś chciałby wyjaśnić różnicę (y)?


title: Opracowywanie interfejsu API JSON dla silnika Carpool

text: Opracowuję nowy zestaw metod API do carpoolingu/rezerwacji taksówki, więc jeśli programista potrzebuje stworzyć aplikację lub portal internetowy do carpoolingu, może wywołać moje API JSON. Zasadniczo ułatwiając programistom. Moje obecne API to: * `AddVehicle` * `AddJourney` * `SearchJourney` * `SubscribeToThisJourney(journey)` * `SubscriberList(journey)`, aby uzyskać listę osób, które zapisały się na tę podróż * `AcceptSubscription(subscriber)` * `AcceptedSubcriberList` * `SubscriberList` aby uzyskać listę dostawców, których subskrybuję Potrzebuję pomocy w zamianie subskrybenta na coś innego. Trudno to zapamiętać i jest mylące, gdy widzisz 3 metody, które oznaczają bardzo różne rzeczy: `SubscriberList`, `SubscribedToThisJourneyList` i `AcceptedSubscriberList`. Mylące do zapamiętania. * Jedna to lista osób, które subskrybowałem * Kto mnie subskrybował * Czyją subskrypcję zaakceptowałem Jak mogę nazwać te metody, aby były łatwiejsze do zrozumienia i zapamiętania?


title: Programowanie gier: C# czy C++?

text: Zdecydowałem, że naprawdę chcę programować gry. Tak więc pytanie brzmi, jako 18-latek, który chce nauczyć się samodzielnego programowania, jaki jest najbardziej odpowiedni język programowania między C# a C++? (Powinienem stwierdzić, że nie obchodzi mnie Unix, ponieważ uważam, że Windows nadal będzie najczęściej używanym systemem operacyjnym) Znam podstawy C++, ale nie C#. Wiem, że C++ ma więcej przewodników samouczków, bibliotek dll i podobnych rzeczy, podczas gdy C# nie, ale znacznie łatwiej jest się go nauczyć i używać dla jednej osoby do opracowania programu, ale czytałem, nawet jeśli program jest zaciemniony łatwo jest znaleźć jego źródło. Cóż, najpierw chciałbym skupić się na podstawach, muszę powiedzieć, że wolę C++ tylko dlatego, że jest dla mnie bardziej odpowiedni, ale muszę wziąć pod uwagę, że pracuję sam. Więc nawet jeśli mi się to podoba, może to nie być najlepsza rzecz do zrobienia. Naprawdę nie jestem pewien, który wybrać, przeczytałem wiele wątków na różnych stronach internetowych i wygląda na to, że C# staje się coraz bardziej popularny niż C++. Ale tak, powiedziałem też, że chcę programować gry. Więc muszę znać kilka lepszych punktów niż tylko "C# jest łatwiejszy ze względu na obsługę pamięci .net, podczas gdy C++ nie jest", ponieważ nie mogłem go po prostu znaleźć.


title: Schemat DB do pakowania produktów / usług w jedną cenę / Oferta

text: Staram się „wyobrażać” logikę biznesową tej witryny, która ma wiele działań, że użytkownicy mogą budować swoje „combo” i uzyskiwać zniżki w zależności od swoich wyborów i tego, jak długo są gotowi zapłacić za swój plan (1, 3 , plany na 6 i 12 miesięcy). Trudno mi wymyślić rozwiązanie, zachowując normalizację bazy danych i odpowiednie relacje, bez konieczności uciekania się do danych zakodowanych w formacie JSON w polach bazy danych. System musi pozostać wystarczająco ogólny, aby pasował do wielu typów firm, które opierają się na planach/działaniach. **Muszę wiedzieć, jak wykonać strukturę moich tabel**. Scenariusz: Na przykład w przypadku siłowni będzie kulturystyka, joga, boks, body pump. Jeśli osoba wybierze kulturystykę i boks, otrzyma zniżkę, jeśli doda jogę, boks i kulturystykę zachowa zniżkę, ale doda jogę bez żadnej zniżki do ceny, ale jeśli osoba zdecyduje się zapłacić 12 miesięcy z góry, dostanie większy rabat. Kulturystyka + Body Pump * `Kulturystyka...70 USD | 28% rabatu` * `Body Pump....70$ |` * `Razem.........100$` * `1 miesiąc - 100$/miesiąc` * `3 miesiące - 91$/miesiąc` * ` 6 miesięcy - 75 $ / miesiąc ` Kulturystyka + Body Pump + Joga * ` Kulturystyka.. 70,00 $ | 28% rabatu` * `Pompka do ciała.....70,00zł |` * `Joga..........90,00zł | Bez rabatu` * `Razem.........190$` * `1 miesiąc - 190$ / miesiąc` * `3 miesiące - 171$ / miesiąc` * `6 miesięcy - 158$ / miesiąc` Będę używał PHP i MYSQL, ale to nie ma większego znaczenia, tylko część RDBMS. * * * **Edytuj w celu wyjaśnienia:** To, czego naprawdę szukam, to DB Schema for Packaging produktów (lub w tym przypadku usług) razem w ramach jednej ceny\Oferta. Każdy produkt musi również istnieć w systemach jako samodzielny produkt. Nadal potrzebuję możliwości raportowania sprzedaży (i zysku) według produktu, nawet jeśli ten produkt był sprzedawany jako część pakietu. Potrzebuję możliwości raportowania wydajności pakietu.


title: Posiadanie opcji kodów błędów w bibliotece C++ dla wydajności

text: Napisałem otwartą i wieloplatformową bibliotekę plików C++, która ma kody wyjątków i błędów. Wyjątki można wyłączyć, gdy program jest uruchomiony. W takim przypadku użytkownik musi sprawdzić kody błędów. Oczywiście po włączeniu zgłaszania wyjątków kod błędu nie zostanie zwrócony, ponieważ wyjątek jest zgłaszany przed zwróceniem wywołanej funkcji. Obecnie wyjątki nadal mogą być zgłaszane po wyłączeniu (błąd). Wkrótce to naprawię. Ktoś mi powiedział, że za zły projekt uważa się posiadanie zarówno kodów wyjątków, jak i błędów. Zgadzam się z nim i mam zamiar usunąć kody błędów i sprawić, że biblioteka wyrzuci niestandardowe wyjątki z większą ilością informacji o błędach. Ale waham się. Podoba mi się to hybrydowe podejście ze względu na wydajność. Właśnie o tym myślę: zachowywanie zgłaszania wyjątków i kodów błędów, ale zgłaszanie wyjątków jest wyłączane przez makro w czasie kompilacji zamiast w czasie wykonywania. Jeśli użytkownik zdefiniuje następujące elementy we wspólnym pliku konfiguracyjnym #define ELMAX_EXCEPTION 1 Poniższy kod int Write(std::wstring str) ELMAX_THROW_OR_NOT; rozwinie się do jednego z 2. // w kompilatorze C++11 int Write(std::wstring str) noexcept; // pod kompilatorem C++98 int Write(std::wstring str) throw(); Jeśli `ELMAX_EXCEPTION` nie jest zdefiniowane lub ma wartość zero, makro rozwinie się do zera. int Write(std::wstring) ; Powód, dla którego chcę to zrobić, jest dla użytkownika biblioteki, który chce uzyskać wzrost wydajności, ponieważ kompilator nie generuje kodu odwijania stosu (na wyjątek), a kompilator może lepiej zoptymalizować takie funkcje. Moja biblioteka plików C++ korzysta z API plików C i jedyną rzeczą, która może zgłosić wyjątek, jest słowo kluczowe `new`, do którego zamierzam dodać `nothrow`. Kod UTF-8 może również zgłaszać wyjątki (też trzeba je zmienić) char *parr = new (nothrow) char[num]; if(parr==NULL) // obsłuż go albo przez kod błędu, albo wyrzuć wyjątek (jeśli jest włączony) Uprzejmie proszę o poradę, czy powinienem mieć podejście czystego wyjątku, czy podejście hybrydowe (jak wspomniano), w przypadku błędów mojej biblioteki?


title: IUserType jak funkcja w Entity Framework

text: Pracuję nad nowym projektem, chcemy zbudować nową, nowoczesną aplikację współpracującą z naszymi starszymi źródłami danych, a zwłaszcza starszymi bazami danych. Chcemy korzystać z ORM i chcemy zaawansowanych funkcji, więc oczywistym wyborem wydaje się być między NHibernate a EF 6. Możemy w końcu dokonać drobnych zmian w bazach danych, ale nie całkowicie zmodyfikować modelu, ponieważ jest on używany przez wiele innych aplikacji. Teraz, oczywiście, ponieważ jest to przestarzałe rzeczy, to jest do bani. Baza danych ma wiele wad i w tej chwili piszę podstawowy kod do testowania EF i NH i zobaczenia, czy możemy obejść te wady. Mój obecny problem dotyczy Entity Framework. W mojej bazie wiele pól jest używanych w „niestandardowy” sposób. Na przykład mam pola reprezentujące datę i czas za pomocą specjalnych ciągów formatu lub dane XML w ciągu. Chciałbym, aby EF wykonywał pracę konwertowania bez narażania tych specjalnych pól na mój interfejs API i bez używania innej warstwy na wierzchu EF. Mogłem rozwiązać ten problem za pomocą IUserType w NHibernate, ale nie znalazłem sposobu w EF. Oto przykład, powiedzmy, że mam pole reprezentujące datę w mojej bazie danych i powinno być sformatowane w następujący sposób: ddmmyy (na dziś 090214). Nie chcę ujawniać tego ciągu w moim obiekcie, ale chcę mieć możliwość manipulowania tą datą za pomocą klasycznego datetime, takiego jak: var comp = ctx.Companies.First(c => c.Id == 1); comp.Data = DataGodzina.Teraz; ctx.ZapiszZmiany(); I automatycznie zapisuje datę w specjalnym formacie w DB. Mogę to zrobić, mapując na przykład właściwość DateString i ustawiając moje pole Date za pomocą funkcji pobierającej/ustawiającej, która wykonuje transformację, ale nie chcę ujawniać tej właściwości DateString i jest to trochę bolesne, aby zrobić to ze wszystkimi moimi polami Date w poprzek wszystkie moje stoły. IUserType w Nhibernate był idealny do rozwiązywania tego rodzaju problemów, czy jest coś równoważnego w EF? Dziękuję


Spojrzałem na to w mojej dziedzinie pracy, którą jest film i prawie każde używane przez nas oprogramowanie zawiera Pythona jako język skryptowy: http://en.wikipedia.org/wiki/List_of_Python_software To sprawiło, że założyłem, że jest najpopularniejszy. Jak Python stał się popularny jako język skryptowy? Zwłaszcza jako język osadzony w samodzielnych aplikacjach. Jaki jest tego powód? Są inne, takie jak Lua, Ruby itp., ale wygląda na to, że Python znalazł się na szczycie. Czy dzieje się tak z powodu jakiejś konkretnej rzeczy, czy po prostu z powodu wyjścia we właściwym czasie?


title: Zarządzanie pamięcią w celu szybkiego przesyłania wiadomości między wątkami w C++

text: Załóżmy, że istnieją dwa wątki, które komunikują się poprzez asynchroniczne przesyłanie do siebie komunikatów danych. Każdy wątek ma jakiś rodzaj kolejki wiadomości. Moje pytanie jest bardzo niskie: Jaki może być najbardziej wydajny sposób zarządzania pamięcią? Przychodzi mi do głowy kilka rozwiązań: 1. Nadawca tworzy obiekt poprzez `nowy`. Odbiorca wzywa „usuń”. 2. Łączenie pamięci (w celu przeniesienia pamięci z powrotem do nadawcy) 3. Odśmiecanie (np. Boehm GC) 4. (jeśli obiekty są wystarczająco małe) kopiuj według wartości, aby całkowicie uniknąć alokacji sterty 1) jest najbardziej oczywistym rozwiązaniem, więc użyję go do prototypu. Są szanse, że jest już wystarczająco dobry. Ale niezależnie od mojego konkretnego problemu, zastanawiam się, która technika jest najbardziej obiecująca, jeśli optymalizujesz wydajność. Spodziewałbym się, że pooling będzie teoretycznie najlepszy, zwłaszcza, że można wykorzystać dodatkową wiedzę o przepływie informacji między wątkami. Obawiam się jednak, że również najtrudniej jest to zrobić dobrze. Dużo dostrajania... :-( Odśmiecanie powinno być dość łatwe do dodania (po rozwiązaniu 1) i spodziewałbym się, że będzie działać bardzo dobrze. Więc sądzę, że jest to najbardziej praktyczne rozwiązanie, jeśli 1) okaże się być zbyt nieefektywnym. Jeśli obiekty są małe i proste, kopiowanie według wartości może być najszybsze. Obawiam się jednak, że wymusza to niepotrzebne ograniczenia w realizacji obsługiwanych komunikatów, dlatego chcę tego uniknąć.


title: Na czym koncentruje się Java? Dlaczego uzyskanie nowych funkcji zajmuje tak dużo czasu?

text: Odkrywam nowe funkcje w JDK8, takie jak wyrażenia lambda, metody rozszerzające i nowy strumień API. Najwyraźniej żadna z tych funkcji nie jest nowa w świecie programowania i to sprawiło, że zastanawiałem się, dlaczego do tej pory wszystkie te rzeczy są dostępne w Javie. Mieliśmy wyrażenia lambda w Lisp (1958), SML (1973), Haskell (1990), Python (1991), JavaScript (1994), Ruby (1995), Scala (2003), C# (2007) i 55 lat po Lispie i praktycznie wszyscy inni, w Javie (2013). A o streamach czytałem w SIC (1996). Zastanawiam się, dlaczego teraz? Dowody sugerują, że konkurowanie z innymi językami nie jest motywacją. Wydawałoby się, że wszystkie fajne nowe funkcje w tym wydaniu Javy są tylko produktem ubocznym implementacji paralelizmu. Mamy lambdy, ponieważ ułatwiają pisanie równoległych algorytmów, i mamy metody rozszerzające, ponieważ potrzebowaliśmy ich, aby wspierać zmiany wymagane przez wyrażenia lambda, itd., itd. Więc moje pytanie brzmi: czy możemy bezpiecznie potwierdzić, że główny temat w nadchodzącym wydaniu Javy jest rzeczywiście paralelizm? Czy możemy uzasadnić inne powody, dla których najstarsze sztuczki w książce pojawiły się do tej pory w Javie?


title: Kruche testy jednostkowe ze względu na konieczność nadmiernego wyśmiewania

text: Zmagam się z coraz bardziej irytującym problemem dotyczącym naszych testów jednostkowych, które wdrażamy w moim zespole. Próbujemy dodać testy jednostkowe do starszego kodu, który nie był dobrze zaprojektowany i chociaż nie mieliśmy żadnych problemów z faktycznym dodaniem testów, zaczynamy mieć problemy z tym, jak te testy wychodzą. Jako przykład problemu powiedzmy, że masz metodę, która wywołuje 5 innych metod w ramach swojego wykonania. Test dla tej metody może polegać na potwierdzeniu, że zachowanie występuje w wyniku wywołania jednej z tych 5 innych metod. Tak więc, ponieważ test jednostkowy powinien zakończyć się niepowodzeniem z jednego i tylko jednego powodu, chcesz wyeliminować potencjalne problemy spowodowane wywołaniem tych pozostałych 4 metod i wykpić je. Świetny! Test jednostkowy jest wykonywany, metody maskowane są ignorowane (a ich zachowanie można potwierdzić w ramach innych testów jednostkowych), a weryfikacja działa. Ale pojawia się nowy problem – test jednostkowy ma gruntowną wiedzę na temat tego, _jak_ potwierdziłeś to zachowanie i wszelkie zmiany sygnatury w którejkolwiek z pozostałych 4 metod w przyszłości lub wszelkie nowe metody, które muszą zostać dodane do „metody nadrzędnej”, skutkować koniecznością zmiany testu jednostkowego, aby uniknąć możliwych awarii. Oczywiście problem można nieco złagodzić, po prostu mając więcej metod, aby osiągnąć mniej zachowań, ale miałem nadzieję, że być może dostępne jest bardziej eleganckie rozwiązanie. Oto przykładowy test jednostkowy, który wychwytuje problem. **Krótka uwaga 'MergeTests' to klasa testów jednostkowych, która dziedziczy po klasie, którą testujemy i w razie potrzeby zastępuje zachowanie. Jest to „wzorzec”, który stosujemy w naszych testach, aby umożliwić nam nadpisanie wywołań zewnętrznych klas/zależności.** [TestMethod] public void VerifyMergeStopsSpinner() { var mockViewModel = new Mock<MergeTests> { CallBase = true }; var mockMergeInfo = new MergeInfo(Mock.Of<IClaim>(), Mock.Of<IClaim>(), It.IsAny<bool>()); mockViewModel.Setup(m => m.ClaimView).Returns(Mock.Of<IClaimView>); mockViewModel.Setup( m => m.TryMergeClaims(It.IsAny<Func<bool>>(), It.IsAny<IClaim>(), It.IsAny<IClaim>(), It.IsAny<bool>(), It.IsAny<bool>())); mockViewModel.Setup(m => m.GetSourceClaimAndTargetClaimByMergeState(It.IsAny<MergeState>())).Returns(mockMergeInfo); mockViewModel.Setup(m => m.SwitchToOverviewTab()); mockViewModel.Setup(m => m.IncrementSaveRequiredNotification()); mockViewModel.Setup(m => m.OnValidateAndSaveAll(It.IsAny<object>())); mockViewModel.Setup(m => m.ProcessPendingActions(It.IsAny<string>())); mockViewModel.Object.OnMerge(It.IsAny<MergeState>()); mockViewModel.Verify(mvm => mvm.StopSpinner(), Times.Once()); } Jak reszta z was poradziła sobie z tym, czy też nie ma wielkiego „prostego” sposobu na poradzenie sobie z tym? **Aktualizacja - doceniam opinie wszystkich. Niestety, i nie jest to niespodzianką, nie wydaje się, aby istniało świetne rozwiązanie, wzorzec lub praktyka, którą można zastosować w testach jednostkowych, jeśli testowany kod jest słaby. Zaznaczyłem odpowiedź, która najlepiej uchwyciła tę prostą prawdę.**


title: Tworzę własny, skalowalny serwer WWW do szybkiego prototypowania. Jak mam to zaprojektować?

text: Zamierzam stworzyć własny serwer WWW, który skupia się na skalowalności, szybkim prototypowaniu i wykorzystaniu JavaScript jako języka skryptowego serwera, podobnie jak node.js. Wykorzysta wzorzec projektowy Model-View-Controller, dzięki czemu aplikacja internetowa może obsługiwać większą liczbę jednoczesnych użytkowników po prostu przez dodanie sprzętu — bez konieczności przeprojektowywania oprogramowania. Zasadniczo zamierzam stworzyć framework, który pozwoli na szybkie i łatwe tworzenie aplikacji w chmurze bez konieczności pisania dużej ilości kodu płyty kotłowej. Mam kilka pytań na ten temat... 1. Jak trudno będzie umieścić MySQL w chmurze? Jak mogę to wdrożyć i uwolnić powstały produkt? Czy będę musiał napisać własny silnik lub zmodyfikować istniejący, jeśli zrobię, na co powinienem uważać? 2. Aby to było skalowalne, muszę dostosować jeden serwer do setek serwerów, co stwarza wymóg równoważenia obciążenia serwerów, jak mam to zrobić? Jeśli równoważę się w oparciu o obciążenie pracą na serwer, będę potrzebował bramy do obsługi wszystkich przychodzących żądań. Czy to dobry pomysł, aby wszystkie serwery sprawdzały bramę i aktualizowały jej status. 3. Dzięki temu, że serwery działają przez bramę, jeśli brama umrze, wszystkie przychodzące żądania są ignorowane. Myślę, że mając wszystkie serwery utrzymujące listę siebie nawzajem, a przynajmniej kilka, mógłbym przebudować listę serwerów i ustanowić nową bramę. Czy warto? A może powinienem mieć zapasową bramę, która mogłaby się wyłączyć? Czy powinienem pozwolić użytkownikowi wybrać? 4. Jak wybrać, który serwer obsługuje bazę danych, a który obsługuje serwowanie stron? Czy powinienem rozłożyć bazę danych tak, aby zapytania były wykonywane na wielu serwerach? Co teoretycznie poprawiłoby wydajność. 5. Serwery musiałyby co najmniej raz wykonać kopię lustrzaną bazy danych, aby w przypadku awarii serwera baza danych nie została uszkodzona. To prowadzi do pisania kolejnego pytania, czy powinienem rozgłaszać zapytania SQL, aby wszystkie serwery mogły przejąć trochę obciążenia pracą? Jeśli zrobię to w ten sposób, czy zapytanie nie zablokuje sieci, aby nie można było wykonać innych zapytań? Jakie są moje alternatywy? 6. Na koniec, czy istnieje już darmowe rozwiązanie, które może wymagać niewielkiej modyfikacji, która odpowiada moim potrzebom?


title: Który algorytm wyszukiwania ciągów jest w rzeczywistości najszybszy?

text: Utknąłem od jakiegoś czasu, który jest najszybszym algorytmem wyszukiwania ciągów, słyszałem wiele opinii, ale w końcu nie jestem pewien. Słyszałem, jak niektórzy mówili, że najszybszym algorytmem jest Boyer-Moore, a niektórzy, że Knuth-Morris-Pratt jest w rzeczywistości szybszy. Szukałem złożoności na obu z nich, ale w większości wyglądają tak samo „O(n+m)”. Odkryłem, że w najgorszym przypadku Boyer-Moore ma złożoność `O(nm)` w porównaniu do Knutha-Morrisa-Pratta, który ma O(m+2*n). Gdzie n=długość tekstu, a m=długość wzoru. O ile wiem, Boyer-Moore ma najgorszy liniowy przebieg przypadków, gdybym użył reguły Galila. Moje pytanie, który jest w rzeczywistości najszybszym algorytmem wyszukiwania ciągów (To pytanie obejmuje wszystkie możliwe algorytmy żądła, nie tylko Boyera-Moore'a i Knutha-Morrisa-Pratta). **Edytuj:** Z powodu tej odpowiedzi, czego dokładnie szukam to: Mając tekst `T` i wzorzec `P` muszę znaleźć wszystkie wystąpienia `P` w `T`. Również długość P i T wynosi od `[1,2 000 000]`, a program musi działać krócej niż 0,15 sekundy. Wiem, że KMP i Rabin-Karp wystarczą, aby uzyskać 100% punktów za problem, ale na przykład chciałem spróbować wdrożyć Boyer-Moore. Który byłby najlepszy dla tego typu wyszukiwania wzorców?


title: Obliczanie optymalnej przestrzeni do przechowywania danych na nazwisko, adres, telefon, faks i e-mail

text: Biorąc pod uwagę następujące założenia: * Ilość dostępnego miejsca do przechowywania danych jest bardzo ograniczona * Wszystkie dane są międzynarodowe * Należy zachować jak najwięcej miejsca, ponieważ będzie ono używane do czegoś innego Czy istnieje jakaś powszechnie akceptowana norma lub najlepsza praktyka, która określa ilość na te przedmioty należy przeznaczyć miejsce? **Uwaga** : Nie szukam założeń, ale faktów takich jak „97,5% wszystkich nazw mieści się w 70 bajtach przy użyciu UTF-8” i „Międzynarodowy adres musi zawierać co najmniej field1, field2 i field3 z size1, size2 i rozmiar3". **Edytuj** : szukam pól/długości do użycia w interfejsie użytkownika. Nie jest to technika wydajnego przechowywania.


title: Jak ważne są diagramy UML dla udanego projektu?

text: Jestem w trakcie projektu i zostałem poproszony o napisanie diagramów UML (przypadki użycia, diagram klas itp.). Projekt nie jest bardzo skomplikowany. Zastanawiałem się, czy to strata czasu? Czy powinienem po prostu robić inne fajne rzeczy, takie jak pisanie kodu? A kiedy nie można zbudować czegoś bez przechodzenia przez całą fazę koncepcyjną? Czy chodzi tylko o złożoność? A jeśli tak, to jak to zmierzyć?


title: Unix/Linux o niskich opóźnieniach

text: Większość zadań programowania o niskim opóźnieniu/wysokiej częstotliwości (na podstawie specyfikacji zadań) wydaje się być zaimplementowana na platformach uniksowych. W wielu specyfikacjach zwracają szczególną uwagę na osoby z doświadczeniem typu "Low Latency Linux". Zakładając, że nie oznacza to systemu operacyjnego Linux działającego w czasie rzeczywistym, czy ludzie mogliby mi pomóc w tym, do czego to może się odnosić? Wiem, że można ustawić koligację procesora do wątków, ale zakładam, że proszą o znacznie więcej. Strojenie jądra? (chociaż słyszałem, jak producenci tacy jak solarflare i tak produkują karty sieciowe z obejściem jądra)? A co z DMA lub ewentualnie pamięcią współdzieloną między procesami? Gdyby ludzie mogli dać mi krótkie pomysły, mogę pójść i poszukać w Google. (To pytanie prawdopodobnie będzie wymagało kogoś zaznajomionego z High Frequency Trading)


title: Różnica między zakresem leksykalnym a przekazywaniem zmiennych w JS

text: Istnieje kilka sposobów na osiągnięcie tego samego punktu końcowego w JS, na przykład: (function (foo, bar) { return {run: function () {return foo(bar);}}; } (foo, bar)); (function (foo, bar) { return (function(foo, bar) { return {run: function () { return foo(bar); }}} (foo, bar)) } (foo, bar)) (funkcja ( foo, bar) { var Fizz = function (foo, bar) { this.run = function () { return foo(bar); }; }; return new Fizz(foo, bar) } (foo, bar)) Teraz dla wiem, że jedyną różnicą jest to, że prototyp w trzecim przypadku dla zwróconego obiektu byłby inny, ale poza tym wszystkie trzy ścieżki prowadzą do obiektu, który zapewnia to samo api. A ponieważ JavaScript jest językiem kanałowym, to, czym jest rzecz, jest zwykle definiowane przez jej zachowanie. Czy są jakieś inne implikacje wyboru jednego z trzech podejść, które ignoruję?


title: Naprawa błędów w Scrum, pod koniec projektu

text: Mamy projekt, który zbliża się do ostatecznego wydania produkcyjnego. Jest to projekt o stałej cenie i do tej pory udało nam się pracować w dwutygodniowych iteracjach, wykonując regularne wydania do naszego "wewnętrznego środowiska testowego", gdzie BA i osoby działające jako PO ze strony klienta miały okazję zajrzeć, dać informacje zwrotne itp. Jesteśmy teraz w miejscu, w którym mamy tylko 4 tygodnie na zakończenie tego projektu, a gdy przechodzimy do wdrażania oddzielnych modułów tej aplikacji w środowisku klienta, borykamy się z pojawiającymi się wieloma błędami. Wciąż mamy pewne funkcje do zrobienia, ale moje pytanie brzmi - jaki jest najlepszy sposób na poradzenie sobie z tymi błędami, gdy się pojawiają? Ponieważ jest ich naprawdę dużo (ze względu na specyfikę projektu nie mieliśmy możliwości wcześniejszego przetestowania tego na środowisku klienta) i nie da się ich z góry oszacować + do końca mamy tylko 4 tygodnie, czy to ma sens zachować Scrum lub przełączyć się na codzienne wysyłanie zadań Tech Lead bezpośrednio do programistów?


title: Czy części Boost, które są włączone do nowego standardu C++, będą nadal rozwijane?

text: Co się stanie z częściami biblioteki Boost, które zostaną włączone do nowego standardu C++? Czy będą one nadal ewoluować, a wszelkie zmiany zostaną ponownie włączone do standardu następującego po C++0x?


title: Czy zbiorowa własność kodu jest obowiązkowa w Scrumie?

text: Czy stosowanie metodologii Scrum jest absolutną koniecznością, aby ćwiczyć zbiorową własność kodu, zamiast na przykład słabej własności kodu?


title: Jak nowicjusz z czystym kontem zamienia się w dobrego programistę?

text: Jako absolwent świeżo po studiach z czystym kontem, jak można być dobrym programistą, który pisze dobry, nadający się do utrzymania kod? Jak nauczyć się dobrych praktyk kodowania i jak je stosować? Czy można zdobyć te umiejętności, czytając konkretne książki na temat rozwoju oprogramowania, czy jest to coś, co wynika wyłącznie z doświadczenia? (Nie lubię wierzyć, że jest to czysto oparte na doświadczeniu, ponieważ widzę tu ludzi narzekających na bystrych współpracowników z wieloletnim doświadczeniem w pisaniu złego kodu). Jakie są sugestie dotyczące stania się dobrym w pisaniu czystego kodu? Zakłada się pasję i umiejętności.


title: Czy aplikacje internetowe i chmura zapewniają lepsze możliwości kariery niż programowanie systemowe?

text: W miarę upływu lat nie mogę się powstrzymać, aby zobaczyć, jak aplikacje internetowe i chmura zastępują normalne oprogramowanie komputerowe. Twórcy języków programowania systemów, takich jak C/C++, idą w dół, a PHP/ASP.NET(C#) wznosi się w przestworza (chmura?). Ponieważ jestem poważnym fanem C++ i lubię rozwijać się głównie w C++, zastanawiałem się, czy jest to rozsądne mówić na tej ścieżce. Czy będzie zatrudnienie dla programistów C++ po powiedzmy 10 latach? Widziałem wielu bezrobotnych programistów C++, podczas gdy nie było programistów .NET ani programistów internetowych, którzy by się pogorszyli. Czy więc powinienem przenieść się do sieci i/lub chmury teraz, kiedy jest jeszcze czas, czy też powinienem kontynuować podążanie ścieżką C++? Czy będzie wystarczająca liczba miejsc pracy dla programistów C++ i innych systemów (offline?) Języka programowania?


title: Kiedy pętla jest „nietrywialna”?

text: Czy poprawne jest wywoływanie pętli, której limit nie jest znany w czasie kompilacji „nietrywialne”? Jeśli wiesz, że będziesz używać wartości z klasy, która będzie z zakresu np. między 0-1000, czy to nadal nie jest trywialne? np. Gdzie ISomeInterface.MAX_LIMIT jest zawsze pomiędzy 1-1000: public bool someMethod(Type someType, int someId, int someVariable) { bool returnFlag = false; int maxLimit = (Activator.CreateInstance(someType) jako ISomeInterface).MAX_LIMIT; for (int i = 0; i < maxLimit; i++) //czy to nietrywialna pętla? { if (_someSerivce.SomeOtherMethod(someType, someId, someVariable, i)) { returnFlag= true; } } return returnFlag; } * * * **Edytuj:** Nie miałem pewności, czy jest to sensowna terminologia. Pierwotnie przeczytałem to w jednym z artykułów Jona Skeeta z yoda.arachsys: http://www.yoda.arachsys.com/csharp/stringbuilder.html (patrz rozdział zatytułowany _Zasady kciuka_). Czy używasz tego w ogóle jako terminologii technicznej?


title: Kto rozszerza interfejsy? I dlaczego?

text: AFAIK, moja klasa „rozszerza” klasy nadrzędne i „implementuje” interfejsy. Ale natrafiam na sytuację, w której nie mogę użyć `implementuje SomeInterface`. Jest to deklaracja typów generycznych. Na przykład: interfejs publiczny CallsForGrow {...} public class GrowingArrayList <T implementuje CallsForGrow> // ŹLE, nie zadziała! extends ArrayList<T> Tutaj użycie `implements` jest składniowo zabronione. Najpierw pomyślałem, że używanie interfejsu wewnątrz <> jest w ogóle zabronione, ale nie. Jest to możliwe, wystarczy użyć `extends` zamiast `implements`. W rezultacie „rozszerzam” interfejs. Kolejny przykład działa: interfejs publiczny CallsForGrow {...} public class GrowingArrayList <T extends CallsForGrow> // to działa! extends ArrayList<T> Wydaje mi się to niespójnością składniową. Ale może nie rozumiem pewnych finezji Javy 6? Czy są inne miejsca, w których powinienem rozszerzyć interfejsy? Czy interfejs, który zamierzam rozbudować, powinien mieć jakieś specjalne funkcje?


title: Czy inline SQL nadal jest klasyfikowany jako zła praktyka, skoro mamy Micro ORM?

text: To trochę otwarte pytanie, ale chciałem zasięgnąć opinii, ponieważ dorastałem w świecie, w którym skrypty inline SQL były normą, wszyscy byliśmy bardzo świadomi problemów związanych z wstrzykiwaniem SQL i tego, jak kruchy był sql, kiedy robienie manipulacji strunami w całym miejscu. Potem nadszedł świt ORM-u, w którym wyjaśniałeś zapytanie do ORM-a i pozwalałeś mu generować własny SQL, co w wielu przypadkach nie było _optymalne_, ale było bezpieczne i łatwe. Kolejną dobrą rzeczą w ORM-ach lub warstwach abstrakcji bazy danych było to, że SQL był generowany z myślą o silniku bazy danych, więc mogłem używać Hibernacji/Nhibernacji z MSSQL, MYSQL, a mój kod nigdy się nie zmieniał, był to tylko szczegół konfiguracji. Teraz szybko do przodu do dnia dzisiejszego, gdzie Micro ORM wydają się zdobywać więcej programistów. Zastanawiałem się, dlaczego pozornie zabraliśmy się za cały temat wbudowanego sql. Muszę przyznać, że podoba mi się pomysł braku plików konfiguracyjnych ORM i możliwości pisania zapytania w bardziej optymalny sposób, ale wydaje mi się, że otwieram się z powrotem na stare luki, takie jak wstrzyknięcie SQL, a także przywiązuję się do jeden silnik bazy danych, więc jeśli chcę, aby moje oprogramowanie obsługiwało wiele silników baz danych, musiałbym jeszcze trochę hakerować łańcuchy, co wydaje się, że kod staje się nieczytelny i bardziej kruchy. (Tuż zanim ktoś o tym wspomni, wiem, że możesz użyć argumentów opartych na parametrach z większością mikro orm, które w większości przypadków zapewniają ochronę przed wstrzyknięciem sql) Więc jakie są opinie ludzi na ten temat? Używam Dappera jako mojego Micro ORM w tym przypadku i NHibernate jako mojego zwykłego ORM w tym scenariuszu, jednak większość w każdej dziedzinie jest dość podobna. To, co nazywam _inline sql_, to ciągi SQL w kodzie źródłowym. Kiedyś toczyły się debaty projektowe nad ciągami SQL w kodzie źródłowym, które umniejszały fundamentalną intencję logiki, dlatego statycznie typowane zapytania w stylu linq stały się tak popularne, że nadal jest tylko jednym językiem, ale powiedzmy, że C# i Sql na jednej stronie 2 języki przemieszane teraz w Twoim surowym kodzie źródłowym. Dla wyjaśnienia, wstrzykiwanie SQL to tylko jeden ze znanych problemów z używaniem ciągów sql, już wspominałem, że można temu zapobiec w przypadku zapytań parametrycznych, jednak zwracam uwagę na inne problemy z zakorzenieniem zapytań SQL w kodzie źródłowym, takie jak brak abstrakcji DB Vendor, a także utrata jakiegokolwiek poziomu przechwytywania błędów czasu kompilacji w zapytaniach opartych na ciągach znaków, to wszystko problemy, które udało nam się pominąć wraz ze świtem ORM z ich wyższym poziomem funkcjonalności zapytań, takich jak HQL lub LINQ itp. (nie wszystkie problemy, ale większość). Dlatego mniej skupiam się na poszczególnych wyróżnionych kwestiach, a bardziej na tym, że teraz coraz bardziej akceptowalne staje się ponowne umieszczanie ciągów SQL bezpośrednio w kodzie źródłowym, ponieważ większość Micro ORM korzysta z tego mechanizmu. Oto podobne pytanie, które ma kilka różnych punktów widzenia, chociaż dotyczy bardziej wbudowanego sql bez kontekstu micro orm: http://stackoverflow.com/questions/5303746/is-inline-sql-hard-coding


title: Jak mogę uzasadnić klientowi moje zrzeczenie się gwarancji?

text: Sprzedaję oprogramowanie, które pozwala użytkownikom manipulować krytycznymi informacjami. W mojej umowie licencyjnej (zredagowanej przez prawnika specjalizującego się w tej dziedzinie) mam standardową klauzulę: > TO OPROGRAMOWANIE JEST DOSTARCZANE PRZEZ AUTORA W STANIE „TAK JAK JEST” ORAZ WSZELKIE WYRAŹNE LUB DOROZUMIANE > GWARANCJE, W TYM MIĘDZY INNYMI OGRANICZONE DO DOROZUMIANEJ GWARANCJI > PRZYDATNOŚCI HANDLOWEJ I PRZYDATNOŚCI DO OKREŚLONEGO CELU SĄ WYŁĄCZONE. W ŻADNYM PRZYPADKU AUTOR NIE PONOSI ODPOWIEDZIALNOŚCI ZA JAKIEKOLWIEK BEZPOŚREDNIE, POŚREDNIE, PRZYPADKOWE, > SZKODY SZCZEGÓLNE, PRZYKŁADOWE LUB WTÓRNE (W TYM MIĘDZY INNYMI > ZAKUP TOWARÓW LUB USŁUG ZASTĘPCZYCH; UTRATĘ KORZYSTANIA, DANYCH LUB ZYSKÓW; > LUB PRZERWANIA W DZIAŁALNOŚCI) JEDNAK SPOWODOWANE I NA DOWOLNEJ TEORII ODPOWIEDZIALNOŚCI, > CZY KONTRAKTOWA, ŚCISŁA ODPOWIEDZIALNOŚĆ LUB CZYNOWA (W TYM ZANIEDBANIA LUB > W INNY SPOSÓB) WYNIKAJĄCYCH Z KORZYSTANIA Z TEGO OPROGRAMOWANIA, NAWET JEŚLI > ZALECANE TAKICH USZKODZEŃ. Widziałem odpowiedniki w prawie każdym oprogramowaniu, z którego do tej pory korzystałem. Do tej pory wszyscy nasi klienci bez trudu to akceptowali, ale teraz jeden potencjalny klient kwestionuje to. Właściwie mówi mi coś w stylu: > Masz na myśli to, że jeśli użyję twojego oprogramowania do kupienia czegoś za 10 dolarów firmie zewnętrznej, > i jest błąd w twoim oprogramowaniu (ponieważ nie gwarantujesz > nie ma dowolny) i prześlesz zamówienie na 20 USD, zapłacę różnicę w wysokości 10 USD, a nie Ty? Trochę utknąłem między tym, co wydaje się jego zdrowym rozsądkiem, a faktem, że moje firmy ubezpieczeniowe prawdopodobnie nie ubezpieczyłyby mnie na tego rodzaju ryzyko, a jeśli weźmiesz pod uwagę, że mówimy o milionach, a nie zwykłych dolarach, to nie jest nie czuję się komfortowo, będąc odpowiedzialnym za tego rodzaju potencjalne straty. Jak dotąd najlepszą odpowiedzią, jaką wymyśliłem, jest to, że robią to wszyscy w branży (Microsoft nie gwarantuje, że poczta wysłana za pomocą Outlooka nie zostanie zmieniona, np. przez oddanie wszystkich 10 dolarów 20 dolarów ...) Jakieś porady, jak sobie z tym poradzić? (oczywiście oprócz robienia wszystkiego, co w naszej mocy, aby dostarczać oprogramowanie wolne od błędów :p)


title: Czy programiści powinni pomagać testerom w projektowaniu testów?

text: W jakim stopniu programiści powinni pomagać testerom w projektowaniu testów? Myślę, że w ogóle nie powinni pomagać. Martwię się, że jeśli pomogą testerom w projektowaniu testów dla ich własnego kodu, „zainfekują” testerów własnymi uprzedzeniami i ślepymi plamami na temat tego kodu. Uważam, że wymagania powinny wystarczyć do podania informacji potrzebnych testerom do tworzenia testów. Jeśli jest jakaś część implementacji, którą programiści uważają za niepokojącą, to myślę, że ich obowiązkiem jest wdrożenie testów jednostkowych w celu przetestowania tej części lub nawet uruchomienie własnych nieformalnych testów systemowych w celu przetestowania tej części. Nie wszyscy, których znam, zgadzają się z tym (i do pewnego stopnia rozumiem niektóre z ich punktów). Co o tym myślą inni? Czy jest to gdzieś omawiane w literaturze?


title: Czy powinniśmy częściej używać funkcjonalnych i/lub logicznych języków programowania?

text: Zaprogramowałem trochę Haskella i Prologa w ramach kilku kursów uniwersyteckich, ale to wszystko. I nigdy nie widziałem, żeby był używany w przemyśle (nie żebym miał duże doświadczenie w pracy, ale nigdy nie widziałem reklamy, w której musisz je znać). Czy więc powinniśmy częściej używać funkcjonalnych i/lub logicznych języków programowania? Czy są jakieś zalety lub wady korzystania lub niekorzystania z nich?


title: Przechowuj wynik złożonego, ale częstego zapytania do bazy danych w innej tymczasowej tabeli utrwalania

text: Mam nieco złożoną kwerendę SELECT, która używa wielu JOIN i zmiennych w środku, a kwerenda jest często uruchamiana w całej aplikacji. Wynik zmienia się po zaktualizowaniu jednej kolumny. Np.: Gdy aktualizowana jest tylko ilość produktu, zmienia się zestaw wyników. Więc moje pytanie brzmi, czy dobrym pomysłem jest uruchomienie wyzwalacza i aktualizowanie tymczasowej tabeli w bazie danych z wynikami moich zapytań SELECT za każdym razem, gdy aktualizowana jest ilość produktu? A może za każdym razem uruchamiać złożone zapytanie SELECT? W tej chwili testowałem z ~10 wierszami danych, a czas wykonania zapytania to 0,001 sekundy. Chcę użyć najlepszej możliwej metody, która nie zmniejszy wydajności wraz ze wzrostem bazy danych. Dziękuję Ci!


title: Jakie są zasady dotyczące dozwolonych nazw w wyszukiwarce aplikacji Google?

text: Kiedy tworzę nową aplikację i wybieram nazwę, większość popularnych słów w słowniku wydaje się być niedostępna, a także niektóre z bardziej ezoterycznych, w tym „aaaaaa” (próbowałem różnej długości i różnych liter). Jednak wydaje się, że większość z tych aplikacji w rzeczywistości nie istnieje. Więc albo wszystkie te nazwy zostały zajęte, ale żadna z tych osób nie zadała sobie trudu, aby zbudować na nich nawet aplikację Hello World, albo istnieją dodatkowe reguły nazewnictwa, które silnik aplikacji wymusza poza > Identyfikator aplikacji musi mieć od 6 do 30 znaków. Dopuszczalne są małe litery > litery, cyfry i łączniki. Łączniki na początku i na końcu > są zabronione. Chciałbym wykluczyć to późniejsze -- czy są jakieś dodatkowe zasady nazewnictwa narzucane przez GAE?


title: Jaka jest jedna część teorii informatyki, którą powinienem znać?

text: Mówiąc jako ktoś ze stopniem inżynierii elektronicznej, a nie informatyki, jaki jest **jeden kawałek** informatyki, który powinienem znać, aby uczynić mnie lepszym programistą w **prawdziwym świecie**? (Przez prawdziwy świat mam na myśli coś, z czego będę korzystać i czerpać korzyści w mojej codziennej pracy jako programista - na przykład sugeruję zrozumienie normalizacji bazy danych jest bardziej praktyczne niż zrozumienie szybkiego sortowania, do którego jest wiele bibliotek).


title: Jak uniknąć zakłócenia przepływu pracy, gdy Właściciel Produktu prosi o wydanie?

text: Mój zespół używa Scrum od lat, mając na celu dostarczenie potencjalnie możliwej do wydania kompilacji każdego sprintu. Niedawno zaczęliśmy używać tablicy Kanban, odchodząc od dostarczania ograniczonego czasowo do dostarczania ograniczonego do określonych funkcji. Jak dotąd wydaje się to lepiej pasować do naturalnego sposobu pracy zespołów. Dzięki dostawom z ograniczonymi funkcjami historie są wyciągane z zaległości, gdy dana osoba czuje, że jest gotowa do rozpoczęcia pracy nad nią. Średni czas realizacji fabuły przez zespoły to trzy tygodnie. Tak więc teoretycznie w momencie, gdy właściciel produktu prosi o wydanie, zespół powinien być w stanie dostarczyć go trzy tygodnie później. Kiedy PO ustawia wyzwalacz „zatrzymania rozwoju”, osoby, które mają czas, powinny zacząć pomagać w historiach już w toku, aby rozpocząć sprzątanie tablicy. Ludzie, którzy zostali uwolnieni jako pierwsi, to zazwyczaj ludzie „front-end”… Ci, którzy mają większe umiejętności w zakresie analizy i rozwoju. Zazwyczaj są proszeni o pomoc w pracach zaplecza, takich jak testowanie systemu. Przepływ pracy zespołów lub kadencja zmienia się za każdym razem, gdy ustawiony jest wyzwalacz zatrzymania. Co robisz, aby zminimalizować tę zmianę i utrzymać jak najbardziej wydajną pracę zespołu? Jak uniknąć zakłóceń spowodowanych przez Właściciela Produktu proszącego o wydanie?