title: Zrozumienie, jak działa przypisywanie zmiennych

text: Kiedy kilka lat temu zacząłem uczyć się programowania w C, mój korepetytor uczył mnie podobnie jak większość korepetytorów na całym świecie. Powiedziała mi, że bardzo podstawowe rzeczy, takie jak każdy typ danych int, to 2 bajty pamięci. Jeśli poniższy kod jest moim kodem, #include"stdio.h" #include"conio.h" void main() { clrscr(); int i,n; n = 0; dla(i=0;i<3;i++) n = n + i; printf("%d",n); //oczywiście wypisuje 3 getch(); } wyjaśni jak to, co napisałem poniżej. Tutaj moja nauczycielka znowu zaczyna swoją klasę. . . > Posłuchaj uczniów. Tutaj mamy dwie wartości całkowite. Narysujmy więc dwa pudełka > każde z 2 bajtami pamięci. Pierwsze pudełko będzie przestrzenią pamięci **i**, a > drugie pudełko będzie przestrzenią **n**. Przy `n = 0;` 0 jest przechowywane w polu n. Gdy > formant wejdzie w pętlę, 0 zostanie zapisane w polu i początkowo. > > `0` `0` > > Teraz warunek jest sprawdzany. < 3\. Warunek się spełni. Więc teraz wartość > n zmienia się od 0 do n+i, czyli 0+0=0. Pierwsza iteracja kończy się następnie po > instrukcji increment. Teraz dostaję inkrementację do 1. Więc nasz obraz staje się> taki. > > `1` `0` > > A teraz znowu <3. Warunek się spełnia. n zmienia się od 0 do n + i, tj. > 0+1=1. Nie zapomnij, moi drodzy. Dopiero wtedy nasza iteracja zostaje > zakończona. i++ zmienia teraz nasze i na 2. Obraz będzie teraz wyglądał jak > > `2` `1` Będzie ona postępować podobnie krok po kroku i zakończy się, gdy oba pola uzyskają 3, 3 wartości. > Więc to dzieci. Po tym, jak otrzymamy nasze pudełka w ten sposób > > `3` `3` > > wartość n jest wypisywana na ekranie. > > **3** W tym czasie byłem jak dzieciak kiwający głową, gdy nauczyciel twierdzi, że ziemia jest okrągłą masą. Nigdy nie zadawałem jej żadnych pytań. Logicznie czułem, że była idealna. Ale teraz mam mnóstwo zapytań. Jeśli istnieje instrukcja typu `n = n + i;`, czy nie będzie konfliktu, ponieważ zarówno przestrzeń docelowa, jak i przestrzeń operacyjna są tym samym n polem? Czy operacje będą wykonywane za pomocą dowolnego domyślnego tymczasowego miejsca do obliczeń? Co się stanie, jeśli użyję kodu rekurencyjnego, takiego jak poniższy fragment. int silnia(int n) { if(n < 2) { return n; } else { n = n * silnia (n - 1); powrót n; } } Jak to możliwe, że można użyć jednego pola n tak, jak nauczał mój nauczyciel? Czy nowe pole n nie zostanie utworzone za każdym razem, gdy zostanie wywołana `silnia(n-1)`? Jeśli mam rację, skąd komputer może wiedzieć, która wartość n box ma zostać zwrócona? Niech mi ktoś pomoże. Wyrywam włosy z mojej głowy!


title: Skąd pochodzi termin „serializacja”?

text: W celu konwersji m.in. obiekt Pythona do json, którego użyjesz serializatora. O ile rozumiem, serializacja pozostawia możliwość zmiany przekonwertowanego obiektu z powrotem na oryginał. Skąd pochodzi termin „serializacja”/dlaczego proces ten nazywa się „serializacja”?


title: Używanie konfiguracji do określenia, czy obsłużyć wyjątek, czy go rozładować

text: W projekcie pobocznym, nad którym pracuję, wymyśliłem sposób obsługi wyjątków, który można regulować konfiguracją. Tak więc blok try/catch może wyglądać tak: try { fileHelper.MoveFile(file, destFolder); } catch (IOException ex) { if (exceptionHandler.HandleException(ex)) { return ResultCode.Fail; }         rzucić; } Szczegółowość obsługi wyjątków jest kontrolowana przez „enum” ustawione w pliku app.config: public enum SystemFailureMode { AlwaysThrow = -1, Aggressive = 0, Standard = 1, Lenient = 2 } Określa, czy wyjątek jest „ obsłużone” i zwrócone jako błąd lub jeśli pęknie i spowoduje awarię systemu. Na początku myślałem, że odkryłem nowy wzorzec projektowy, ale teraz wygląda na to, że jest to prawdopodobnie anty-wzorzec. Co myślicie? * * * Po przejrzeniu komentarzy i zastanowieniu się nad tym, zdecydowałem, że jest to zdecydowanie anty-wzorzec. Fakt, że może to zamienić pisanie testów jednostkowych w koszmar, wystarczy, żeby mnie z tego wyłączyć.


title: Czy istnieje sposób, aby dowiedzieć się, jakiego interfejsu API użyć do tworzenia aplikacji innej firmy?

text: Moja firma używa aplikacji o nazwie TotalHRWorks do przechowywania czasu, a co nie. Mają aplikację na Androida i iOS; jednak nie ma aplikacji Windows Phone. Ponieważ istnieje aplikacja na Androida i iOS, uważam, że powinienem być w stanie stworzyć aplikację na Windows Phone; ale nie wiem, od czego zacząć, próbując odkryć może ich usługę sieciową lub jakiekolwiek interfejsy API, których mógłbym użyć, aby to zrobić. Nie wiem, czy można to zrobić, czy jest to „legalne” robienie takich rzeczy - ale byłoby to naprawdę przydatne.


title: Czy programowanie oparte na testach w języku JavaScript jest przydatne dla programistów front-end?

text: Naprawdę potrzebuję twojej rady. Czytam kilka artykułów o TDD w JavaScript, ale naprawdę nie mogę zrozumieć, jak używać go w mojej codziennej pracy. Na przykład obecnie pracuję nad stroną, która ma akordeon, a każdy element akordeonu ma dynamiczną zawartość wypełnianą przez obiekt JSON. Obiekt JSON jest dostarczany przez stronę trzecią. Używam jQuery. Mój dotychczasowy sposób testowania nazywa się console.log :) * Jakie testy mam napisać? * Czy TDD ma sens w przypadku takiego zastosowania, czy jest przeznaczone do czegoś innego? Przepraszam za pytanie noob, ale naprawdę doceniam twoją opinię


title: Aplikacja internetowa do wieloplatformowej aplikacji telefonicznej

text: Jestem tu naprawdę zagubiony, więc mam nadzieję, że niektórzy mogą mi pomóc. Muszę opracować aplikację na telefon na każdej platformie, więc trudno mi używać phonegap. Wygląda całkiem nieźle. Mam aplikację internetową zakodowaną w klasycznym Asp i to jest ta aplikacja internetowa, którą muszę rozebrać, aby była aplikacją na telefon. Na początku wydawało mi się, że będzie to proste, mój klasyczny Asp renderuje trochę html, więc phonegap jest w stanie umieścić go jako aplikację. Ale to nie jest takie proste, ponieważ w moim asp mam jakiś kod, który jest renderowany po stronie serwera, rozmawiałem z kilkoma, którzy powiedzieli mi, że jakiś html może wywołać strony asp i ten html może być użyty w phonegap. Nie myśl, że to możliwe ... Cóż, jeśli ktoś mógłby mi tutaj pomóc, może powiedziałem coś złego w moim małym tekście, nie wahaj się mnie poprawić :) Moje rozwiązanie (chyba): zakoduj niektóre usługi internetowe w asp.net, które użyje tej samej bazy danych, co moja klasyczna aplikacja internetowa asp. Niektóre html i jquery zadzwonią do serwisów internetowych , a te html i jquery przejdą przez phoneGap Dzięki za pomoc i powiedzenie , co o tym myślisz ! :) **Proste pytanie: Jaki jest najlepszy sposób przeniesienia klasycznej aplikacji internetowej asp na wieloplatformową aplikację na telefon?**


title: utrzymywanie rosnącej, zróżnicowanej bazy kodu z ciągłą integracją

text: Potrzebuję pomocy z filozofią i projektowaniem konfiguracji ciągłej integracji. Nasza obecna konfiguracja CI używa buildbota. Kiedy zacząłem go projektować, odziedziczyłem (no cóż, nie ściśle, ponieważ byłem zaangażowany w jego projektowanie rok wcześniej) szytego na miarę kreatora CI, który był dostosowany do uruchomienia całej kompilacji od razu, z dnia na dzień. Po pewnym czasie uznaliśmy, że to niewystarczające i zaczęliśmy eksplorować różne frameworki CI, ostatecznie wybierając buildbota. Jednym z moich celów przy przejściu na buildbota (oprócz możliwości cieszenia się wszystkimi dodatkami) było przezwyciężenie niektórych niedoskonałości naszego nocnego kreatora. Pośmiej mnie przez chwilę i pozwól, że wyjaśnię, co odziedziczyłem. Bazą kodu dla mojej firmy jest prawie 150 unikalnych aplikacji Windows c++, z których każda jest zależna od jednej lub więcej z kilkunastu bibliotek wewnętrznych (i wiele z bibliotek innych firm). Niektóre z tych bibliotek są współzależne i mają zależne aplikacje, które (choć nie mają ze sobą nic wspólnego) muszą być zbudowane z tej samej kompilacji tej biblioteki. Połowa z tych aplikacji i bibliotek jest uważana za „starsze” i nieprzenośne i musi być zbudowana z kilkoma odrębnymi konfiguracjami kompilatora IBM (dla którego napisałem unikalne podklasy `Compile`), a druga połowa jest zbudowana za pomocą Visual Studio. Kod każdego kompilatora jest przechowywany w dwóch oddzielnych repozytoriach Visual SourceSafe (które po prostu radzę sobie za pomocą kilku `ShellCommand`s, ponieważ nie ma wsparcia dla VSS). Nasz oryginalny nocny budowniczy po prostu zdjął źródło wszystkiego i zbudował rzeczy w określonej kolejności. Nie było możliwości zbudowania tylko jednej aplikacji, wybrania wersji lub pogrupowania rzeczy. Uruchomiłby maszyny wirtualne do zbudowania szeregu aplikacji. Nie był zbyt wytrzymały, nie nadawał się do dystrybucji. Nie było to strasznie rozciągliwe. Chciałem móc przezwyciężyć wszystkie te ograniczenia w buildbocie. Sposób, w jaki pierwotnie to zrobiłem, polegał na utworzeniu wpisów dla każdej aplikacji, którą chcieliśmy zbudować (wszystkie 150), a następnie stworzeniu wyzwalanych harmonogramów, które mogłyby budować różne aplikacje jako grupy, a następnie podciąganie tych grup do ogólnego harmonogramu kompilacji na noc. Mogły one działać na dedykowanych urządzeniach podrzędnych (nie ma już szykan maszyn wirtualnych), a gdybym chciał, mógłbym po prostu dodać nowe urządzenia podrzędne. Teraz, jeśli chcemy wykonać pełną kompilację poza harmonogramem, wystarczy jedno kliknięcie, ale możemy również zbudować tylko jedną aplikację, jeśli sobie tego życzymy. Istnieją jednak cztery słabości tego podejścia. Jednym z nich jest złożona sieć zależności naszego drzewa źródłowego. Aby uprościć obsługę konfiguracji, wszystkie kreatory są generowane z dużego słownika. Zależności są pobierane i budowane w niezbyt solidny sposób (mianowicie wyłączając pewne rzeczy w moim słowniku build-target). Po drugie, każda kompilacja ma od 15 do 21 kroków kompilacji, które są trudne do przeglądania i przeglądania w interfejsie internetowym, a ponieważ istnieje około 150 kolumn, ładowanie trwa wiecznie (pomyśl od 30 sekund do wielu minut). Po trzecie, nie mamy już możliwości automatycznego wykrywania celów kompilacji (chociaż jeden z moich współpracowników narzeka na mnie, nie rozumiem, co nam to dało). Na koniec wspomniany współpracownik lubi stale wspominać o tym, że nie możemy już wykonać pełnej kompilacji na naszej lokalnej maszynie (chociaż nigdy nie widziałem, co nas to przyniosło, biorąc pod uwagę, że trwało to trzy razy dłużej niż kompilacja rozproszona; ja myślę, że jest po prostu paranoicznie boi się, że kiedykolwiek złamie konstrukcję). Teraz, przechodząc do nowego rozwoju, zaczynamy używać g++ i subversion (nie przenosić starego repozytorium, pamiętajcie - tylko dla nowych rzeczy). Ponadto zaczynamy robić więcej testów jednostkowych ("więcej" może dać zły obraz... to bardziej jak **any** ) i testowanie integracji (przy użyciu Pythona). Trudno mi wymyślić, jak dopasować je do mojej istniejącej konfiguracji. Więc gdzie popełniłem błąd filozoficzny? Jak najlepiej postępować dalej (z buildbotem - to jedyny element układanki, nad którym mam licencję), aby moja konfiguracja była rzeczywiście możliwa do utrzymania? Jak zaradzić niektórym słabościom mojego projektu? Co naprawdę sprawdza się w przypadku strategii CI dla dużych (prawdopodobnie nadmiernie) złożonych baz kodu? **EDYTUJ:** Myślałem, że wyjaśniłem swój problem, ale oczywiście nie byłem wystarczająco jasny. _nie_ szukam propozycji zmiany platform CI. To **nie** się wydarzy, a odpowiedzi sugerujące, że nie zostaną zaakceptowane. _Chcę_ wiedzieć, jak inni ludzie zarządzają skomplikowanymi bazami kodu za pomocą CI. Mam **tuzin do kwadratu** różnych produktów i mam zależności rozproszone na wietrze i wszystkie są różne. Z TO właśnie chcę wiedzieć, jak sobie radzić.


title: Jakiego narzędzia użyć do tworzenia wydań aplikacji?

text: Zastanawiam się, czego inni używają jako narzędzia do tworzenia ostatecznego opakowania do przekazania klientowi. Na razie oto zadania, które powinna wykonać dla naszej firmy: * zbudować zestaw projektów VS (C#,C++); który zestaw zależy od konfiguracji w wierszu poleceń lub najlepiej w pliku * skopiuj niektóre wyjścia (dll,exe) i pliki nagłówkowe; powinny być konfigurowalne: nie wszyscy klienci otrzymują tę samą funkcjonalność) * stwórz plik zip dla każdej konfiguracji Dodatkowe funkcje, które nie są jeszcze potrzebne, ale mogą być w przyszłości: * załaduj go na jakąś stronę internetową (jesteśmy nadal nie jestem pewien, czego użyjemy.. może to być ftp lub system versioning). Właściwie byłoby wspaniale, gdyby narzędzie mogło utworzyć wpis na stronie Confluence. * zamiast plików zip możemy przełączyć się na instalatory, choć myślę, że nie powinno to zbytnio zmienić W tej chwili mam pierwsze kroki opisane w pliku wsadowym, który pobiera kilka argumentów, i głównym pliku wsadowym, który wywołuje go dla każdej konfiguracji. Działa, ale nie mogę przyzwyczaić się do składni wsadowej i teraz buduję, wywołując devenv.exe, który wydaje się powolny i podatny na błędy, ponieważ bierze pod uwagę plik .suo. Myślałem o zrobieniu wszystkiego jeszcze raz w msbuild, ale najpierw chciałbym usłyszeć więcej opinii na ten temat. Chciałbym również wiedzieć, jakich narzędzi używają duże firmy do dużych produktów.


title: Książki na temat tworzenia niestandardowego interfejsu iPhone'a?

text: Rozglądałem się za książką o projektowaniu i rozwijaniu niestandardowych interfejsów dla iOS, ale nie wydaje mi się, abym mógł znaleźć żadnych książek na ten temat i zastanawiałem się, czy ktoś tutaj znał jakieś książki na temat projektowania i rozwoju niestandardowych Interfejsy i aplikacje iOS. Ponadto nie znam żadnych innych pytań zadawanych na tej stronie, więc jeśli są, daj mi znać, a zagłosuję za usunięciem :) Z góry dziękuję!


title: Gdzie śledzić skrypty edycji wsadowej?

text: Czasami przydatne jest napisanie skryptu, który przeprowadzi edycję wsadową kilku plików w drzewie źródłowym. Taki skrypt jest zazwyczaj bardzo specyficzny i używany tylko raz. Takie skrypty mogą być użyte do przerobienia niektórych identyfikatorów w kodzie, modyfikacji komentarzy nagłówka pliku, edycji ścieżki zasobu i tym podobnych. Chcę podkreślić, że niepokoi mnie przypadek, w którym skrypt rozwiązuje wyjątkowy problem, tak aby nie mieścił się w zwykłym cyklu pracy projektu. Myślę, że ważne jest, aby rejestrować te skrypty i odwoływać się do ich użycia w dzienniku RCS. Gdzie jest odpowiednie miejsce do przechowywania tego rejestru? Czy powinny być dodane do opisu zatwierdzenia w dzienniku RCS? Czy należy je dodać do opisu biletu przetwarzanego przedmiotu, gdy są używane? Czy należy je zapisać jako zwykłe pliki w projekcie i dodać do RCS, mimo że ich użycie jest uważane za unikatowe? Czy jest inny sposób?


title: Odnośnie tłumaczy ustnych

text: Rozumiem, że interpreter może wykonać jedną z następujących rzeczy (i prawdopodobnie więcej): 1. Bezpośrednie wykonanie kodu źródłowego języka programowania. 2. Najpierw przetłumacz kod źródłowy na jakiś kod pośredni (który jest mniej czytelny dla człowieka i bardziej wydajny lub łatwiejszy do wykonania przez interpreter), a następnie wykonaj ten kod. Moje pytania to: 1. Czy to założenie jest prawdziwe? Czy dobrze rozumiem ogólną funkcję tłumacza ustnego? A może coś, co napisałem źle? 2. Jeśli moje założenia są prawdziwe, która z tych dwóch możliwych funkcji jest bardziej powszechna? Proszę pokazać przykłady.


title: Gdzie powinienem zdefiniować stałe w skryptach?

text: Pisząc skrypty przy użyciu nowoczesnego języka skryptowego, m.in. Powershell czy JavaScript, gdzie powinienem zdefiniować stałe? Czy powinienem uczynić wszystkie stałe globalnymi dla czytelności i łatwości użycia, czy ma sens definiowanie stałych jak najbliżej ich zakresów (w funkcji, na przykład, jeśli nie jest to potrzebne gdzie indziej)? Mam na myśli głównie komunikaty o błędach, identyfikatory błędów, ścieżki do zasobów czy opcje konfiguracyjne.


title: Jaka jest najlepsza praktyka, kiedy sprawdzać, czy coś trzeba zrobić?

text: Powiedzmy, że mam funkcję, która wykonuje `x`. Przekazuję mu zmienną, a jeśli zmienna nie jest pusta, wykonuje jakąś akcję. Mam tablicę zmiennych i zamierzam uruchomić tę funkcję na każdej z nich. Wewnątrz funkcji wydaje się, że dobrą praktyką jest sprawdzenie, czy argument jest pusty przed kontynuowaniem. Argument null nie jest błędem, po prostu powoduje wczesny powrót. Mógłbym zapętlić tablicę i przekazać każdą wartość do funkcji, a funkcja będzie działać świetnie. Czy istnieje jakaś wartość sprawdzania, czy var ma wartość null i wywoływania funkcji tylko wtedy, gdy nie ma wartości null podczas pętli? To podwaja się podczas sprawdzania wartości null, ale: * Czy jest jakaś zyskana wartość? * Czy jest jakiś zysk z nie wywołania funkcji? * Jakiś wzrost czytelności w pętli w kodzie nadrzędnym? Ze względu na moje pytanie załóżmy, że sprawdzanie wartości null będzie _zawsze_ mieć miejsce. Widzę, jak sprawdzanie niektórych właściwości obiektu może się zmieniać w czasie, co sprawia, że pierwsze sprawdzenie jest złym pomysłem. Przykład pseudokodu: for(thing in array) { x(thing) } Versus: for(thing in array) { if(thing not null) x(thing) } Jeśli są problemy związane z językiem, jestem programistą praca w PHP i JavaScript.


title: Czy VB.NET jest realną ścieżką migracji dla aplikacji, która jest obecnie napisana w języku VBScript?

text: Nasza aplikacja C++ MFC daje użytkownikowi możliwość definiowania własnych skryptów w vbscript (poprzez silnik VBScript). Ponieważ (części) aplikacja i tak przenosi się na .NET, a vbscript wydaje się być starszą technologią, myślimy o dodaniu nowego komponentu skryptowego, w którym użytkownik może dodawać swoje skrypty jako VB.NET. Argumenty przemawiające za VB.NET to: * Użytkownicy są już "przyzwyczajeni do" składni * Automatyczna konwersja ze skryptów vscript do skryptów VB.NET będzie łatwiejsza dzięki podobieństwom składniowym Jakie inne argumenty za (lub przeciw) VB.NET jako in- język skryptowy aplikacji czy istnieje? Zauważ, że użytkownicy piszący te skrypty _nie_ są programistami z zawodu, więc każda alternatywa musi to wziąć pod uwagę.


title: Tabele bezklasowe są możliwe dzięki Datamapperowi?

text: Mam klasę Item z następującymi atrybutami: `itemId,name,weight,volume,price,required_skills,required_items`. Ponieważ ostatnie dwa atrybuty będą wielowartościowe, usunąłem je i stworzyłem nowe schematy, takie jak: `itemID,required_skill` (`itemID` to klucz obcy, `itemID i required_skill` to klucz podstawowy). aby utworzyć/korzystać z tej nowej tabeli. Oto opcje, które przyszły mi do głowy: 1) Relacja między Items a Required_skills jest typu jeden-do-wielu, więc mogę utworzyć klasę RequiredSkill, która należy do Item, która z kolei ma n RequiredSkills. Wtedy mogę zrobić `Item.get(1).requiredskills`. To brzmi dla mnie najbardziej logicznie i zapewnia mi metody i zapytania takie jak: sugar.components.create :sur_material => water.name sugar.components.create :sur_material => sugarcane.name sugar.components sugar.components.count 2) Ponieważ wymagane_umiejętności mogą być traktowane jako stałe (ponieważ przypominają reguły), mogę umieścić je w bazie danych hash lub gdbm lub innej tabeli sql i zapytaniu z tego miejsca, czego nie wolę. Moje pytanie brzmi: czy istnieje coś takiego jak tabela bezmodelowa w datamapperze, gdzie datamapper jest odpowiedzialny za tworzenie i integralność tabeli i pozwala mi na zapytanie w sposób datamapper, ale nie wymaga klasy, tak jak mogę to zrobić w sql ? Rozwiązałem swój problem, korzystając z pierwszego sposobu: stworzyłem nową klasę dla każdego procesu normalizacji (która pojawia się jako skojarzenie jeden-do-wielu powyżej). Jednak jestem nowy w programowaniu obiektowym i nie wiem, czy tworzenie nowej klasy dla każdej takiej normalizacji jest zwykłym sposobem na zrobienie tego w datamapperze, czy raczej hackiem? To i czy istnieje lepszy sposób na zrobienie tego, to jest to, co chciałbym wiedzieć. # @JustinC **Ponowne czytanie skojarzeń thedatamapper.org kilka razy, teraz widzę, że datamapper z pewnością wymaga oddzielnych klas dla złączeń. Więc odpowiedziałeś na moje pytanie. Jednak odkąd Robert Harvey umieścił nagrodę, czuję się odpowiedzialny, aby trochę poczekać na odpowiedź dotyczącą sposobu dynamicznego.** Twój kod skarżył się: „Nie można znaleźć kontenera child_model for Item w kontenerach”. Udało mi się to uruchomić z drugim przykładem asocjacji autoreferencyjnych, jak poniżej (umieszczając tutaj jako referencję do innych): class Item class Link include DataMapper::Resource storage_names[:default] = "requirement_links" among_to :require, "Item ", :key => true should_to :required, "Item", :key => true end include DataMapper::Resource property :id, Serial property :name, String, :required => true has n, :links_to_required_items, "Item ::Link", :child_key => [:require_id] ma n, :links_to_requiring_items, "Item::Link", :child_key => [:required_id] ma n, :required_items, self, :through => :links_to_required_items, : via => :required ma n, :requiring_items, self, :through => :links_to_requiring_items, :via => :require def require(inne) required_items.concat(Array(inne)) save self end def nie wymagaj(inne) links_to_required_items.all(:required => Tablica(inne)).destroy! reload self end end Więc mogę to zrobić: galaretka = Item.get :name => "Jelly" sugar = Item.get :name => "Sugar" jelly.require sugar to item and: jelly.required_items.each { |i |; umieszcza i.name } na liście wymagań, które są naprawdę świetne. Po przeczytaniu Twojej odpowiedzi widzę, że muszę jeszcze znormalizować schemat mojej bazy danych. Szczerze mówiąc, nie widzę sensu definiowania relacji między surowcami a produktami jako autoreferencyjnej. To znaczy, gdyby to był mały program, z pewnością użyłbym hasha takiego jak `{:jelly => :sugar => 3, :water => 5"}` do odzwierciedlenia wymaganych pozycji i ilości, zgodnie z zasadą YAGNI . Robienie tego tak, jak w pierwszej opcji, już zapewnia mi zapytania i metody tak proste, jak te, które zapewnia asocjacja autoreferencyjna. **(Muszę jednak przyznać, że wygląda to bardziej jak procedura składowana niż wywołanie metody do obiektu.)** Czy mógłbyś więc wyjaśnić korzyści płynące z używania asocjacji autoreferencyjnej, która jest trudna do zrozumienia /wdrożyć dla mnie, w porównaniu z moim prostszym podejściem? Jestem nowy w OOP i zastanawiam się, czy jestem trochę niedomodelowany.


title: Pusta metoda wirtualna na metodach abstrakcyjnych klasy bazowej VS

text: Nie mogłem znaleźć pytania, które nie byłoby zbyt specyficzne dla jakiegoś przypadku, więc postaram się uczynić to bardzo ogólnym. Potrzebujemy na przykład klasy bazowej ekstraktora do zbioru dokumentów. Każdy dokument ma swoje specyficzne właściwości, ale ostatecznie są to dokumenty. Dlatego chcemy zapewnić wspólne operacje ekstrakcji dla nich wszystkich. Mimo, że wszystkie są dokumentami, jak powiedziałem, są nieco inne. Niektóre mogą mieć pewne właściwości, ale niektóre nie. Wyobraźmy sobie, że mamy podstawową klasę abstrakcyjną `Document` oraz klasy `FancyDocument` i `NotSoFancyDocument`, które z niej dziedziczą. `FancyDocument` ma `SectionA`, `NotSoFancyDocument` nie ma. To powiedziawszy, czego broniłbyś jako najlepszego sposobu realizacji tego? Oto dwie opcje: * **Puste metody wirtualne w klasie bazowej** Puste metody wirtualne w klasie bazowej pozwoliłyby programiście na przesłonięcie tylko tych metod, które mają sens dla różnych typów dokumentów. Wtedy mielibyśmy domyślne zachowanie w abstrakcyjnej klasie bazowej, która zwracałaby `default` dla metod, tak jak to: public abstract class Document { public virtual SectionA GetDocumentSectionA() { return default(SectionA); } } public class FancyDocument : Document { public override SectionA GetDocumentSectionA() { // Konkretna implementacja } } public class NotSoFancyDocument : Document { // Nie implementuje metody GetDocumentSectionA, ponieważ nie ma sekcji A } * **Konkretne puste metody lub konkretne metody rzucające `NotImplementedException`** Ponieważ `NotSoFancyDocument` **nie** ma `SectionA`, ale inne mają, możemy albo po prostu zwrócić _default_ dla metody w nim zawartej, albo rzucić ` NotImplementedException`. Zależałoby to od tego, jak program został napisany i od kilku innych rzeczy. Moglibyśmy wymyślić coś takiego: //// Zwróć wartość domyślną public abstract class Document { public abstract SectionA GetDocumentSectionA(); } public class FancyDocument : Document { public override SekcjaA GetDocumentSectionA() { // Konkretna implementacja } } public class NotSoFancyDocument : Document { public override SekcjaA GetDocumentSectionA() { return default(SectionA); } } **LUB** //// Zgłoś wyjątek public abstract class Document { public abstract SectionA GetDocumentSectionA(); } public class FancyDocument : Document { public override SekcjaA GetDocumentSectionA() { // Konkretna implementacja } } public class NotSoFancyDocument : Document { public override SekcjaA GetDocumentSectionA() { throw new NotImplementedException("NotSoFancyDocument nie ma sekcji A"); } } Osobiście uważam, że podejście oparte na metodzie abstrakcyjnej jest lepsze, ponieważ oznacza "Hej, potrzebuję, żebyś mógł sprawić, by sekcja A była dokumentem. Nie obchodzi mnie jak". podczas gdy metoda wirtualna oznacza „Hej, mam tutaj tę sekcję A. Jeśli to nie jest dla ciebie wystarczająco dobre, możesz zmienić sposób, w jaki ją odbieram”. Myślę, że pierwszy z nich jest oznaką zapachu programowania obiektowego. Jakie są twoje opinie na ten temat?


title: Czy system może być w 100% oparty na danych?

text: Mój nowy szef pracował nad tym projektem od wielu lat. Jestem tu dopiero od kilku tygodni, ale nie jestem pewien, czy to możliwe. Chciałby zaprojektować system, który jest „w 100% oparty na danych”. Jeśli więc włożymy wystarczającą ilość danych, możemy zdefiniować i wygenerować dowolną aplikację. Udało mi się przynajmniej zmusić go do przyznania pewnych rzeczy, takich jak użytkownicy lub aplikacje, które powinny mieć predefiniowane wartości, ale podoba mu się koncepcja struktury systemu, interfejsu użytkownika i logiki, które są przechowywane jako dane. Jest kilka demonstracji prostych rzeczy, a on w zasadzie na nowo odkrył kilka prostych idei programowania obiektowego i podstawowych systemów szablonów, ale ogólnie myślę, że ten cel może być faktycznie niemożliwy. Nie wiem, jak można zdefiniować logikę za pomocą danych, aby system nie stał się tak złożony, że i tak robisz faktyczne programowanie. Myślę, że teoretycznie nie jest tak, ponieważ rzecz, która interpretuje dane, musi być kompletna, aby opisać aplikację, więc właśnie przesunąłeś problem o jeden poziom wyżej do braku korzyści netto. Czy taka aplikacja w 100% oparta na danych jest możliwa?


title: Język obejmujący stan zmienny?

text: Wydaje się, że istnieje trend w kierunku niezmiennych obiektów i czystego programowania funkcyjnego. Chociaż dostrzegam korzyści, trudno jest mi zastosować te zasady na przykład do programowania GUI. Ale znajduję również klasyczne języki imperatywne, w których brakuje zmiennych obiektów. Zastanawiałem się, czy istnieje język lub system, który _obejmuje_ mutowalny stan i sprawia, że praca z nim jest szczególnie łatwa. Poniżej znajduje się kilka funkcji, które uważam za „zaprojektowane wokół zmienności”: * Możliwość łączenia zdarzeń i otrzymywania powiadomień o zmianach dla dowolnej zmiennej. Ułatwiłoby to pisanie GUI i aplikacji MVC. Mógłbyś po prostu stworzyć `List<MyObject>` i umieścić go w widżecie listy, a przy odrobinie konfiguracji mógłby zarządzać twoją listą za ciebie, bez ręcznego listview.insert() itp. * System typów, który uważa stan. Na przykład, jeśli przekażę `Car` do funkcji, która wymaga działającej funkcji, kompilator powinien spróbować udowodnić, że `car.broken == False`. Jeśli nie może tego udowodnić, nie skompiluje się i muszę to zapewnić (umieszczając kod w bloku `if` lub ustawiając go ręcznie na False). * Podejście do współbieżności, które ma sens w przypadku zmiennych obiektów. Na przykład instrukcja „atomowa”, która gwarantuje, że pewne instrukcje są uruchamiane razem, przy użyciu transakcji lub blokad. Celem nie jest wydajność, ale łatwość obsługi i responsywność GUI. Powinienem być w stanie manipulować danymi i GUI z dowolnego wątku, używając `atomic {step1; step2}` aby zapewnić niezmienniki. Nie szukam systemu z tymi _dokładnymi_ funkcjami, ale napisanego w podobnym duchu. Najbliższy, jaki widziałem, to C#/.NET z funkcjami powiązania danych. Gtk + ma niestandardowe ListModels, które utrzymują GtkTreeView w taki sam sposób jak Twoje dane bez ręcznych wstawek/aktualizacji. Android ma ListAdapters, które są podobne. Nie znalazłem GUI bezpiecznego dla wątków, ale można się do niego zbliżyć z liberalnym użyciem `Invoke()` w C#/WinForms lub `gobject_idle_add` w Gtk+. Czy są jakieś systemy podobne do tych, które opisuję? Lub materiały badawcze, referencje itp.?


title: Jak można dostosować Scrum do środowiska Wolontariusza?

text: Niedawno dołączyłem do młodego hakera, który wciąż się tworzy. Mamy szczęście, ponieważ w przestrzeni jest kilka wewnętrznych projektów, nad którymi trzeba popracować i nie brakuje wolontariuszy do pracy nad nimi. Odbyło się kilka dyskusji na temat organizacji tych projektów. Moje ostatnie doświadczenie zawodowe związane jest ze Scrumem, więc rozważam wprowadzenie podejścia Scrum do naszych projektów oprogramowania, ale nie jestem pewien, czy będzie to dobre dopasowanie. Chociaż widziałem, jak Scrum dobrze sprawdza się w małych pełnoetatowych zespołach, charakter tej organizacji jest inny: * Członkowie to **wolontariusze**. Niektórzy są studentami studiów dziennych. Inni pracują na pełny etat. Nie możemy oczekiwać od nikogo stałego wkładu, ponieważ ich prawdziwe życie jest najważniejsze. * Chociaż prawie każdy ma wieloletnie doświadczenie w pisaniu oprogramowania, niewielu członków robi to zawodowo lub w zespołach. * **Nie ma Właściciela Produktu**. Wymagania dla tych projektów są określane przez komisję. Członkowie tego komitetu będą również pracować nad wdrożeniem. Oznacza to, że nie będziemy mieć jednego, dedykowanego Właściciela Produktu. * **Nie mamy terminów** (miękkich lub twardych). Projekty zakończą się, gdy zostaną wykonane. To dość znaczące różnice, ale nie jestem przekonany, że będą blokować stosowanie Scruma. Myślę, że drobne poprawki mogą pomóc nam pokonać tę przeszkodę: * Jeśli zmienimy Sprinty, aby miały stały rozmiar punktu fabularnego, ale **czas trwania płynności** (czas), nadal możemy korzystać z iteracyjnych wydań bez wywierania nierealistycznej presji na dostarczanie programiści-wolontariusze. * Możemy zrezygnować z **wykresów spalania** i **obliczeń prędkości**. Jeśli dobrze rozumiem, są to narzędzia i metryki, które działają jako pomost między zespołem programistów a Zarządem. Służą one do raportowania postępów w formie, która ma znaczenie zarówno dla deweloperów, jak i interesariuszy. Biorąc pod uwagę, że nie mamy do kogo się zgłosić (żadnego kierownika projektu, właściciela produktu ani zewnętrznych interesariuszy), uważam, że możemy całkowicie zrezygnować z tego. Rzeczy, z których, jak sądzę, moglibyśmy skorzystać, a które nie będą wymagały zmian: * Spotkania **Zbierania wymagań**. Gdzie wszyscy siedzą przy stole i omawiają historie użytkowników, szkicują makiety interfejsu użytkownika i tworzą Backlog produktu. * Sprint **Retrospektywy**. Będzie to dla nas interesujący sposób na zbliżenie się do procesu rozwoju, który sprawdza się dla nas jako zespołu wolontariuszy. Rzeczy, których nie jestem pewien: * Jak należy traktować codzienne **Stand-upy**? Zastanawiam się, czy miałyby w ogóle dużą wartość w naszym otoczeniu. W moim rozumieniu rytuał wstawania jest taki, że pomaga on w komunikacji poprzez naturalne rozpowszechnianie informacji w całym zespole. Biorąc pod uwagę fakt, że nasze Sprinty będą prawdopodobnie dostarczać znacznie mniej złożoności niż przeciętny Sprint, może być mniej potrzeby bycia na bieżąco z postępami/rozwojami innych członków zespołu. * Czy powinienem naciskać na **XP** takie rzeczy, jak ciągła integracja, przeglądy kodu i TDD? Obawiam się, że będzie to wymagało dużo. Bardziej kusi mnie, aby wprowadzić te koncepcje do przyszłych projektów, gdy ludzie będą bardziej zaznajomieni ze Scrumem i pracować jako zespół. ### Moje pytania: Czy Scrum można dostosować do środowiska opartego na wolontariacie? I czy moje zaplanowane dotychczas podejście idzie w dobrym kierunku?


title: Czy powinienem powtórzyć porzucony projekt danych dynamicznych za pomocą Lightswitch?

text: Miałem mały projekt, który robiłem na boku. Było to w zasadzie kilka formularzy powiązanych z DB. Access został wycofany, ponieważ miał być aplikacją internetową. Będąc małym projektem korzystałem z danych dynamicznych ASP.NET, ale z różnych powodów projekt zakończył się przed wdrożeniem. Niedawno spotkałem się z klientem i powiedział, że nadal jest taka potrzeba. Rozważam ponowne uruchomienie projektu z dynamicznymi danymi, ale widziałem kilka demonstracji Lightswitch i byłem pod wrażeniem wersji BETA. Poczekam na RTM, jeśli go użyję, ale czy dobrym pomysłem jest użycie Lightswitch do zastąpienia danych dynamicznych? Ilość pracy, jaką włożyłem w witrynę danych dynamicznych, tak naprawdę nie stanowi problemu. Informacje dodatkowe: Jest to system, który śledzi produkcję w małej fabryce z podziałem na linię, maszynę, sekcję i generuje raporty. Domyślam się, że struktura danych pozostanie dość stała w czasie, ale wymagania dotyczące raportowania będą rosły. Inną rzeczą jest to, że fabryka jest częścią większej grupy i mam nadzieję, że jeśli ten system się powiedzie, podobne prace będą czekały na inne fabryki.


title: Przeważnie wytwarzają dane wyjściowe w pracy programistycznej, ale niczego się nie uczą

text: Kiedy zacząłem pracować jako programista, na początku wiele się nauczyłem w pracy. Chociaż powierzono mi większą odpowiedzialność, co w pewnym sensie jest dobre, to głównie w postaci zwiększonego obciążenia pracą. Nie miałam zbyt wiele czasu ani energii, aby codziennie uczyć się czegoś nowego. Czasami pod koniec dnia zostaje mi 1 godzina czasu i energii, ale zazwyczaj po prostu tworzę dużo tego samego typu kodu. Poświęcenie godzin pracy na produkcję ma sens, ponieważ jest to powód, dla którego programista jest szkolony i zatrudniany. Jednak martwię się, czy pozostanę w tyle jako programista, robiąc to, do czego zostałem zatrudniony, nawet jeśli nie uczę się wiele nowego. Czy to standard dla większości programistów?


title: Najbardziej wydajny sposób na odbudowanie struktury drzewa z danych

text: Masz pytanie dotyczące rekursywnego wypełniania JsTree przy użyciu otoki platformy .NET dostępnej za pośrednictwem NuGet. Każda pomoc byłaby bardzo mile widziana. klasa .NET JsTree3Node ma właściwość o nazwie Children, która przechowuje listę JsTree3Nodes, a istniejąca wcześniej tabela zawierająca strukturę węzłów wygląda tak > > NodeId ParentNodeId Data AbsolutePath > 1 NULL News /News > 2 1 Financial /News/ Financial > 3 2 StockMarket /News/Financial/StockMarket > Mam kontekst danych EF z bazy danych, więc mój kod wygląda obecnie tak. var parentNode = new JsTree3Node(Guid.NewGuid().ToString()); foreach(var nodeItem in context.Nodes) { parentNode.Children.Add(nodeItem.Data); // Jaka jest najbardziej wydajna logika, aby robić to rekurencyjnie? } jak mówi komentarz inline w powyższym kodzie, jaki byłby najbardziej efektywny sposób załadowania danych JStree do obiektu `parentNode`. Mogę zmienić istniejącą tabelę węzłów, aby dopasować ją do logiki, więc zachęcam do sugerowania wszelkich zmian w celu poprawy wydajności.


title: Wskazówki / pułapki związane z pracą nad projektem zleconym na zewnątrz

text: Moja firma zaangażowała firmę zewnętrzną, która opracowała dla nas aplikację na iPhone'a. Jako jedyny wewnętrzny programista posiadający jakąkolwiek wiedzę na temat Objective-C, zostałem przydzielony do opracowania odpowiednich interfejsów API na naszej stronie, ale także do zrobienia wszystkiego, co w mojej mocy, aby upewnić się, że całość złoży się na czas. Jakieś sugestie dotyczące rzeczy, które powinienem zrobić lub rzeczy, na które powinienem uważać, szczególnie od tych, którzy już wcześniej byli na tej drodze?


title: Wspólne implementacje Lisp - wielowątkowość i wieloplatformowość?

text: Uczę się Common Lisp, głównie jako hobby "mind gym", ale chcę skończyć z zestawem umiejętności, które będą również przydatne "w prawdziwym życiu", ponieważ kiedy uczysz się języka, gromadzisz również wiedzę na temat zarządzanie modułami i pakietami, wdrażanie i inne rzeczy, czy ci się to podoba, czy nie, więc chcę się uczyć z implementacją CL, która jest również użyteczna w produkcji. Więc moje pytanie brzmi: **Jaka implementacja CL jest najbardziej użyteczna "w produkcji", mając takie atrybuty? :** * jest **wieloplatformowa** \- powinno być możliwe używanie tej samej implementacji języka i języków na serwerze Linux, maszynie deweloperskiej z systemem Windows i MacOS (najfajniejszą rzeczą byłaby możliwość skompilowania dla Androida, Windows Phone i RT, a może nawet iOS) * ma dobre funkcje **współbieżności** , **równoległości** , **wielowątkowości** - i te funkcje działają _na wielu platformach_ , w przeciwnym razie nie liczyć * łatwo jest **interfejs z innymi językami** \- praca z bibliotekami C jest koniecznością, ale wszystko inne, takie jak łatwy interfejs CL-Python, byłoby miłe, nalegam na część wieloplatformową, ponieważ znam ją z poważnych argumentów przemawiających za rezygnacją z CL przez Reddit (CMUCL - btw, wiem, że SBCL to rozwidlenie CMUCL, ale jak oni porównują?) było to, że programiści nie mogli po prostu używać swoich komputerów Mac do programowania bez ssh'd w środowisku serwera deweloperskiego (cytat: _"Na moim Macu mój wybór wątkowych implementacji Lisp był ograniczony do OpenMCL, a we FreeBSD jest to CMUCL."_ ). Tak, można użyć dev VM, ale nadal... * * * _**Uwaga #1:** Byłem bliski osiedlenia się na **CLISP**, ale nie wiem o jego funkcjach współbieżności, a ja natknąłem się również na to: „to wszystko wymusza, aby twój kod został wydany jako GPL” (nie rozumiem, co to oznacza ani w jaki sposób licencja języka może zostać narzucona na twój kod, ale nie znam biegle języka prawniczego. ..)._ _**Uwaga #2:** Nie przepadam za JVM, a jeśli miałbym używać na niej Lispa, byłby to Clojure i nic więcej, więc nie ma sugestii JVM Lisps, proszę: )_


title: Czy istnieje szybki i praktyczny (praktyczny) sposób na naukę innego języka programowania?

text: Ze względu na dość dziwne okoliczności mam tylko do poniedziałku na naukę (przynajmniej) podstaw programowania w PHP i .NET. Jestem już dość kompetentny (choć jest dużo miejsca na ulepszenia) w C++, więc czuję, że mam już pewne koncepcje, ale muszę zagłębić się w te dwa języki w bardzo krótkim czasie rama. Niestety nie będę miał czasu na zdobycie książek, więc będę musiał korzystać wyłącznie z zasobów internetowych, jestem raczej „wykonawcą”, więc każdy sposób sprawdzenia moich umiejętności w praktyczny sposób byłby ogromnym bonusem :-)


title: Licencja CLISP Common Lisp — czy może wymusić wydanie mojego kodu na licencji GPL?

text: Natknąłem się na to na temat CLISP: *"to wszystko, ale wymusza, aby twój kod został wydany jako GPL" tutaj, gdy szukałem dobrej implementacji Common Lisp. **Jak język może wymusić licencję na Twój kod?** Czy to tylko FUD? Pytam, bo tak naprawdę nie mówię "legalistycznie", więc może jest coś, czego tu nie rozumiem... Rozumiem, że język to GPL i kompiluje się do postaci kodu bajtowego, ale czy nie mam mój program z dowolnymi licencjami? * * * EDYTOWANO: CMUCL -> CLISP (miałem głowę w złym miejscu, kiedy pierwszy raz pisałem pytanie, przepraszam...)


title: Czy aplikacja mobilna potrzebuje większego dostępu niż publiczny interfejs API witryny?

text: Mam witrynę z publicznym interfejsem API, a niektórzy programiści aplikacji mobilnych zostali poproszeni o stworzenie aplikacji na iPhone'a dla tej witryny. Twierdzą, że muszą zobaczyć schemat bazy danych, ale jak rozumiem, powinni potrzebować tylko dostępu do udokumentowanego publicznego interfejsu API. Czy mam rację? Czy jest coś, co przegapiłem? Powiedziałem im, że jeśli brakuje jakiejś funkcji lub danych, których potrzebują, mogę rozszerzyć API, aby mogli uzyskać do nich dostęp. Myślałem, że API usługi sieciowej opiera się na tych samych zasadach, co API obiektów OOP, w tym sensie, że szczegóły implementacji powinny być ukryte tak bardzo, jak to możliwe. Nie jestem programistą aplikacji mobilnych, więc jeśli jest coś, czego nie widzę, daj mi znać. Każdy wgląd lub pomoc będą mile widziane. * * * Aktualizacja: Zespół mobilny jest częścią finansowanej przez rząd usługi doradczej dla start-upów. Od tamtej pory dowiedziałem się, że kierownik projektu, który tak bardzo naciskał, aby zobaczyć bazę danych i inne elementy wewnętrzne, pracuje również dla agencji zajmującej się tworzeniem stron internetowych. Nie mogę powiedzieć z całą pewnością, jakie były jego powody, dla których chciał zobaczyć te rzeczy, ale biorąc pod uwagę, że ani razu nie podał _ważnego_ technicznego powodu, uważam to za jeszcze bardziej niepokojące niż wtedy.


title: Dlaczego podpisujemy plik .JAR ? lub tag na githubie?

text: Mam pytanie: * Dlaczego muszę podpisywać plik `.JAR` używając `jarsigner`? * czy jest jakiś konkretny powód lub zastosowanie tego ? * To samo pytanie, gdy oznaczę wersję na github?


title: Jako student, jakie techniki stosowane na wydziale pomogły Ci najbardziej nauczyć się?

text: Dostaję się na bardziej zaawansowane zajęcia z programowania na moim uniwersytecie i czuję, że napotykam oczywiste niedociągnięcia w tworzeniu kodu wysokiej jakości. Na przykład moja klasa struktur danych pozwala nam czytać listę utworów, tworzyć obiekty Song, a następnie używać różnych struktur do zaimplementowania wyszukiwania wykonawców, tytułów, słów i fraz tekstowych. Profesor podaje nam listę przykładów testów, aby udowodnić, że kod daje oczekiwane wyniki, a oceny są oparte na funkcjonalności, kompletności i świadomości błędów. Obecnie mam średnią 90 w tej klasie, ale nie jestem zadowolony z tego, że mój kod jest dobrej jakości. Jakich technik użyli profesorowie na uczelni, aby skłonić Cię do pisania lepszego kodu?


title: Wyjaśnij zasadę otwierania/zamykania

text: Jak już wyjaśniłem, zasada otwórz/zamknij mówi, że raz napisany kod nie powinien być modyfikowany (poza poprawkami błędów). Ale czy jeśli zmienią się moje reguły biznesowe, nie powinienem modyfikować kodu implementującego te zmiany? Podejrzewam, że nie rozumiem czegoś na temat tej zasady, ponieważ nie ma to dla mnie sensu.


title: Dlaczego język DART nie używa znaku specjalnego do identyfikowania zmiennych?

text: Pochodzę ze środowiska PHP i zastanawiałem się nad bardziej szczegółowym spojrzeniem na DART. DART to open source'owy, front-endowy/back-endowy język do tworzenia stron internetowych. PHP ma specjalny znak $ (dolara), który wskazuje zmienne: $zmienna CONSTANT 'ciąg' "itd" Uważam, że znak dolara jest bardzo przydatny do przyspieszenia procesu refaktoryzacji, zwłaszcza jeśli kod PHP jest mieszany z HTML lub treścią. Zmniejsza liczbę fałszywych alarmów podczas, powiedzmy, _znajdź i zamień_. Ponieważ DART to zupełnie nowy język (bez spuścizny), który można osadzić w HTML, zaskoczyło mnie, że nie ma on żadnego specjalnego identyfikatora do wskazywania zmiennych. Jakie jest uzasadnienie tej decyzji projektowej?


title: Jak zdobyć praktyczne doświadczenie OOAD i wzorców projektowych w C#?

text: Przeczytałem koncepcje i przećwiczyłem kilka przykładów dotyczących OOAD i wzorców projektowych. Ale kiedy poproszono mnie o zaimplementowanie wzorca singletona w nieco inny sposób, nie byłem w stanie tego zrobić i nie osiągnąłem swojego celu. Myślę, że potrzebuję bardziej dogłębnego zrozumienia podstaw i prawdziwego doświadczenia z koncepcjami. Zaproponuj mi kilka dobrych książek i mini projektów, aby zdobyć doświadczenie w zakresie OOAD i wzorców projektowych w C#. Mam prawie 9 miesięcy na ponowne podejście do testu. Zrobiłem to dla singletona. To poprawny kod. Zostałem jednak poproszony o zaimplementowanie w taki sposób, abym mógł stworzyć instancję klasy DBConnection tylko raz. użyj tego wystąpienia, aby uzyskać obiekt Connection. W tym miejscu nie udało mi się zaimplementować singletona :( class DBConnection { private Connection _conn = null; statyczne Connection GetConnection() { if(_conn ==null) _conn = new Connection(...); return _conn; } }


title: algorytm do tworzenia wszystkich możliwych wektorów kolumnowych o rozmiarze N zawierających tylko jedynki i zera

text: Jestem studentem matematyki i dopiero zaczynam uczyć się programowania. Utknąłem na konkretnym programie, który próbuję napisać dla zabawy. Chcę znaleźć algorytm do tworzenia wszystkich możliwych wektorów kolumn o rozmiarze N zawierających tylko jedynki i zera i łączenia ich w jedną dużą macierz, umieszczając wszystkie kolumny jedna po drugiej. Kolejność kolumn nie ma znaczenia. Na przykład, jeśli N=3 chcę uzyskać macierz: 0 1 1 1 1 0 0 0 0 0 1 0 1 1 1 0 0 0 0 1 1 0 1 1 która w pionie zawiera wszystkie możliwe kombinacje jedynek i zer o długości 3 .Czy ktoś ma jakiś pomysł jak to zrobić? Niekoniecznie szukam bardzo wydajnego lub sprytnego sposobu, aby to zrobić, ponieważ wartość, której użyję dla N, to 14, więc moja macierz będzie miała 14 x 2^14, czyli 14 x 16384, co nie jest zbyt duże. Ponadto przepraszam za formatowanie mojego pytania, jestem przyzwyczajony do math stackexchange, w którym można używać tekstu LaTeX, aby ładnie wyglądały macierze i równania. Dziękuję każdemu, kto może mi pomóc!


title: Kroki do rozwiązania lub podejście do rozwiązania

text: Podziel się swoimi doświadczeniami na temat podejścia do rozwiązania lub rozwiązania problemu. Dołącz opis narzędzi, których używasz, śledzonych źródeł, wybranych algorytmów itp. Byłoby to bardzo pomocne w poruszaniu się dalej i działa również jako wskazówka.


title: Czy program się nie myli?

text: Zainspirowany licznymi postami o znaczeniu uczenia się Lisp/Schematu, zacząłem uczyć się schematu dwa dni temu, korzystam z książki „Mały intrygant” i ukończyłem połowę tego. Ale nadal nie nauczyłem się niczego nowego, książka uczy o rekurencji, którą już rozumiem i używa lambda (którego mogę wymyślić jako sposób na zdefiniowanie funkcji w C). Nadal nie mam pojęcia o programowaniu funkcjonalnym (proszę wskazać jakiś przykład funkcjonalnego w porównaniu do normalnych metod programowania w C/C++, żebym mógł go zdobyć). Czy uczę się w zły sposób? czy też "Mała intryga" jest dla nowicjusza w programowaniu i powinienem poszukać innych książek?


title: Ile freeware pobiera przeciętny użytkownik?

text: Interesuje mnie ilość wykorzystania oprogramowania freeware (zamkniętego źródła) działającego pod Windows, które nie jest preinstalowane na komputerach PC. Najbliżej takich statystyk spodziewam się, że będzie to ilość darmowego oprogramowania pobranego przez przeciętnego użytkownika. Dobra odpowiedź odnosi się do źródła, które mówi coś w stylu: "Przeciętny użytkownik systemu Windows pobiera 2,3 freeware rocznie". Jeszcze lepszą odpowiedzią jest: „Przeciętny użytkownik Windows spędza 0,04 godziny dziennie korzystając z freeware”. Edycja: Postrzegam to jako ekwiwalent: „Ile kilogramów czekolady zjada przeciętny Rosjanin rocznie”, co jest rodzajem statystyki powszechnie używanej do wstępnej analizy rynku. Zgadzam się, że nadal nie wiesz, czy sprzeda się miętowa czekolada z lekkim smakiem banana, ale masz lepszy pomysł.


title: Czy testy jednostkowe naprawdę są używane jako dokumentacja?

text: Nie potrafię zliczyć, ile razy przeczytałem wypowiedzi w stylu „testy jednostkowe są bardzo ważnym źródłem dokumentacji testowanego kodu”. Nie przeczę, że są prawdziwe. Ale osobiście nigdy nie używałem ich jako dokumentacji. W przypadku typowych frameworków, których używam, deklaracje metod dokumentują ich zachowanie i to wszystko, czego potrzebuję. I zakładam, że testy jednostkowe tworzą kopię zapasową wszystkiego, co podano w tej dokumentacji, plus prawdopodobnie trochę więcej wewnętrznych rzeczy, więc z jednej strony duplikuje dokumentację, az drugiej może dodać więcej, co nie ma znaczenia. Pytanie brzmi: kiedy testy jednostkowe są wykorzystywane jako dokumentacja? Kiedy komentarze nie obejmują wszystkiego? Przez programistów rozszerzających źródło? A co ujawniają, co może być przydatne i istotne, czego sama dokumentacja nie może ujawnić?


title: Pomoc przy złożonych MVVM (wiele widoków)

text: Potrzebuję pomocy w tworzeniu modeli widoków dla następującego scenariusza: 1. Dane głębokie, hierarchiczne 2. Wiele widoków dla tego samego zestawu danych 3. Każdy widok jest pojedynczym, dynamicznie zmieniającym się widokiem, opartym na aktywnym wyborze 4. W zależności od wartość właściwości, wyświetlaj różne typy zakładek w kontrolce zakładki ![tutaj wpisz opis obrazu](http://i.stack.imgur.com/dIvrO.png) Moje pytania: **Czy powinienem utworzyć model widoku reprezentacji dla każdego widoku (VM1, VM2 itd.)?** 1. Tak: Czy powinienem modelować całą relację hierarchiczną? (tj. SubVM1, HouseVM1, RoomVM1) Jak zsynchronizować wszystkie hierarchie? (np. dodawanie/usuwanie węzłów) 2. Nie: Czy używam dużego modelu z jednym widokiem, który obsługuje wszystkie widoki? Oto przykład pojedynczego widoku Rysunek 1: Wiele widoków zaktualizowanych na podstawie aktywnego pokoju. Uwaga Kontrola zakładki ![tutaj wprowadź opis obrazu](http://i.stack.imgur.com/YQ0qj.png) Rysunek 2: Różne aktywne pomieszczenie. Zaktualizowano wiele widoków. Pozycje kontrolki zakładki zmieniane w zależności od właściwości obiektu. ![tutaj wprowadź opis obrazu](http://i.stack.imgur.com/bfZIC.png) Rysunek 3: Różne typy zaznaczenia. Zmiany w całym widoku ![tutaj wprowadź opis obrazu](http://i.stack.imgur.com/Ta17v.png)


title: Czy problemy z użytecznością aplikacji internetowych są równe problemom z użytecznością witryny?

text: Czytałem dwie książki o problemach i testach użyteczności w sieci (Rocket Surgery Made Easy¹ i Prioritizing Web Usability²) i zawierają one kilka strategii i typowych problemów związanych z użytecznością witryny i sposobami ich prowadzenia. Jednak chcę zrobić aplikację internetową i wydaje mi się, że straciłem orientację, co próbuję rozwiązać. Te dwie książki twierdzą, że działają z surowymi witrynami internetowymi (handel elektroniczny, witryny biznesowe, a nawet intranet), ale nie jestem pewien, czy wszystko o użyteczności sieci ma zastosowanie do użyteczności aplikacji internetowych. Z pewnością mówią o tym, że zawsze mają dostępny (i użyteczny) przycisk Wstecz, aby skupić się na krótkich informacjach, a nie na dużych ilościach tekstu itp., Ale mogą być niedokładne w głębszych problemach, które mogą być łatwiejsze (lub po prostu do pominięcia) na zwykłych stronach internetowych . Czy ktoś ma jakieś doświadczenie w tej dziedzinie i mógłby mi powiedzieć, czy **zarówno aplikacje internetowe, jak i strony internetowe mają problemy z użytecznością?** Z góry dziękuję **Edytuj:** Cytując Wikipedię, witryna _jest zbiorem powiązanych stron internetowych zawierających obrazy, filmy lub inne zasoby cyfrowe_ , a aplikacja internetowa _jest aplikacją dostępną przez sieć, taką jak Internet lub intranet_. Podsumowując, obie pokazują/pozwalają wyszukiwać/produkować informacje, ale strony internetowe są „proste” w interakcji i zachowują klasykę stron internetowych (działania jednym kliknięciem), a ta druga jest bliższa aplikacjom desktopowym w sensie ich zastosowań i sposobów interakcji (podwójne kliknięcie, okna modalne, wywołania asynchroniczne [aby utrzymać Cię w tym samym „środowisku” zamiast ponownego ładowania] itp.). Nie wiem, czy to wyjaśnia różnicę. **Edycja 2:** Cytując @Victora i mnie, witryna to wszystko, co działa w przeglądarce, ale aplikacja internetowa działa w przeglądarce, która może działać na komputerze, z podobnym zachowaniem i funkcjami. Gmail to aplikacja internetowa, która może zastąpić Outlooka. GDocs może zastąpić pakiet Office. Grooveshark może zastąpić odtwarzacz muzyki itp.


title: Tworzenie usług internetowych zgodnych z REST bez przestrzegania zasad REST

text: Zbudowałem aplikację, która działa jako interfejs między warstwą EAI a aplikacjami innych producentów. Używam do tego usług internetowych REST-ful, korzystając z JAX-RS API i frameworka Jersey. Chociaż usługi sieciowe mogą wykonywać różne operacje, takie jak anulowanie, przeglądanie, tworzenie, zmiana harmonogramu zamówień, zaimplementowałem je wszystkie jako metody POST. Ale aby usługi sieciowe były zgodne z REST, musimy odpowiednio użyć metod HTTP GET, POST, PUT i DELETE. Tutaj nie ma użytkowników, którzy mogą wyświetlić adres URL, który ma być używany, a zatem nie ma w nim udziału „User Experience”. Jest to po prostu adres URL skonfigurowany w warstwie EAI, który pobiera żądanie z ekranów UI\Order Management. Czy w tym scenariuszu naprawdę musimy sprawić, by usługi sieciowe były zgodne z REST? Cokolwiek stworzyłem, czy można je nazwać usługami sieciowymi zgodnymi z REST?


title: Jaki jest najlepszy sposób na zdalne omawianie/planowanie/negocjowanie architektury kodu?

text: Nasz zespół jest rozproszony w czasie i przestrzeni, więc nie mamy możliwości omawiania architektury kodu w czasie rzeczywistym. Jak możemy to omówić poprzez dokumentację: pisać interfejsy kodu/komentować/modyfikować, śledzić historię architektury kodu? Czy są do tego jakieś konkretne narzędzia? Jaki jest najlepszy sposób: diagramy klas, interfejsy kodu, coś innego? Używamy c# i VS2010


title: Czy cały czas piszesz testy jednostkowe w TDD?

text: Od dłuższego czasu zajmuję się projektowaniem i tworzeniem kodu w stylu TDD. To, co niepokoi mnie w TDD, to pisanie testów dla kodu, który nie zawiera żadnej logiki biznesowej ani ciekawego zachowania. Wiem, że TDD jest bardziej czynnością projektową niż testowaniem, ale czasami czuję, że pisanie testów w takich sytuacjach jest bezużyteczne. Na przykład mam prosty scenariusz typu **"Kiedy użytkownik kliknie przycisk sprawdzania, powinien sprawdzić poprawność pliku"**. W tym scenariuszu zwykle zaczynam pisać testy dla klasy prezentera/kontrolera, jak ten poniżej. @Test public void when_user_clicks_check_it_should_check_selected_file_validity(){ Usługa MediaService =mock(MediaService); Widok widok =mock(Widok); when(view.getSelectedFile).thenReturns("c:\\Dir\\file.avi"); Kontroler MediaController =new MediaController(usługa,widok); kontroler.check(); Zweryfikuj(usługa).check("c:\\Katalog\\plik.avi"); } Jak widać, nie ma decyzji projektowej ani ciekawego kodu do weryfikacji zachowania. Testuję wartości z widoku przekazanego do MediaService. Zwykle piszę, ale nie lubię tego typu testów. Co robisz w takich sytuacjach? Czy cały czas piszesz testy? **AKTUALIZACJA :** Zmieniłem nazwę i kod testu po reklamacjach. Niektórzy użytkownicy stwierdzili, że należy pisać testy dla takich trywialnych przypadków, aby w przyszłości ktoś mógł dodać ciekawe zachowanie. Ale co z „Kodowaniem na dziś, projektowaniem na jutro”. ? Jeśli ktoś, w tym ja, doda w przyszłości ciekawszy kod, to wtedy można dla niego stworzyć test. Dlaczego miałbym to robić teraz w trywialnych przypadkach?


title: Kiedy przejść biegle w C#?

text: Pod wieloma względami bardzo podoba mi się pomysł interfejsów Fluent, ale przy wszystkich nowoczesnych funkcjach C# (inicjatory, lambdy, nazwane parametry) zastanawiam się „czy warto?” i „Czy to jest właściwy wzorzec do posługiwać się?". Czy ktoś mógłby mi podać, jeśli nie akceptowaną praktykę, przynajmniej własne doświadczenie lub matrycę decyzyjną, kiedy używać wzorca Fluent? **Wniosek:** Kilka dobrych zasad z dotychczasowych odpowiedzi: * Płynne interfejsy są bardzo pomocne, gdy masz więcej działań niż ustawiających, ponieważ wywołania zyskują bardziej na przekazywaniu kontekstu. * Interfejsy płynne powinny być traktowane jako warstwa nad interfejsem API, a nie jedyny sposób użycia. * Nowoczesne funkcje, takie jak lambdy, inicjatory i nazwane parametry, mogą współpracować ze sobą, aby płynny interfejs był jeszcze bardziej przyjazny. * * * Oto przykład tego, co rozumiem przez nowoczesne funkcje, dzięki którym wydaje się, że jest mniej potrzebny. Weźmy na przykład (być może kiepski przykład) interfejs Fluent, który pozwala mi stworzyć pracownika takiego jak: Employees.CreateNew().WithFirstName("Peter") .WithLastName("Gibbons") .WithManager() .WithFirstName("Bill") .WithLastName("Lumbergh") .WithTitle("Manager") .WithDepartment("Y2K"); Można łatwo napisać za pomocą inicjatorów, takich jak: Employees.Add(new Employee() { FirstName = "Peter", LastName = "Gibbons", Manager = new Employee() { FirstName = "Bill", LastName = "Lumbergh", Title = "Kierownik", Dział = "Y2K" } }); Mogłem również użyć nazwanych parametrów w konstruktorach w tym przykładzie.


title: Podpisywanie redystrybuowanych plików

text: Aby przesłać aplikację komputerową do sklepu z aplikacjami systemu Windows 8, musisz cyfrowo podpisać dowolny sterownik lub plik .exe skojarzony z aplikacją. Jednak aplikacja, którą próbowałem przesłać, zawiera kilka plików, które są redystrybucją oprogramowania innych firm, a niektóre z nich nie są podpisane. Mój wniosek został odrzucony z tych powodów. Czy jest legalne (lub etyczne) podpisywanie prac innych firm w celu złożenia wniosku? Myślę, że można to uznać za jakąś formę fałszywej reprezentacji, ale nie jestem pewien.


title: Kodowanie do SOA, zależność zewnętrzna

text: Zdarzyło mi się to więcej niż raz, myślałem, że ktoś może dać jakiś wgląd. Pracowałem przy wielu projektach, w których mój projekt jest zależny od usług zewnętrznych. Kiedy muszę uruchomić aplikację lokalnie, potrzebuję, aby ta usługa była uruchomiona. Ale czasami kodowałem do następnej wersji ich usługi, która może nie być gotowa. Więc pytanie brzmi, czy istnieje już sposób, aby mieć działającą usługę makiety, którą mógłbym skonfigurować za pomocą niektórych żądań i odpowiedzi? Na przykład, powiedzmy, że mam lokalną aplikację, która musi wykonać odpoczynek do innej usługi na zewnątrz, aby uzyskać pewne dane. Np. dla danego użytkownika muszę znaleźć wszystkie oczekujące przesyłki, które pochodzą z innej usługi. Ale nie mam dostępu do tej usługi. Aby uruchomić moją aplikację, potrzebuję działającej usługi zewnętrznej, ale nie mam do niej dostępu w moim środowisku. Czy istnieje lepszy sposób niż tworzenie fałszywej usługi?


title: artykuły w nazwach zmiennych i ciągach zakodowanych na sztywno

text: przeredagowane przez autora: nie, to nie są 2 pytania. To jest jedno pytanie dotyczące pytań przeglądu kodu, które zawiera dwa oddzielne punkty. Proszę nie edytować mojego pytania. W przypadku nazywania zmiennych obie strony dotyczą używania przedimków (a, an, the) w nazwie zmiennej (np. theBook vs. book -lub- parseTheString vs. parseString). W przypadku ciągów kodowanych na sztywno, trzy strony dotyczą tego, czy umieścić wszystkie ciągi w stałych (publiczny statyczny końcowy) w osobnym pliku (klasa lub interfejs), umieścić je wszystkie w tym samym pliku (prywatny statyczny końcowy) lub nie używać stałe dla ciągów w ogóle. (np. nowy przycisk („Kliknij mnie”) a nowy przycisk (BUTTON_LABEL_CLICK)). Omawiamy również dość dużo kwestii notacji węgierskiej, ale widziałem to omawiane tutaj w innych pytaniach. Przez bardzo długi czas de facto standardem było nieużywanie artykułów w nazwach zmiennych (dodaje bałaganu wizualnego bez dodawania wartości) i nie umieszczanie zakodowanych na stałe ciągów znaków w kodzie źródłowym (potencjalny koszmar związany z konserwacją i bardzo kiepski dla internacjonalizacji) . Teraz zaczynamy dostrzegać ich naruszenia, a programiści wydają się naprawdę zaskoczeni, gdy ktoś oznaczy je jako wady lub przynajmniej wymagające uwagi. Kierownik powiedział, że nie obchodzi go to w taki czy inny sposób, a te kwestie nie są zgodne ze standardami kodowania naszej firmy.


title: RPC przesyłający dane lub replikację

text: Mam usługi na 10 maszynach, które przechowują dane w bazie danych na tych maszynach. I mam główny serwer, który musi pobierać te dane z tych dziesięciu maszyn. Co jest w tym lepsze. Zaimplementować RPC lub użyć replikacji?


title: Jakie są dowody na to, że API przekroczyło swoją ortogonalność w kontekście typów?

text: Wikipedia definiuje ortogonalność oprogramowania jako: > Ortogonalność w języku programowania oznacza, że stosunkowo niewielki zestaw > prymitywnych konstrukcji można połączyć na stosunkowo niewielką liczbę > sposobów, aby zbudować kontrolę i struktury danych w języku. Termin ten jest > najczęściej używany w odniesieniu do zestawów instrukcji montażowych, jako ortogonalny > zestaw instrukcji. Jason Coffin zdefiniował ortogonalność oprogramowania jako > Wysoce spójne komponenty, które są ze sobą luźno połączone, > tworzą ortogonalny system. C.Ross zdefiniował ortogonalność oprogramowania jako: > właściwość oznaczającą "Zmiana A nie zmienia B". Przykładem systemu ortogonalnego może być radio, w którym zmiana stacji nie zmienia > głośności i na odwrót. Obecnie istnieje hipoteza opublikowana w ACM Queue autorstwa Tima Braya \-, że niektórzy nazwali _Kryteria systemowe typu Bánffy Bray_ \-, które podsumowuje jako: > 1. Atrakcyjność typowania statycznego jest funkcją bezpośrednią (a typowanie dynamiczne > odwrotność funkcja) wielkości powierzchni API. > 2. Atrakcyjność typowań dynamicznych jest funkcją bezpośrednią (a typowania statyczne > funkcją odwrotną) wykonalności testów jednostkowych. > Teraz Stuart Halloway przeformułował Banfy Bray jako: > im bardziej Twoje interfejsy API przekraczają ortogonalność, tym lepsze będą statyczne > pisanie Moje pytanie brzmi: ** Jakie są dowody na to, że interfejs API przekroczył swoją ortogonalność w kontekście typów?* * * * * **Wyjaśnienie** Tim Bray wprowadza ideę ortogonalności i API. Tam, gdzie masz jedno API i zajmuje się ono głównie Stringami (tj. serwerem WWW obsługującym żądania i odpowiedzi), to język uni-typed (python, ruby) jest „dopasowany” do tego API - ponieważ system typów tych języków nie jest wyrafinowany, ale to nie ma znaczenia, ponieważ i tak masz do czynienia ze stringami. Następnie przechodzi do programowania na Androida, które ma całą masę interfejsów API czujników, które są „różne” od API serwera WWW, nad którym wcześniej pracował. Ponieważ nie masz do czynienia tylko z ciągami, ale z różnymi typami, interfejs API nie jest ortogonalny. Chodzi o to, że istnieje empiryczny związek między twoim „lubieniem” typów a interfejsem API, na którym programujesz. (tj. subiektywny punkt jest w rzeczywistości obiektywny w zależności od kontekstu).


title: Dokumentowanie i egzekwowanie standardów programowania i wytycznych dla biblioteki współdzielonej

text: Ja i inny programista, mający zgodę naszego dyrektora IT, założyliśmy bibliotekę ogólnego przeznaczenia w .NET z zamiarem, aby zapewniła ona wiele klas o typowym celu, których używamy w naszym codziennym rozwoju. W trakcie dyskusji i projektowania biblioteki wypracowaliśmy zestaw standardów, które chcemy, aby biblioteka przestrzegała, aby była utrzymywana i rozwijana w spójny sposób. Jaki jest najlepszy sposób na zapewnienie, że decyzje, które podjęliśmy dla biblioteki, zostaną przekazane innym programistom, którzy mogą używać tej biblioteki i dodawać ją w przyszłości. Jedną z naszych decyzji było upewnienie się, że przejrzeliśmy cały zaewidencjonowany kod, więc początkowo spodziewamy się pewnych różnic w stylach kodowania osób, które nie pasują do standardów projektowych. Kilka pomysłów, które miałem to: 1. Dodaj plik Read-me.txt do projektu, który przedstawia wytyczne i standardy 2. Wyślij wiadomość e-mail do wszystkich członków zespołu, aby powiadomić ich o projekcie itp. 3. Zadzwoń na spotkanie zespołu, aby przejść przez ten nowy projekt oraz nasze oczekiwania i standardy, które chcieliśmy spełnić 4. Spróbuj i wyegzekwuj standardy za pomocą Visual Studio (nie jestem pewien, czy byłoby to możliwe, ani jak to tylko pomysł) W tej chwili nie ma ogólnych standardów programistycznych firmy, więc byłby to pierwszy tak naprawdę, o ile tworzymy standard, którego musiałyby przestrzegać różne zespoły projektowe.


title: Najlepszy sposób na radzenie sobie z relacjami klasowymi

text: Weź klasę użytkownika i pomysł, że użytkownik ma być profilowany. Widzę cztery sposoby radzenia sobie z tym: 1. Napisz kod profilu do klasy User. Od razu to odrzucam. 2. Utwórz klasę Profile i ustaw ją jako właściwość klasy Użytkownik. 3. Napisz klasę User (z nazwą schematu, adresami), napisz klasę Profile i napisz klasę UserProfile - UserProfile jest połączeniem User i Profile. 4. Napisz klasę użytkownika i klasę profilu, z których każda ma właściwość ID i niech ID będzie pełnił funkcję skrzyżowania. W ten sposób użytkownik i profil są niezależne, a inna klasa, prawdopodobnie abstrakcyjna, zawierająca wyłącznie statyczne metody, obsługuje logikę opisującą połączenie. Każda z opcji 3 i 4 wymaga co najmniej trzech klas. W takim przypadku, który jest najlepszy wybór? Jeśli można to uogólnić, czy ogólnie lepiej byłoby skorzystać z jednej z tych możliwości?


title: Czy istnieje sposób na zaimplementowanie szybkiej metody przechodzenia przez drzewo, która obsługiwałaby przestarzałe wersje?

text: Mam katalog w pracy i chcę go trochę pograć, bo mam dość tego, że jest bardzo powolny. Chciałbym obsługiwać zmodyfikowaną metodę przechowywania przechodzenia drzewa zamówień w przedsprzedaży dla drzewa kategorii katalogu, ale musiałbym obsługiwać wersjonowanie z datą. Myślałem o tworzeniu wersji drzew na podstawie dat, więc jak tylko coś się zmieni, tworzę kopię drzewa pod ręką w bieżącej dacie, a następnie tworzę swoje modyfikacje. Problem polega jednak na tym, że import katalogu, który pojawia się co noc, stworzyłby, z dużej odległości, niezwykle ciężki stół z elementami przecinania drzew. W połączeniu z faktem, że użytkownik mógł w dowolnym momencie zmienić datę w adminie, mógł ponownie wygenerować kolejną wersję drzewa. Większość naszych katalogów składa się z 100-250 kategorii, więc kilka wersji nie tworzy więcej niż kilka tysięcy elementów, ale łączy to z rokiem działalności, który z łatwością powiększy się do 90000 wpisów tylko po to, aby przechowywać drzewo, które może zmiana. Więc moje pytanie brzmi: Czy istnieje sposób na zaimplementowanie szybkiej metody przechodzenia po drzewie (najlepiej zmodyfikowanej przedsprzedaży z lewą i prawą kolumną), która obsługiwałaby przestarzałe wersje?


title: Przykład Dijkstry niejednoznacznego programu

text: Pozdrowienia. Dijkstra napisał, że nawet kilka linijek pozornie prostego kodu może być beznadziejnie niejednoznaczne. W co najmniej jednej pracy, której nie mogę teraz znaleźć, aby uratować mi życie, podał mały przykładowy program, aby pokazać tę niejednoznaczność. Czy ktoś może wskazać mi swój artykuł, w którym podaje jeden z tych przykładów?


title: Jakie odpowiedzi dyskwalifikują kandydata z zatrudnienia podczas rozmowy kwalifikacyjnej?

text: Jesteś w trakcie poszukiwania kandydatów na stanowisko programistyczne, wszystkie życiorysy są przeglądane i masz kilka zaproszeń na rozmowę kwalifikacyjną. Teraz ludzie pojawiają się w sali konferencyjnej na miejscu, a ty zaczynasz w kółko rozmawiać o przeszłych doświadczeniach, przeglądać CV, zainteresowania związane z rozwojem osobistym itp. Jakie były odpowiedzi (i pytania) w swoich doświadczeniach z zatrudnianiem ), że żałowałeś, że początkowo przetworzyłeś się lepiej, co mogło powstrzymać Cię przed zatrudnieniem słabego kandydata? Szukam _czerwonych flag_, na które należy uważać, i mam nadzieję, że będę wystarczająco rozeznany, aby nie wpaść w nic z tego: Czy istnieje korelacja między modnymi słowami a umiejętnościami?


title: Pisanie testów jednostkowych dla klasy, która uruchamia zewnętrzny plik EXE

text: Napisałem klasę C#, która służy do uruchamiania listy plików EXE (nie jednego z moich - EXE innych firm, które muszę uruchomić) i utrzymywania ich w działaniu (od czasu do czasu sprawdza, czy nadal działa, i uruchamia je, jeśli nie) . Jestem w stanie przetestować podstawową logikę dodawania, usuwania itp. w porządku. Jak mogę przetestować jednostkę, aby rzeczywista praca z przechowywaniem plików EXE działała? Moją pierwszą myślą jest uruchomienie jakiegoś fikcyjnego pliku EXE, który zamyka się po 1 sekundzie, a następnie użycie go do testowania. Czy to wykracza poza sferę testów jednostkowych?


title: Czy jest jakiś powód, aby całą pracę nad obiektem wykonywać w konstruktorze?

text: Pozwolę sobie poprzedzić to stwierdzeniem, że to nie jest mój kod ani kod moich współpracowników. Lata temu, kiedy nasza firma była mniejsza, mieliśmy kilka projektów, których potrzebowaliśmy do wykonania, do których nie mieliśmy możliwości, więc zostały one zlecone na zewnątrz. Teraz nie mam nic przeciwko outsourcingowi lub generalnie wykonawcom, ale baza kodu, którą stworzyli, to masa WTF. Biorąc to pod uwagę, działa (w większości) działa, więc przypuszczam, że znajduje się w najlepszych 10% projektów zleconych, jakie widziałem. Wraz z rozwojem naszej firmy staraliśmy się przejąć większą część naszego rozwoju we własnym zakresie. Ten konkretny projekt wylądował mi na kolanach, więc go przeglądałem, sprzątałem, dodawałem testy itp. Jest jeden wzór, który często się powtarza i wydaje mi się to tak niesamowicie okropne, że zastanawiałem się, czy może jest jakiś powód i Po prostu tego nie widzę. Wzorzec jest obiektem bez publicznych metod lub elementów członkowskich, po prostu publicznym konstruktorem, który wykonuje całą pracę obiektu. Na przykład (kod jest w Javie, jeśli to ma znaczenie, ale mam nadzieję, że będzie to bardziej ogólne pytanie): public class Foo { private int bar; prywatne String baz; publiczne Foo(Plik f) { wykonanie(f); } private void execute(File f) { // FTP plik do jakiejś zakodowanej lokalizacji // lub parsowanie pliku i zatwierdzenie do bazy danych lub cokolwiek } } Jeśli się zastanawiasz, ten typ kodu jest często wywoływany w w następujący sposób: for(File f : someListOfFiles) { new Foo(f); } Dawno temu nauczono mnie, że skonkretyzowane obiekty w pętli to ogólnie zły pomysł, a konstruktorzy powinni wykonać minimum pracy. Patrząc na ten kod, wygląda na to, że lepiej byłoby usunąć konstruktor i uczynić `execute` publiczną metodą statyczną. Zapytałem wykonawcę, dlaczego tak się stało, i otrzymałem odpowiedź: „Możemy to zmienić, jeśli chcesz”. Co nie było naprawdę pomocne. W każdym razie, czy jest jakiś powód, aby zrobić coś takiego, w jakimkolwiek języku programowania, czy jest to tylko kolejne zgłoszenie do Daily WTF?


title: Jak najlepiej umożliwić konsumentowi usługi sieciowej testowanie integracji transakcyjnej usługi sieciowej?

text: Chcę umożliwić konsumentom warstwy usług internetowych (usługi internetowe są napisane w języku Java) tworzenie automatycznych testów integracyjnych w celu sprawdzenia, czy wersja warstwy usług internetowych, z której będą korzystać konsumenci, będzie nadal działać dla konsumenta (tj. usługi internetowe są w innym cyklu życia wydania niż konsumenci, a ich interfejsy API lub zachowanie mogą się zmienić — nie powinny się zmieniać bez powiadomienia konsumenta, ale celem tego automatycznego testu jest sprawdzenie, czy nie uległy zmianie) Co bym zrobił, gdyby usługa internetowa faktycznie wykonuje transakcję (aktualizuje tabele bazy danych). Czy istnieje powszechna praktyka, jak sobie z tym poradzić bez konieczności umieszczania logiki w samej usłudze sieci Web, aby poznać ją w teście jednostkowym i wycofać transakcję po zakończeniu? (w zasadzie pieczenie w możliwości radzenia sobie z testowaniem serwisu internetowego). Czy jest to zalecany sposób na zrobienie tego?


title: Status „Otwarty” i „Ponownie otwarty”

text: Dlaczego systemy śledzenia problemów zwykle mają różne statusy „Otwarty” i „Ponownie otwarty”?


title: Czy legalne jest wdrażanie metodologii publikowanych w literaturze przez innych?

text: Wielu programistów przeczytało Getting Things Done i przekształciło go w aplikację w taki czy inny sposób. Niektórzy odważyli się nawet pisać programy oparte na innych książkach, pomimo przytłaczającej popularności GTD. Thinking Rock był pierwszym, który wypróbowałem. Kiedy spojrzysz na wszystkie z nich na różnych platformach, zarówno stacjonarnych, jak i mobilnych, prawdopodobnie jest ich już zbyt wiele, by je wymienić. Czy to legalne, czy po prostu im się to udaje? Chciałbym stworzyć mega-aplikację, zintegrowane środowisko produktywności, które w minimalistyczny sposób zaimplementuje nie tylko GTD, ale jak najwięcej książek na mojej półce. Obejmuje to szeroki zakres tematów: produktywność, zarządzanie czasem, motywacja, prokrastynacja, doskonalenie mózgu/umysłu itp. Chciałbym również dorzucić pomysły, które otrzymuję losowo z artykułów, wywiadów i innych mediów. Wreszcie, mój osobisty faworyt, chciałbym wprowadzić główne kategorie gry, od której jestem uzależniony od około dwudziestu lat, jako metodologię zarządzania czasem. Krótko mówiąc: **_Wzrost_** \- ćwiczenia, dieta, medytacja i inne powiązane zadania; **_Science_** \- matematyka (Project Euler, Khan Academy), czytanie beletrystyki i literatury faktu oraz inne zadania usprawniające mózg; **_Gold_** \- praca, sprzedaż osocza, bilansowanie książeczki czekowej i inne zadania związane z finansami; **_Kultura_** \- pisanie, rysowanie, granie na instrumencie i inne zadania artystyczne; **_Produkcja_** \- prace domowe, prace w ogrodzie, rutynowa praca, miodowe zadania i inne pilne zadania o niskim priorytecie; **_Cuda_** \- projekty o dużym znaczeniu: napisanie książki, napisanie programu, napisanie albumu, założenie firmy, zbudowanie rzeźby, przebudowa silnika itp. Nazywam to wszystko CivLife. Jeśli to coś zmieni, nie zamierzam na tym czerpać korzyści. Chciałbym, aby było to oprogramowanie darmowe/wolne/o otwartym kodzie źródłowym. Czy korzystanie z pomysłów innych osób jest legalne? Czy ujdzie mi to na sucho? Czy jest martwy w wodzie? Pytam, bo to pomysł, który od lat dusi się w mojej głowie. Mam BS-IT, ale nie mam żadnego doświadczenia, więc jestem bezrobotny. Chciałbym, aby ten program był moim doświadczeniem i pracą mojego życia, ale nie chcę, żeby wrócił i ugryzł mnie w tyłek. p.s. Jeśli jest to rodzaj otwartego, skłaniającego do dyskusji, niekorzystnego dla wszystkich pytania, które się zamyka, przepraszam i chętnie je zmienię.


title: problem w budowaniu mojego portfolio

text: Pracowałem dla firmy jako programista php od dwóch lat i pracowałem na wielu stronach internetowych, a teraz firma jest zamknięta wraz ze wszystkimi jej stronami internetowymi, więc muszę szukać innej firmy, aby mnie zatrudnić. Ale skoro strony internetowe nie działają, nie mogę zapisać ich w swoim CV. Właściwie to próbowałem, mówiąc im, że pracowałem na tych stronach, ale ponieważ firma jest zamknięta, strony internetowe również są zamknięte, a oni myśleli, że kłamię i mnie nie zatrudnili. Naprawdę utknąłem, będę musiał aplikować jako początkujący i dlatego nie dostanę wysokiej pensji i bardzo trudno dostanę pracę (jeśli w ogóle), ponieważ będą ze mną konkurować doświadczeni programiści. Ktoś ma rozwiązanie? **Edytuj:** właściwie macie rację, nie powinienem pracować dla firmy, która mi nie ufa. A najbardziej podobają mi się rozwiązania Josha K, dzięki chłopaki :)


title: Google Datastore i głębokie zapisy

text: Jestem na początku tworzenia strony internetowej, która używa Google Datastore do przechowywania informacji związanych z klientami i jestem ciekaw, czy rekord nie jest zbyt głęboki dla NoSQL, czy też wszystko w porządku. Zasadniczo będę przechowywać szczegółowe informacje o klientach w biznesie fitness, które są dość szczegółowe. Całkowicie zmyślonym przykładem rekordu może być { FirstName : "Jon", lastName : "Doe", ocena : [ { date: "2013-01-31", elastyczność: { leftShoulder: "12 cokolwiek", rightShoulder: "15 czegoś ", ...itd... } siła: { nogaWycisk: "100lb", barkWycisk: "22lb", ...itd... } ...itd... }, { data: "2013-02- 28", elastyczność: { lewe ramię: "13 cokolwiek", prawe ramię: "14 czegoś", ...itd... } siła: { nogaWycisk: "110lb", barkWycisk: "25lb", ...itd... } ...etc... } ], wygląd: [ { data: "2013-04-12", obrazek: "http://blah" } ...itd... ] ...wiele innych podpunktów... } Ten rekord istniałby długoterminowo dla klientów i mógłby z czasem stać się bardzo dużym rekordem. Widziałem na MongoDB, który jest również NoSQL, ma limit 16 MB na rekord. Chociaż jest to duża ilość miejsca na tekst i wystarczająca na duże rekordy, chcę się upewnić, że nie oznacza to, że powinienem je oddzielać w odniesieniu do NoSQL. Zamiast tego, czy powinienem rozdzielić rekordy „oceny” i „wyglądu” na osobne rekordy, połączone za pomocą pewnego rodzaju _klucza obcego_, czy jest to sprzeczne z celem NoSQL? Jaka jest najlepsza praktyka projektowania potencjalnie długoterminowych, głębokich rekordów NoSQL.


title: Czy historyjka użytkownika jest najlepszą formą wymagania w zwinnym projekcie?

text: Statystycznie rzecz biorąc, historyjka użytkownika może być najpopularniejszą techniką wymagającą w Agile, ale jestem ciekaw, jakie są alternatywy i dlaczego.


title: Formalna definicja „pojęć / systemu typów” dla typów parametrycznych - Od czego zacząć?

text: Byłbym zainteresowany formalnym zdefiniowaniem (i konsekwentnym zademonstrowaniem) „systemu typów” dla, no cóż, systemu typów. Dokładniej, chciałbym zbadać ideę tego, co C++ nazywa pojęciami w mojej pracy licencjackiej. **Jak można by pomyśleć o zdefiniowaniu takiego systemu (formalnie)?** Przypuszczam, że jest to w zasadzie meta-język programowania generycznego, ale cały materiał, który do tej pory znalazłem, jest zasadniczo związany ze składnią określonego języka programowania. Podstawową ideą jest zapewnienie interfejsu dla typów parametrycznych. Na przykład: Argumentem funkcji `foo(T)` jest jakaś (niestety dowolna) T. (Ten typ jest znany **statycznie**.) I chciałbym zdefiniować interfejs dla takiego typu, aby ten W rzeczywistości T nie jest żadnym T, ale pewnym typem zgodnym z interfejsem, takim jak: " _Aby ten typ był zgodny z prawem dla funkcji foo, musi być zgodny z: To i tamto pojęcie / interfejs do statycznego sprawdzania_. " Koncepcje definiowałyby powiązane, znaczące "interfejsy", które ograniczałyby typ T. Obecnie język C++ nie wykonuje takich kontroli, po prostu próbuje zrobić to, co `foo(T)` robi na **any* * wpisz i mam nadzieję, że zadziała. Jeśli tak nie jest, komunikat o błędzie jest długości przyzwoitej powieści, ponieważ błąd jest wykrywany zbyt późno i kompilator musi „wypluć” cały proces, w jaki doszło do błędu. W końcu chciałbym pokazać koncepcję (errm, pomysł, przepraszam za niejednoznaczność) konkretnie w C++, jeśli jest to istotne. Dzięki, ~Szkarłatna


title: Jak programiści rzucają pracę?

text: Zastanawiam się nad odejściem od mojego obecnego pracodawcy i zastanawiam się, jak wygląda ten proces w świecie programowania. W tej chwili mamy wiele projektów w ruchu i jestem jedynym programistą. Mamy 4-5 projektów, które są dość duże i muszą być wykonane w ciągu najbliższych kilku miesięcy, a nawet kilka dłużej. Odchodzę, bo jestem jedynym pracownikiem, a to mi nie służy. Jestem młody i chcę się uczyć, więc fajny byłby zespół. To też za dużo pracy, a firma jest fatalnie zarządzana. Nie mam żadnej umowy, o którą bym się martwił, więc teoretycznie mógłbym zrezygnować i po prostu nie wracać bez uprzedzenia. Zastanawiam się tylko, jak to jest _normalnie_ obsługiwane. * Czy powinienem napisać list rezygnacyjny * Z jakim wypowiedzeniem powinienem dać * Czy powinienem podać powód odejścia * Czy powinienem udać się do mojego szefa, który jest głównym powodem odejścia, czy udać się do jego szefa? **Przegląd odpowiedzi** Z opinii tutaj wygląda na to, że najlepiej dać 2-4 tygodnie wypowiedzenia i złożyć pisemną rezygnację. W większości przypadków nie wdawaj się w szczegóły wyjaśniające, dlaczego odchodzisz. Nie pal mostów. Być profesjonalistą.


title: Więcej kodu = więcej błędów

text: Pamiętam, że jeszcze na studiach profesor wykładał pierwszą część praw informatyki. Powiedział coś w stylu „Więcej kodu oznacza więcej błędów” i nadał mu nazwę (Prawo Whatchamacallit) i przypisał to komuś. Czy ktoś wie, skąd się wzięło to „prawo”, kto je powiedział lub jakie jest jego pierwotne słownictwo?


title: Ruby on Rails i DRY

text: Zacząłem uczyć się trochę ROR i wszystko, co przeczytałem, mówi, że ROR popiera zasadę DRY i wydaje się, że sugeruje, że jest to wielka rzecz, która odróżnia ROR od innych języków/frameworków. W jakim języku _nie_ zachęca do powielania kodu?


title: Czy należy przekazać wywołanie do .Equals na .Equals<T>?

text: Tak, mam Ci bog standardowego obiektu c#, zastępując Equalsand implementującego IEquatable public override int GetHashCode() { return _name.GetHashCode(); } public override bool Equals(object obj) { return Equals(obj as Tag) } #region IEquatable<Tag> Members public bool Equals(Tag other) { if (other == null) return false; w przeciwnym razie return _name == other._name; } #endregion Teraz z jakiegoś powodu myślałem, że przekierowanie wywołań z Equals do Equals jest złe, nie mam pojęcia dlaczego, może czytałem to dawno temu, w każdym razie napisałbym osobny (ale logicznie ten sam) kod dla każdą metodę. Teraz myślę, że przekazywanie Equals do Equals jest w porządku, z oczywistych powodów, ale w moim życiu nie pamiętam, dlaczego myślałem, że nie było wcześniej. jakieś pomysły?


title: TDD/testy zbyt duże obciążenie ogólne/konserwacyjne?

text: Tak więc słyszałeś to wiele razy od tych, którzy tak naprawdę nie rozumieją wartości testowania. Na początek jestem zwolennikiem Agile and Testing... Niedawno rozmawiałem o wykonywaniu TDD przy przepisaniu produktu, w którym obecny zespół nie ćwiczy testów jednostkowych na żadnym poziomie i prawdopodobnie nigdy nie słyszałem techniki wstrzykiwania zależności lub wzorców testowych/projektu itp. (nie przejdziemy nawet do czystego kodu). Teraz jestem w pełni odpowiedzialny za przepisanie tego produktu i powiedziano mi, że próbowanie tego w stylu TDD sprawi, że będzie to tylko koszmar związany z konserwacją, a utrzymanie zespołu będzie niemożliwe. Co więcej, ponieważ jest to aplikacja typu front-end (a nie webowa), dodawanie testów jest bezcelowe, ponieważ biznes się zmienia (przez zmiany oznaczają oczywiście ulepszenia), testy staną się nieaktualne, inni programiści, którzy przyjdą do projekt w przyszłości nie utrzyma ich i stanie się dla nich większym obciążeniem do naprawienia itp. Rozumiem, że TDD w zespole, który obecnie nie ma żadnego doświadczenia w testowaniu, nie brzmi dobrze, ale moim argumentem w tym przypadku jest że mogę uczyć moich praktyk ludzi wokół mnie, ale co więcej, wiem, że TDD tworzy LEPSZE oprogramowanie. Nawet gdybym miał wyprodukować oprogramowanie przy użyciu TDD i wyrzucić wszystkie testy po przekazaniu go zespołowi serwisowemu, z pewnością byłoby to lepsze podejście niż nieużywanie TDD od samego początku? Zostałem zestrzelony, jak wspomniałem, że robiłem TDD w większości projektów dla zespołu, który nigdy o tym nie słyszał. Myśl o "interfejsach" i dziwnie wyglądających konstruktorach DI odstrasza ich... Czy ktoś może mi pomóc w bardzo krótkiej rozmowie o próbie sprzedaży TDD i moim podejściu do ludzi? Zwykle mam bardzo krótkie okno na kłótnię, zanim padnę na kolana przed firmą/zespołem.


title: Czy zgłoszenie błędu w nieprzewidywalnych okolicznościach specyficznych dla podklasy jest naruszeniem LSP?

text: Powiedzmy, że chciałem stworzyć implementację Javy `List<String>` (patrz specyfikacja), która używa złożonego podsystemu, takiego jak baza danych lub system plików, dla swojego magazynu, tak aby działała jako trwała kolekcja, a nie w pamięci jeden. Oto szkielet implementacji: class DbBackedList implementuje List<String> { private DbBackedList() {} /** Zwraca listę, prawdopodobnie niepustą */ public static getList() { return new DbBackedList(); } public String get(int index) { return Db.getTable().getRow(i).asString(); // może wyrzucić DbExceptions! } // add(String), add(int, String) itp. ... } Mój problem polega na tym, że bazowe API bazy danych może napotkać błędy połączenia, które nie są określone w interfejsie List, który powinien zgłosić. Mój problem polega na tym, czy narusza to zasadę substytucji Liskov (LSP). W swoim artykule na temat LSP, Bob Martin faktycznie podaje przykład PersistentSet, który narusza LSP. Różnica polega na tym, że jego nowo określony „Wyjątek” jest określony przez wstawioną wartość, a więc wzmacnia warunek wstępny. W moim przypadku błąd połączenia/odczytu jest nieprzewidywalny i spowodowany czynnikami zewnętrznymi, a więc nie jest technicznie nowym warunkiem wstępnym, a jedynie błędem okoliczności, być może jak OutOfMemoryError, który może wystąpić nawet, gdy nie jest określony. W normalnych okolicznościach nowy błąd/wyjątek może nigdy nie zostać zgłoszony. (Wywołujący może przechwycić, jeśli jest świadomy takiej możliwości, tak jak program Java z ograniczoną pamięcią może wyłapywać OOME.) Czy jest to zatem poprawny argument za zgłoszeniem dodatkowego błędu i czy nadal mogę twierdzić, że jest poprawnym `java? util.List` (lub ogólnie wybierz swój SDK/język/kolekcję) i nie narusza LSP? _**Edytuj:** Ten argument może być łatwiejszy do przyjęcia, jeśli weźmiesz pod uwagę `FileBackedList` (bardziej niezawodne „połączenie”) niż `DbBackedList`._ Jeśli to rzeczywiście narusza LSP, a zatem nie jest praktycznie użyteczne, podałem dwa mniej smaczne alternatywne rozwiązania jako odpowiedzi, które możesz skomentować, patrz poniżej. * * * **Przypis: Przypadki użycia** W najprostszym przypadku celem jest zapewnienie znajomego interfejsu dla przypadków, gdy (powiedzmy) baza danych jest używana jako trwała lista, i umożliwienie regularnych operacji List, takich jak wyszukiwanie, podlista i iteracja. Innym, bardziej ryzykownym przypadkiem użycia jest zamiennik slot-in dla bibliotek, które działają z podstawowymi listami, np. jeśli mamy kolejkę zadań innej firmy, która zwykle działa ze zwykłą listą: `new TaskWorkQueue(new ArrayList<String> ()).start()` który jest podatny na utratę całej swojej kolejki w przypadku awarii, jeśli po prostu zastąpimy to: `new TaskWorkQueue(new DbBackedList()).start()` otrzymujemy natychmiastową trwałość i możliwość dzielenia zadań między więcej niż jedną maszynę. W obu przypadkach moglibyśmy albo obsłużyć wyrzucane wyjątki połączenia/odczytu, być może najpierw ponowną próbę połączenia/odczytu, albo pozwolić im na zgłoszenie i awarię programu (np. jeśli nie możemy zmienić kodu TaskWorkQueue).


title: Czy Facebook przechowuje wiele skrótów haseł dla każdego użytkownika?

text: Zauważyłem, że Facebook pozwala na wiele wariantów mojego własnego hasła: * Moje hasło bez zmian. * Moje hasło pisane wielką literą. * Moje hasło z wielkimi literami. Powszechnie wiadomo, że hasła są przechowywane jako skróty. Więc moje pytanie brzmi, czy Facebook przechowuje wiele skrótów dla każdego użytkownika? Skoro hash każdego wariantu powinien być zupełnie inny... A może czegoś tu brakuje? A kombinacji może być więcej, oprócz tej, którą zaobserwowałem. Ma to oczywiście na celu zapewnienie lepszego doświadczenia użytkownika i prawdopodobnie mają statystyczne wyjaśnienie osób powtarzających te błędy. Ale nie mogłem się powstrzymać od zastanawiania się, czy warto zwiększyć liczbę wyszukiwań (w ich bazie danych) tylko po to, aby pomóc użytkownikowi wpisać błędne hasło? Oprócz tego ostrzegają o Caps Lock (chociaż wydaje się, że to nie obchodzi): ![tutaj wprowadź opis obrazu](http://i.stack.imgur.com/KEtG4.png) * * * Znalazłem te dwa istotne linki w tym zakresie: * Jak bardzo bezpieczeństwo jest zagrożone, jeśli akceptujemy inne znaki jako login. * W hasłach do Facebooka nie jest rozróżniana wielkość liter (aktualizacja)


title: Czy oddzielenie może zaszkodzić konserwacji w pewnych sytuacjach?

text: Czy fakt, że logika biznesowa jest mapowana na interfejsy, a nie implementacje, może w pewnych sytuacjach utrudnić utrzymanie aplikacji? Naiwnym przykładem z frameworkiem Hibernate w Javie byłoby na przykład (pod warunkiem, że nie mam w głowie całej bazy kodu, struktura projektu jest bałaganem, a klasy są nazywane dowolnymi nazwami), jeśli chcę zobaczyć, co jest dzieje się w pewnym DAO, aby sprawdzić, czy rzeczywiście robi to, co powinno, zamiast przechodzić wstecz w górę drzewa od punktu, w którym wywoływana jest usługa danych (gdzie drzewo kończy się interfejsem bez szczegółów implementacji cokolwiek oprócz sygnatury) muszę na przykład poszukać konfiguracyjnego pliku XML, aby zobaczyć, która klasa jest zmapowana do wspomnianego interfejsu jako implementacja, zanim będę mógł uzyskać dostęp do rzeczywistych szczegółów implementacji. Czy są sytuacje, w których luźne sprzężenie może w rzeczywistości zaszkodzić konserwacji?


title: Według inżynierii oprogramowania, które metody są zbyt długie?

text: Właśnie pracowałem z metodą około 70 linijek kodu opracowaną przez innych. Używa bardzo ładnej struktury wzorców, takich jak kontener IOC, ale zastanawiam się.. Metoda jest za długa? Czy jest to tak długa metoda nadal czytelna? Pytanie mogłoby się skończyć, ale teraz zaczyna się przesłanka, z której pochodzi moje pytanie. * * * Zanim zdałem sobie sprawę z jego długości (nadmiernej dla mnie) zaczynałem się nudzić, próbując zrozumieć, co robi. Pełno w nim instrukcji tego rodzaju: if (success == null) { //Log response error logger.LogProviderActionResponse(userId, "actionName", transactionRequestId, _configuration.ResponseLogErrorTryAgainId, xmlResponse.InnerXml.ToXml(true)); zwróć nowe CheckActionResult(ActionStatus.Failed); } Co robi i dlaczego? Zajmuje się oczywiście logowaniem, ponieważ zmienna `success` ma wartość null, ale co to oznacza? A także jest wiele parametrów, jakie jest ich znaczenie? Musiałabym go uważnie przeczytać, przestudiować. Problem polega na tym, że ta metoda implementuje interfejs i klasę abstrakcyjną, ma wiele rodzeństwa. Skopiuj i wklej rodzeństwo, które ma to samo zachowanie strukturalne. Ale odróżnienie informacji strukturalnych od informacji specyficznych dla domeny nie jest natychmiastowe. Opracowując nową akcję lub nowego dostawcę powinienem jedynie kopiować, wklejać i modyfikować rzeczy **specyficzne dla domeny**. Ale jest to trudne... ponieważ są one głęboko wymieszane z zachowaniem strukturalnym... ## Refaktoryzacja, którą zrobiłbym, aby zwiększyć czytelność * ### Pierwszy krok otocz całe to logowanie #regionem, który można zwinąć * ### Drugi Krokiem może być użycie metody Extract w celu przekształcenia poprzedniego wywołania dziennika w pojedynczą instrukcję. Coś w stylu: Log.LogWithReason(Success.IsEmpty); Jednak użycie zwrotu jest sprzeczne z tym celem wymagającym dodatkowego wysiłku. * ### Trzecim krokiem byłoby całkowite oddzielenie odpowiedzialności za logowanie (używając AOP? Zaimplementować ją w klasie bazowej? Używając zdarzeń?). Jeśli jedna metoda ma 5/8 wywołań do dziennika z różnych powodów. Jest zbyt świadomy logowania. Moim zdaniem naruszona jest zasada pojedynczej odpowiedzialności, ponieważ metody zyskały drugorzędną odpowiedzialność polegającą na dużej świadomości na temat rejestrowania. * * * Pytanie pozostaje pytaniem podanym w tytule, ale mam nadzieję, że przeczytam tutaj bardzo dojrzałe porównanie oparte na pomyśle nasion, który napisałem! Dziękuję za Twój wkład


title: Czy przegląd kodu powinien być inny dla programistów front-end?

text: Kod programistów stron internetowych w co najmniej czterech językach (HTML, CSS, JavaScript i język po stronie serwera) musi działać w kilku różnych implementacjach przeglądarek i może działać na wierzchu niestandardowego stosu oprogramowania, który nie kontrola. * W jaki sposób przegląd kodu powinien uwzględniać te kwestie? * Czy przegląd kodu powinien obejmować wszystkie części projektu front-end (również HTML i CSS), czy po prostu skupić się na logice? * Jak przegląd kodu powinien obsługiwać obejścia problemów związanych z przeglądarką lub stosem?


title: Ochrona Twoich interesów jako niezależny projektant stron internetowych

text: Jaki jest najlepszy sposób, aby chronić swoje interesy jako niezależnego projektanta stron internetowych, gdy: 1. Klient nie odpowiada i zajmuje dużo czasu na podejmowanie decyzji 2. Klient wprowadza ciągłe zmiany 3. Pełzanie funkcji


title: Zaangażowanie się w projekt open-source Python-Java

text: Jestem studentką pierwszego roku studiów doktoranckich w Irlandii. Moje wykształcenie jest związane z matematyką, ale zamierzam pokierować swoją karierą w programowanie w językach Python, Java i C++. Mam dobre doświadczenia z C++, co pozwoliło mi niedawno na prezentację w Europie - brałem udział w projekcie open-source cloud computing. Trochę używałem Pythona w tym projekcie, choć głównie w C++. Czytałem tego lata piękną książkę „Myślenie w Javie”, szukając doktoratu. Nie mam doświadczenia w Javie. Nauczyłem się trochę Pythona pisząc stronę internetową opartą na Django. Od dzieciństwa uwielbiam języki programowania – zaczynałem od Pascala i C. Od tego czasu oczywiście nie programuję cały czas. Znam kilka innych narzędzi pomocniczych, takich jak Git, SVN, SQL, XML i javascript. Chcę wziąć koncentrację w swoje ręce i przy okazji zapamiętać wzorce projektowe. Teraz... zarobiłem trochę pieniędzy na jedzenie przez 2 lata. Bardzo chcę znaleźć pracę, ale na rynku nie ma ciekawej pracy lub moje umiejętności nie wystarczają, aby ją zdobyć. Tak więc naprawdę chcę uczyć się Pythona i Javy równolegle czytając książki (już wybrałem odpowiednie), przeszukując google (przyzwyczaiłem się do tego) i co najważniejsze pisząc kod i dlatego myślę o ponownym udziale w projekcie open-source. Czy mógłbyś wymienić 2 lub 3 projekty w Pythonie i/lub Javie, które są aktualnie aktywne (żywe) i użyteczne?


title: Czy dobrze zrozumiałem funkcję „autologowania” w witrynie?

text: Tworzę bibliotekę uwierzytelniania (*) dla strony internetowej i zdałem sobie sprawę, że może nie do końca rozumiem, czym jest funkcja „autologowania” i jak ją rozwijać. Podczas zbierania informacji i studiowania innego kodu natknąłem się na kilka bibliotek, które implementują opcję logowania użytkownika bez konieczności logowania (te biblioteki to Tank Auth i Ion Auth, zbudowane dla frameworka PHP CodeIgniter); zasadniczo pracują nad stworzeniem pliku cookie, który w przypadku, gdy użytkownik nie jest zalogowany (dane sesji nie są ustawione), ale ten plik cookie zostanie znaleziony, mimo to pozwala mu się zalogować. Ok, na razie wszystko jasne. Nie rozumiem jednak, dlaczego obie biblioteki _usuwają_ plik cookie autologowania, gdy użytkownik się wylogowuje. Mam na myśli: loguję się, zaznaczam opcję „zapamiętaj mnie” (**), robię to, co muszę zrobić w swoim panelu administracyjnym, potem się wylogowuję; jeśli plik cookie autologowania zostanie usunięty, następnym razem będę musiał się ponownie zalogować wypełniając formularz, ignorując zaznaczoną przeze mnie opcję. Jaki jest więc jego cel? Myślałem, że to "autologin" będzie dodatkowym logowaniem, które pozwoli mi _uniknić_ konieczności ponownego wypełniania formularza logowania. Więc poszedłem dalej i rozwinąłem moją funkcję autologowania, ale oczywiście natknąłem się na problem niemożności wylogowania się _w ogóle_ , ponieważ nie usuwam go. Czyli wylogowuję się, przekierowuję na stronę główną, potem przechodzę do panelu administracyjnego i system mnie loguje... cóż, działa zgodnie z oczekiwaniami, ale nie jestem pewien, czy tak ma być... Jak należy to zrobić poprawnie? Czy ktoś może mi wyjaśnić, jak to właściwie powinno działać? Jestem trochę zdezorientowany P.S. Nie wiem, czy to jest właściwe miejsce, aby o to zapytać, czy też SO lepiej pasuje; Przepraszam, jeśli pisałem na złej stronie SE. (*) Proszę nie mów mi _"nie wymyślaj na nowo koła"_ ani żadnego jego wariantu; Robię to, aby się uczyć i zamierzam zrobić z tego projekt open source dla publicznej rozrywki, więc dobrowolnie _nie_ chcę wymyślić koło na nowo, kosztem uczynienia go owalnym. (**) Myślę, że odgadłem różnicę między opcją „zapamiętaj mnie” a funkcją „autologowania”; do tej pory nie brałem pod uwagę pierwszego (1-ponieważ wiele przeglądarek mimo to prosi o zrobienie tego; 2-ponieważ nie wiem jak to zrobić dobrze, tj. jak automatycznie wypełnić pola logowania bez tego pozowania zagrożenie bezpieczeństwa związane z przechowywaniem hasła w postaci zwykłego tekstu w pliku cookie), ale proszę mi powiedzieć, jeśli to również źle zrozumiałem..


title: Jak powinienem hostować nasze skalowalne procesy robocze?

text: Projektujemy nową architekturę dla biznesu korporacyjnego. Do tej pory przestrzegaliśmy zasad, które nie polegają na rozwijaniu tego, co można (ewentualnie kupić i) wdrożyć, tj. nie wymyślać na nowo żadnych kół. W ten sposób zdecydowaliśmy się na CQRS, RabbitMQ, Riak i kilka innych rzeczy. Nadal jednak musimy napisać /jakiś/ kod biznesowy, który będzie miał postać procesów roboczych, które będą zużywać polecenia z kolejki komunikatów i po wszelkich efektach ubocznych wytworzą zdarzenia w innej kolejce komunikatów. Ideą, która się za tym kryje, jest to, że dzięki projektom konkurencyjnym dla konsumentów otrzymamy skalowalny projekt zaraz po wyjęciu z pudełka. Jedną z opcji jest napisanie infrastruktury zarządzania, która będzie wiedziała, jak: * wdrożyć kod * tworzyć instancje procesów * zabijać procesy * aktualizować konfigurację * itp. IE zapewnia odporność na błędy i skalowalność. Poza tym jest to dokładnie to, co robi dla ciebie coś takiego jak GAE i Heroku, ale w środowisku publicznym iw naszej organizacji publiczność jest zła. Moje pytanie brzmi, czy istnieje nieszablonowe rozwiązanie, które możemy wykorzystać do goszczenia naszych klientów? Jak chmura prywatna lub prywatna platforma jako usługa. Prywatny Heroku lub GAE. Czy istnieje jakiś rodzaj oprogramowania lub oprogramowania, za pomocą którego możemy zrobić wszystkie te rzeczy, a tym samym uzyskać skalowalność i odporność na błędy w stosunku do naszych konsumentów?


title: Jak w praktyce przestrzegać zasady otwarte-zamknięte?

text: Rozumiem intencję zasady otwarte-zamknięte. Ma to na celu zmniejszenie ryzyka zepsucia czegoś, co już działa podczas modyfikowania, poprzez nakazanie ci rozszerzenia bez modyfikowania. Miałem jednak pewne problemy ze zrozumieniem, jak ta zasada jest stosowana w praktyce. W moim rozumieniu istnieją dwa sposoby jej zastosowania. Przed i po ewentualnej zmianie: 1. Przed: zaprogramuj się na abstrakcje i 'przewiduj przyszłość' jak najwięcej. Na przykład metoda `drive(Car car)` będzie musiała się zmienić, jeśli w przyszłości do systemu zostaną dodane `Motocykle`, więc prawdopodobnie narusza to OCP. Ale metoda `drive(MotorVehicle vehicle)` jest mniej prawdopodobna do zmiany w przyszłości, więc jest zgodna z OCP. Jednak dość trudno jest przewidzieć przyszłość i wiedzieć z góry, jakie zmiany zostaną wprowadzone w systemie. 2. Po: gdy potrzebna jest zmiana, rozszerz klasę zamiast modyfikować jej obecny kod. Praktyka nr 1 nie jest trudna do zrozumienia. Jednak to praktyka nr 2 sprawia, że mam problem ze zrozumieniem, jak zastosować. Na przykład (wziąłem to z filmu na YouTube): powiedzmy, że mamy metodę w klasie, która akceptuje obiekty `CreditCard`: `makePayment(CraditCard)`. Jednego dnia do systemu dodawane są "Vouchery". Ta metoda ich nie obsługuje, więc należy ją zmodyfikować. Implementując metodę w pierwszej kolejności nie udało nam się przewidzieć przyszłości i zaprogramować w bardziej abstrakcyjnych terminach (np. `makePayment(Payment pay)`, więc teraz musimy zmienić istniejący kod. Praktyka nr 2 mówi, że powinniśmy dodać funkcjonalność przez rozszerzanie zamiast modyfikowania.**Co to oznacza?Czy powinienem podklasować istniejącą klasę zamiast po prostu zmieniać jej istniejący kod?** Czy powinienem zrobić jakiś rodzaj otoki wokół niej, aby uniknąć przepisywania kodu?**Czy zasada nie nawet odnoszą się do „jak poprawnie zmodyfikować/dodać funkcjonalność”, ale raczej odnoszą się do „jak uniknąć konieczności wprowadzania zmian w pierwszej kolejności (np. Program do abstrakcji)?**