title: Metody zrozumienia relacji i infrastruktury kodowania w nieznanej bazie kodu

text: Niedawno zacząłem studiować bazę kodów, z którą wkrótce będę pracować. Obecny kod został napisany przez zespół około 5 programistów rockstar (cokolwiek to znaczy) i tak naprawdę nie zostało to udokumentowane dla nowicjusza takiego jak ja. Mam ogólną wiedzę na temat używanych technologii, ale nie wystarcza mi do rozpoczęcia kodowania i dodawania funkcji. Najpierw muszę zrozumieć ogólną architekturę zastosowaną w całym kodzie, wszystkie podstawowe relacje i przebieg procesu od wejścia do wyjścia, a także odczyt i zapis – od serwera do klienta i od klienta do serwera. Kiedy jestem w stanie zrozumieć ich system na tym poziomie, programowanie w tym kodzie powinno być dużo bardziej wykonalne. Nie zajmuję się czytaniem kodu i badaniem ich użycia języka. Wiem, że umiem składnię Google i bibliotekę lub API, jeśli muszę coś wymyślić. Ale jakie są niektóre podejścia do zrozumienia architektury i wszystkich ważnych relacji dla kodu, który nie dokumentuje tego konkretnie? Baza kodu została napisana przez zaawansowanych programistów, którzy używali wielu metod odgórnych, więc w jaki sposób nowicjusz przychodzi i rozumie go z umysłu programisty, który go napisał? Znajdziesz to dość często w bazach kodu, które są hostowane na GitHub i tym podobnych. Dużo kodu. Mała dokumentacja. Więc gdzie się zaczyna? Jakie są sugestie i jakie są twoje doświadczenia?


title: Kod konserwacyjny wymaga ulepszeń

text: Obecnie utrzymuję/ulepszam projekt nieco stary, mówiący o latach 90-tych. Co najmniej 15 programistów pracowałoby nad tym. Przejście przez kod w celu zrozumienia jest nieco trudne. 1. Brak przestrzegania standardów kodowania. 2. Koncepcje OOP nie są jasne. 3. Zbyt wiele zbędnych metod i funkcji, także nieużywane pliki. 4. Najgorszy ze wszystkich obiektów globalnych (trudno określić, kiedy zostały utworzone i zniszczone). Czasami wydaje mi się, że powinienem poprawiać kod, więc lepiej jest nad nim pracować, ale mój PM mówi, że nie powinniśmy się tym przejmować. Ponieważ musimy wykonać zadania w terminie. Prowadzi to również do trudności w śledzeniu występujących błędów. Jakieś sugestie, jak mam do tego podejść?


title: Jak mam przejść do „przeglądu” dużej starszej aplikacji?

text: > **Możliwy duplikat:** > Odziedziczyłem 200 tys. linii kodu spaghetti – co teraz? W następnym projekcie miałem za zadanie „przerobić” dużą przestarzałą aplikację internetową z wieloma częściami. Jest to aplikacja JSP napisana w 2004 roku i jest intensywnie używana przez moją firmę. Ta aplikacja została źle zaprojektowana, ponieważ nie ma rozdziału obaw; bez warstwy usługowej, bez warstwy DAO, bez struktury MVC. Tylko kilka plików JSP załadowanych skryptletami zawierającymi zapytania logiczne i bazy danych zmieszane z HTML. To bałagan. Mój szef zdefiniował „remont” jako zasadniczo przepisanie całej rzeczy przy użyciu technologii, których używamy w naszych nowszych aplikacjach, a mianowicie: * Maven * Spring * JPA (z hibernacją) * JSF ** ORAZ** dodaj kilka nowych cechy. Moje pytanie brzmi: jak mam się do tego zabrać? Jaka powinna być moja strategia, aby całkowicie przerobić dużą aplikację, która jest obecnie w użyciu, ORAZ dodać kilka funkcji? Czy powinienem najpierw przepisać istniejącą aplikację i sprawić, by działała ze zaktualizowanymi technologiami, a potem martwić się o dodanie nowych funkcji później? A może powinienem zajmować się tym tak, jakbym tworzył zupełnie nową aplikację i wdrażał nowe funkcje ZE starymi funkcjami? Czy ktoś zrobił to z powodzeniem? Jeśli tak, jakie strategie przyczyniły się do Twojego sukcesu? * * * **Edytuj: Więcej informacji z komentarzy:** Jak zły musi być projekt, aby uzasadnić przepisanie? Ten projekt jest dość zły. W aplikacji kryje się mnóstwo logiki biznesowej. Bez specyfikacji, dzienników zmian wymagań, listy poprawek błędów, listy otwartych błędów, zestawu testów, dokumentacji. A facet, który to napisał, jest teraz w wyższej kadrze kierowniczej.


title: Jak dokładnie przewidzieć pozycje wydania?

text: Mamy rozdźwięk między rozwojem a potrzebami biznesowymi. Biznes prosi mnie o sporządzenie dokładnej listy wyników w ustalonym terminie, a trudny do przewidzenia rozwój jest odpychający, mówiąc, że może sporządzić listę dokładną tylko w 80 lub 90%. Więc moje pytanie brzmi, jak rozwiążemy ten problem? Jak zapewnić dokładną listę wyników na kilka tygodni przed ich ukończeniem i pełnym przetestowaniem?


title: Jak ustawić dokładniejsze „terminy”?

text: Kontekst: Moja praca polega na tworzeniu raportów finansowych przy użyciu głównie arkuszy kalkulacyjnych Excel. Składa się głównie z formuł i sporej ilości VBA. Każda osoba jest budowana przez jedną osobę. Obsługujemy wiele poddziałów w ramach działu finansowo-księgowego i często mamy w kolejce wiele projektów. Miałem ciężki okres w ciągu ostatnich kilku miesięcy, ponieważ projekty trwały dłużej niż oczekiwano, a następnie projekty nakładały się i zbliżały się do krytycznych terminów. Pytanie: Oczywiście staramy się planować nasze projekty tak, aby mieć trochę miejsca na oddech, ale zawsze czuję się bezradny, gdy muszę oszacować, ile czasu zajmie mi dany projekt. Czy istnieją techniki, które można wykorzystać do lepszego oszacowania, ile czasu może potrwać ukończenie projektu? Analiza: Myślę, że jednym ze sposobów lepszego zrozumienia długości projektu byłoby przyjrzenie się naszemu procesowi uzyskiwania wymagań, które mogłyby być nieskończenie lepsze. Pomogłoby to uzyskać wyraźniejszy obraz, ale nadal nie dałoby nam to pomiaru. Wtedy pomyślałem, że może wyizolowanie i zmierzenie średniego czasu rozwoju różnych zadań, które należy wykonać dla większości raportów (np. budowanie zapytań, pisanie funkcji, konstruowanie raportu, automatyzacja procesu) byłoby jednym ze sposobów na osiągnięcie tego, ale nie uwzględnia zmienności złożoności tych zadań. Niektóre raporty zawierają bardzo proste zapytania, podczas gdy inne są niezwykle złożone. Oczywiście im bardziej złożone zapytanie, tym dłużej to zajmie. Uwaga: Przez większość czasu mamy do czynienia ze starszym kodem/nieefektywnymi raportami, które mogą jeszcze bardziej zaciemnić wody.


title: Kiedy hacki kodu stają się złe?

text: Kiedy zaczynasz nowy projekt/funkcję/obiekt, przeważnie masz pomysł na model, który chcesz zbudować. Może być oparty na życzeniu klientów, Twoich pomysłach na aplikację lub cokolwiek innego. W środku często zdajesz sobie sprawę, że Twój model nie zadziała. Mogą pojawić się nowe wymagania, nie wymyśliłeś czegoś itp. Wtedy masz dwie opcje. Albo przepisujesz swój kod, aby działał z nowymi specyfikacjami, albo „zhakujesz” bieżący kod, aby zrobić to, co chcesz. Przepisywanie jest czasochłonne i może być konieczne wykonanie tego kilka razy, ale na dłuższą metę często się opłaca. Hacki są w tej chwili szybkie i często skuteczne, ale wiele hacków sprawi, że kod będzie naprawdę zły, a po pewnym czasie mogą wrócić i ugryźć cię w tyłek... Jak ustalasz, kiedy co zrobić? _(Przepraszam za bardzo nieakademicki sposób wyjaśniania tego, ale mam nadzieję, że rozumiesz, do czego zmierzam.)_


title: Jak zorganizować jednoosobowy projekt?

text: Co jakiś czas (czytaj: codziennie) wpadam na nowy pomysł, uruchamiam nowy projekt w moim ulubionym edytorze/IDE, zaczynam kodować, a następnego dnia go usuwam i zaczynam coś nowego. Programuję od około sześciu lat iw ciągu tych sześciu lat tak naprawdę ukończyłem tylko jeden bardzo mały projekt (widżet Dashboard dla Pastebin.com). Chociaż może to być świetne do nauki kodowania, naprawdę chcę coś dokończyć. Jakie rzeczy powinienem zrobić przed, w trakcie i po właściwym kodowaniu? Jakie są dobre zasoby, które uczą mnie, jak organizować takie jednoosobowe projekty? * * * Jeśli ma to znaczenie, chcę zajmować się programowaniem w sieci lub na komputerach Mac.


title: Czy eval jest makrodefinicją javascriptu?

text: W Common Lisp, `defmacro` zasadniczo pozwala nam na zbudowanie własnego DSL. Przeczytałem dzisiaj tę stronę i wyjaśnia ona coś sprytnie wykonanego: > Ale nie miałem zamiaru samemu wypisywać tych wszystkich nudnych predykatów, więc > zdefiniowałem funkcję, która po podaniu listy słów buduje tekst dla takich > a predykat automatycznie, a następnie ocenia go w celu utworzenia funkcji. Co dla mnie wygląda jak „defmakro”. Czy `eval` jest `definicją makro` javascriptu? Czy może być używany jako taki?


title: Czy można powiedzieć, że „makra się nie komponują”?

text: W tym poście na blogu aphyr (który jest genialnym programistą) stwierdza: > Makra Clojure mają kilka ważnych ograniczeń. Ponieważ są > rozwijane przed oceną, makra są niewidoczne dla funkcji. Nie mogą być > skomponowane funkcjonalnie – nie można na przykład `(mapować lub ...)`. Klasycznym tego przykładem jest: (reduce i [prawda prawda fałsz prawda]) ;RuntimeException Jeszcze możemy napisać: (redukuj #(i %1 %2) [prawda prawda fałsz prawda]) ;false **Czy 'makra nie' t utworzyć prawidłowe oświadczenie?** Z pewnością jedynym słusznym punktem jest to, że makra nie są funkcjami pierwszej klasy i nie powinny być traktowane jako takie.


title: Jak działają aplikacje do przekierowywania połączeń międzynarodowych?

text: Ponieważ DTMF wydaje się niemożliwe na urządzeniach z Androidem, naprawdę zastanawiam się, jak można skonfigurować usługę direct dail, taką jak Jinggling (http://www.jinggling.com/how_it_works.html). Zdaję sobie sprawę, że jeden rejestruje swój numer telefonu, ale w jakim celu? Załóżmy, że klient dzwoni teraz pod numer międzynarodowy, aplikacja przechwytuje połączenie, przekierowuje je do własnej usługi, ale w jaki sposób zostaje przesłany żądany numer? Chodzi o to, że działa to bez połączenia Wi-Fi/danych, bez VOIP. Jedynym sposobem, w jaki mogę sobie wyobrazić, że to działa, jest używanie SMS-ów do wymiany uwierzytelniania i innych powiązanych danych. A może czegoś mi brakuje?


title: Stopniowe pisanie: „Prawie każdy język ze statycznym systemem pisania ma również dynamiczny system pisania”

text: To twierdzenie Aleksa Bromfielda stwierdza: > Prawie każdy język ze statycznym systemem typów ma również typ dynamiczny > system. Poza C nie mogę wymyślić wyjątku. Czy to uzasadnione roszczenie? Rozumiem, że w przypadku klas Reflection lub Loading w środowisku uruchomieniowym Java wygląda trochę tak — ale czy ten pomysł „stopniowego pisania” można rozszerzyć na dużą liczbę języków?


title: TypeScript lub JavaScript dla web developera noob

text: Po niedawnym wydaniu przez Microsoft TypeScriptu zastanawiałem się, czy jest to coś, co powinno być brane pod uwagę przez doświadczonego programistę WinForm i XAML, który chce zająć się tworzeniem stron internetowych. Z przeglądu wielu witryn i filmów online wynika, że system typów dla TypeScript ma dla mnie większy sens jako gruby programista klienta niż dynamiczny system typów w Javascript. Rozumiem, że Typescript kompiluje się do JavaScriptu, ale wydaje się, że krzywa uczenia się jest płytsza ze względu na obecne narzędzia dostarczane przez Microsoft. Jakie są Twoje myśli?


title: Czy Apple posiada jakiekolwiek prawa do oprogramowania, które tworzysz za pomocą ich narzędzi programistycznych?

text: Czy jesteś właścicielem praw do dowolnego oprogramowania, które tworzysz, niezależnie od tego, czy korzystałeś z narzędzi dostarczonych przez stronę trzecią? Dziękuję


title: Zmagam się z wyabstrahowaniem kodu animacji w mojej grze przy użyciu stylu funkcjonalnego. W jaki sposób mogę to zrobić?

text: Moja gra to odgórne shmup 2D zaprogramowane w funkcjonalnym stylu. Zmagam się z wyabstrahowaniem kodu odpowiedzialnego za animację pocisków. Istnieje wiele rodzajów broni z wieloma rodzajami pocisków. Oto kilka bardzo różnych: 1. **Standardowy pistolet**, który wystrzeliwuje pocisk, który pokonuje dystans w czasie. 2. **Laser**, który wystrzeliwuje linię, która w mgnieniu oka przechodzi od początku do końca. * Różni się od **standardowego pistoletu** pocisku, ponieważ jego pocisk nie przemieszcza się w czasie. Jest narysowana jako linia. W przeciwieństwie do standardowego pistoletu animacja wiązki laserowej powinna trwać po tym, jak pocisk w coś trafi. 3. **Psychiczna fala uderzeniowa**, która tworzy okrągłą falę uderzeniową wokół twojego ciała i uszkadza wszystko w zasięgu. Wielkość koła jest zmienna. * Różni się od **standardowego pistoletu** pocisku, ponieważ jego rozmiar jest zmienny i okrągły. Nie porusza się też. Walczę o to, jak mogę użyć do tego arkusza sprite. Wygląda na to, że najlepszym sposobem może być narysowanie okręgu na ekranie. Wszystkie pozostałe pociski to duszki. * Różni się od **lasera**, ponieważ ma kształt koła, a nie linii. Gdyby to było zorientowane obiektowo, ścieżka, którą bym wybrała jest prosta: utworzyłbym klasę `Animation`, która jest odpowiedzialna za animację siebie. Kod klienta nie miałby pojęcia _jak_ przebiega animacja, po prostu przekazywałby niezbędne obiekty, aby to zrobić. Ale nie jestem pewien, jak zrobić coś takiego w funkcjonalnym stylu. Teraz reprezentuję wszystko jako dane. `Pocisk` zawiera dane `animacji` takie jak: projectile: { type: "laser" animation: ... } Ale to, co wydaje się bardzo złe, to to, że muszę mieć jeden przełącznik, aby utworzyć ten pocisk, a następnie w moim kodzie renderującym, Muszę mieć przełącznik _inother_, aby zdecydować, jak wykorzystać dane do ich animacji. Np.: jeśli projectile.type to "standard gun" obróćBulletTowardsVelocityAndAnimateAtPosition(projectile) jeśli projectile.type to "laser" obróćLaserTowardsTargetAndAnimateFromStartToTarget(projectile) jeśli projectile.type to "psychiczna fala uderzeniowa" DrawCircleAroundProject wydaje mi się bardzo abstrakcyjna. Jaki jest lepszy sposób na zakodowanie tego, jednocześnie zachowując funkcjonalność?


title: Różnica między platformami internetowymi Yesod i Ocsigen

text: Przyglądałem się frameworkom internetowym w językach funkcjonalnych i ostatecznie zainteresowałem się Yesod i Ocsigen. O ile rozumiem, wykorzystują system typów, aby statycznie zapobiegać podstawowym błędom, takim jak nieprawidłowy kod HTML lub wewnętrzne martwe linki. Moje pytanie, czy istnieją praktyczne różnice, takie jak skupienie się na funkcjach lub dojrzałość między tymi dwoma frameworkami? Co ma jeden, czego brakuje drugiemu? Na przykład, czy za pomocą Yesod mogę napisać całą aplikację internetową w Haskell i skompilować odpowiedni komponent do JavaScript? Dziękuję.


title: Testowanie jednostkowe danych ładowanych statycznie

text: Scenariusz: Mam plik konfiguracyjny zawierający niektóre dane strukturalne, które są ładowane w czasie wykonywania i **nie** są modyfikowane przez aplikację, ale są przywoływane w wielu miejscach. Istnieją funkcje, które pobierają określone dane z pliku konfiguracyjnego (po jego załadowaniu do pamięci). Chciałbym napisać testy jednostkowe, które zapewniają, że dane nie zostały przypadkowo zmienione przez programistę, czy to dobra praktyka czy przesada? Np. `Assert(GetDataForKey("SomeKey") == "MyValue")`


title: Jak udowodnić, że przestrzeganie praktyk i standardów przemysłowych jest opłacalne, a inwestycje w refaktoryzację są dobre?

text: Zacząłem pracować w firmie nie tak dawno temu, a to, co widzę w projekcie, to duża ilość kodu niskiej jakości i kilka niestandardowych pomysłów zamiast standardów branżowych i wybranych najlepszych praktyk. Ale kiedy próbuję porozmawiać o tym z menedżerem, często widzę odpowiedzi, że faceci, którzy to robią, robią to szybko i są dobrzy itp., itd.


title: Jak mogę uczyć się C# z Stack Overflow?

text: Jak mogę uczyć się C# z Stack Overflow? Mam tylko podstawy języka C# z kilkoma prostymi ćwiczeniami; teraz chcę przejść do najwyższego poziomu C# za pośrednictwem przepełnienia stosu, czytając wszelkie pytania otagowane "c#". Pytania nie są uporządkowane od najłatwiejszych do najtrudniejszych. Czy masz pomysł, jak nauczyć się C# od Stack Overflow?


title: Wielowątkowość w C++ w systemie Unix

text: Mam dwa powiązane pytania: 1. Czy są jakieś dobre książki do wielowątkowości w C++, zwłaszcza teraz, gdy C++11 zawiera wielowątkowość w standardowej bibliotece? 2. Mam książkę Wrox Programming on Unix (1000 stron gruby, czerwony) i używam w niej klasy Unix Thread. * Jak ten kod ma się do boost i wielowątkowych bibliotek C++11? * Czy jest lepszy/gorszy/po prostu specyficzny dla Uniksa itp.? * Czy wydajność jest taka sama?


title: Jaki jest rzeczywisty cel MVC?

text: Widziałem wiele rzeczy, które opisują, jak to się robi, ale niewiele mówi, DLACZEGO to się robi. Czy to tylko sposób na zachowanie czytelności kodu, czy może jest lepszy powód?


title: Najlepsze wzory dla jednorazówek o zmiennym zakresie

text: Mam `Client`, który używa jednorazowego `Connection` do komunikowania się z usługą zdalną. `Połączenie` jest nieco drogie w konfiguracji i musi być prawidłowo Dispose()d. Chcę zezwolić wielu metodom w `Client` na współdzielenie połączenia, na przykład: using (client._connection = client.Connect()) { client.SyncTime(); klient.AktualizujUżytkownicy(); klient.SomeOtherOperation(); } Ale nie chcę _nalegać_ na klientów `Klienta` zarządzających połączeniami. Powinni mieć możliwość wywoływania pojedynczych pojedynczych metod `Klienta` bez zwracania uwagi na `Połączenia`. Oto wzór, którego aktualnie używam. Sprawia, że SRP płacze. Jakieś sugestie, jak mogę to zrobić lepiej, czy w ogóle powinienem to robić? public class Klient { Połączenie _connection; public void SyncTime() { bool wasConnected = _connection == null; spróbuj { if (! wasConnected) _connection = Connect(); _connection.ActuallyDoSomeWork(); ... } w końcu { if (! wasConnected) _connection.Dispose() } } }


Zaczynam uczyć się Scheme przez filmy SICP, a następnie chciałbym przejść do Common Lisp. Język wydaje się bardzo interesujący, a większość ludzi piszących o nim książki twierdzi, że ma niezrównaną siłę wyrazu. CL wydaje się mieć przyzwoitą bibliotekę standardową. **Dlaczego Lisp nie jest bardziej rozpowszechniony?** Jeśli jest naprawdę tak potężny, ludzie powinni go używać wszędzie, ale zamiast tego prawie niemożliwe jest znalezienie, powiedzmy, ogłoszeń o pracę w Lisp. Mam nadzieję, że to nie tylko nawiasy, bo po pewnym czasie nie są one wielkim problemem.


title: C# open-source framework do wielowątkowego zarządzania zadaniami

text: Mam bibliotekę API dla C#, która zapewnia elastyczne wielowątkowe zarządzanie zadaniami obiektów na podstawie zadań. Biblioteka została szeroko rozwinięta dla projektu, który został później anulowany przez klienta. Otrzymałem prawa do biblioteki, a klienta nie obchodzi, co z nią teraz zrobię. Nie wiem co zrobić z tym kodem źródłowym. Czy możesz mi wyjaśnić, jakie są kroki w celu pobrania kodu źródłowego i uczynienia go udanym projektem open source? Jak przyciągasz programistów? Skąd ludzie będą wiedzieć, że biblioteka istnieje? EDYCJA: Powodem, dla którego zadaję to pytanie, jest doprowadzenie kodu źródłowego do stanu open source. Dodam pełny zestaw testów jednostkowych, dokumentacji, przykładów itp. itd. To oznacza większą inwestycję mojego czasu, a jeśli nie ma opłacalności „tj. nikt tego nie używa”. Więc jaki jest sens?


title: Czy ponowne użycie obiektów zoptymalizuje tę często nazywaną funkcję?

text: Załóżmy, że mam funkcję, którą muszę często wywoływać, może kilka tysięcy razy przy każdym wciśnięciu lub ruchu myszy. Używa instancji funkcji (klasy) o nazwie `Transform`: function func1(a, b, c) { var t = new Transform(); t.obrót(a); t.skala(b, c); powrót t.m[0]; } Więc tworzę tysiące nowych przekształceń, jak nazywam to lotami `func1`. Co by było, gdyby zamiast tworzyć za każdym razem `nowe Transform()`s, stworzyłbym mały system do przydzielania dodatkowych transformacji tylko wtedy, gdy są potrzebne i ponownego ich wykorzystania: window.Util = { _CachedTransforms: [], tempTransform: function () { var arr = Util._CachedTransforms; zmienna temp = arr.pop(); if (temp === undefined) zwróć nowe Transform(); temp. powrotu; }, freeTransform: function(temp) { Util._CachedTransforms.push(temp); } } Wtedy zamiast tego mógłbym wywołać `func2`: function func2(a, b, c) { var t = Util.tempTransform(); t.reset(); t.obrót(a); t.skala(b, c); var wynik = t.m[0]; Util.freeTransform(t); zwróć wynik; } Używając `func2` kilka tysięcy razy, `nowa transformacja` jest wywoływana tylko raz. Może to sugerować korzyść, ale liczby z jsperf nie wydają się sugerować żadnej. Jeśli chcesz zobaczyć te dwie funkcje w działaniu, a także klasę Transform, spójrz na jsperf: http://jsperf.com/transforms A szczególnie: http://jsperf.com/transforms/2 dużo podczas wydarzenia, mój test jsperf robi: var a; for (var i = 0; i < 4000; i++) { a += func1 (1, i, 3); // vs func2 } Mogą istnieć lepsze sposoby sprawdzenia, czy jest to korzystne, czy nie. Czy czegoś mi brakuje? Mówiąc szerzej, czy takie ponowne użycie obiektów nadal jest dobrym pomysłem w tym scenariuszu, czy kiedykolwiek?


title: Czy koncepcja złożoności obliczeniowej jest ważna dla programistów?

text: Miałem wrażenie, że pojęcia złożoności czasu i pamięci są koniecznością dla absolwentów Compsci, ale po studiach inżynierskich nie mam żadnej wiedzy, jeśli tak jest. Ostatnio byłem zaskoczony wywiadem z absolwentami miejscowej uczelni, którzy nawet nie znają tej koncepcji. Myślę, że moje pytanie brzmi: czy koncepcja złożoności obliczeniowej jest ważna dla programistów? A czy powinno się tego uczyć na studiach licencjackich?


title: Jak wypełnić licencję EASTL

text: Integruję EASTL z moim frameworkiem do programowania gier. Zrobiłem w nim kilka zmian, ponieważ mam własny podsystem zarządzania pamięcią i teraz zastanawiam się, co muszę zrobić, aby nie złamać licencji, na której wydano EASTL. Pliki kodu źródłowego zawierają następującą informację: Copyright (C) 2005,2009-2010 Electronic Arts, Inc. Wszelkie prawa zastrzeżone. Redystrybucja i używanie w formie źródłowej i binarnej, z modyfikacją lub bez, jest dozwolone pod warunkiem, że spełnione są następujące warunki: 1. Redystrybucja kodu źródłowego musi zawierać powyższą informację o prawach autorskich, tę listę warunków oraz następujące zastrzeżenie. 2. Redystrybucje w formie binarnej muszą zawierać powyższą informację o prawach autorskich, tę listę warunków oraz następujące zastrzeżenie w dokumentacji i/lub innych materiałach dostarczonych z dystrybucją. 3. Ani nazwa Electronic Arts, Inc. („EA”), ani nazwiska jej współpracowników nie mogą być używane do promowania lub promowania produktów wywodzących się z tego oprogramowania bez uprzedniej pisemnej zgody. NINIEJSZE OPROGRAMOWANIE JEST DOSTARCZANE PRZEZ ELECTRONIC ARTS I JEJ WSPÓŁTWÓRCÓW „TAK JAK JEST” ORAZ WSZELKIE WYRAŹNE LUB DOROZUMIANE GWARANCJE, W TYM MIĘDZY INNYMI DOROZUMIANE GWARANCJE WARTOŚCI HANDLOWEJ I PRZYDATNOŚCI DO OKREŚLONEGO CELU. W ŻADNYM WYPADKU ELECTRONIC ARTS ANI JEJ TREŚCI NIE PONOSZĄ ODPOWIEDZIALNOŚCI ZA JAKIEKOLWIEK BEZPOŚREDNIE, POŚREDNIE, PRZYPADKOWE, SZCZEGÓLNE, PRZYKŁADOWE LUB WTÓRNE SZKODY (W TYM MIĘDZY INNYMI ZAKUP TOWARÓW ZASTĘPCZYCH LUB USŁUG; UTRATĘ DANYCH; LUB PRZERWANIA W DZIAŁALNOŚCI) JEDNAK SPOWODOWANE I NA DOWOLNEJ TEORII ODPOWIEDZIALNOŚCI UMOWNEJ, ŚCISŁEJ LUB CZYNNEJ (W TYM ZANIEDBANIA LUB INNEGO) WYNIKAJĄCEJ Z KORZYSTANIA Z TEGO OPROGRAMOWANIA, NAWET JEŚLI JEST WSKAZANE. Skoro prawdopodobnie w pewnym momencie będę publikował kod źródłowy na GitHubie, ale nie planuję wypuszczać żadnych binariów bez kodu źródłowego, czy mogę po prostu dodać coś podobnego do moich własnych plików źródłowych i być z tym w porządku? Czy zrobi to coś takiego? /* * Copyright (c) 2012 Bartłomiej Siwek Wszelkie prawa zastrzeżone. * Na podstawie EASTL (https://github.com/paulhodge/EASTL) – poniżej znajdują się informacje o prawach autorskich. */ /* * Prawa autorskie (C) 2005,2009-2010 Electronic Arts, Inc. Wszelkie prawa zastrzeżone. * * Redystrybucja i użycie w formie źródłowej i binarnej, z * modyfikacją lub bez, jest dozwolone pod warunkiem spełnienia * następujących warunków: * * 1. Redystrybucja kodu źródłowego musi zawierać powyższą informację o prawach autorskich *, tę listę warunków i następujące wyłączenie odpowiedzialności. * 2. Redystrybucje w formie binarnej muszą zawierać w dokumentacji * i/lub innych materiałach dostarczonych wraz z dystrybucją powyższą informację o prawach autorskich *, tę listę warunków i następujące wyłączenie odpowiedzialności. * 3. Ani nazwa Electronic Arts, Inc. („EA”), ani nazwiska * jej współtwórców nie mogą być używane do promowania lub promowania produktów opartych * na tym oprogramowaniu bez uprzedniej pisemnej zgody. * * NINIEJSZE OPROGRAMOWANIE JEST DOSTARCZANE PRZEZ ELECTRONIC ARTS I JEJ WSPÓŁTWÓRCÓW „TAK JAK JEST” ORAZ WSZELKIE * WYRAŹNE LUB DOROZUMIANE GWARANCJE, W TYM MIĘDZY INNYMI DOROZUMIANE * GWARANCJE PRZYDATNOŚCI HANDLOWEJ I PRZYDATNOŚCI DO OKREŚLONEGO CELU. W ŻADNYM WYPADKU ELECTRONIC ARTS ANI JEJ TREŚCI NIE PONOSZĄ ODPOWIEDZIALNOŚCI ZA JAKIEKOLWIEK * BEZPOŚREDNIE, POŚREDNIE, PRZYPADKOWE, SZCZEGÓLNE, PRZYKŁADOWE LUB WTÓRNE SZKODY * (W TYM MIĘDZY INNYMI ZAKUP TOWARÓW LUB USŁUG ZASTĘPCZYCH, * UTRATY DANYCH, LUB ZYSKÓW LUB PRZERWANIE W DZIAŁALNOŚCI), JAKIEKOLWIEK SPOWODOWANE I * NA DOWOLNEJ TEORII ODPOWIEDZIALNOŚCI UMOWNEJ, ŚCISŁEJ LUB CZYNNEJ * (W TYM ZANIEDBANIA LUB INNEGO) WYNIKAJĄCE W JAKIKOLWIEK SPOSÓB Z KORZYSTANIA Z * TEGO OPROGRAMOWANIA, NAWET MOŻLIWOŚĆ TAKICH USZKODZEŃ. */ PS To jest repost podobnego do prawnego pytania ze StackOverflow, w którym zostało znalezione poza tematem. Jeśli to również jest nie na temat, proszę powiedz mi, gdzie mogę zadać takie pytanie?


title: LINQ to SQL — logika biznesowa w innym zestawie?

text: Więc próbuję swoich sił w tej całej wielopoziomowej aplikacji z ASP.NET 4. Oprogramowanie, które opracowałem, jest koszmarem konserwacji i nie jest zbyt dobrze zorganizowane. Rozejrzałem się trochę po Internecie i nie mogę znaleźć przykładu tego, czego tutaj szukam. Niech ktoś rozbierze ten projekt. Moja warstwa dostępu do danych będzie zestawem z LINQ to SQL. Będę miał warstwę logiki biznesowej, która odwołuje się do zestawu DAL i robi to, co robią BLL. Bardzo ogólne i podstawowe rzeczy. Następnie będę miał klasę obiektów biznesowych, która wykonuje część związaną z danymi, ale jest bardziej typu "pracy" - jak generowanie dokumentów itp. Witryna internetowa będzie współdziałać z LOGO i obiektami biznesowymi. A więc: DAL | | | BLL----------BO | | | | | | Sieć----------| Czy robię to zbyt skomplikowane? Czy powinienem po prostu umieścić tam moją logikę biznesową z klasami LINQ w DAL? Nie jestem pewien, jak DataContext będzie działać w oddzielnym zestawie z klasami, które dziedziczą z klas LINQ. Myśli?


title: Czy moje konta GitHub i SourceForge mogą współdzielić to samo repozytorium?

text: Podoba mi się, że SourceForge może również pozwolić ludziom przeglądać twój kod za pomocą Git. Ale zanim jeszcze ustawiłem projekt na SourceForge, miałem dla niego repozytorium GitHub. Teraz, gdy stworzyłem swój projekt SourceForge, miałem możliwość skorzystania z narzędzia Git. Problem polega na tym, że kiedy to zrobiłem, stworzyłem nowe repozytorium od podstaw. Chciałbym użyć mojego istniejącego repozytorium GitHub z moim projektem SourceForge, czy to możliwe? W tej chwili projekt SourceForge nie zawiera plików, więc przycisk na stronie podsumowania, zamiast przycisku „Pobierz”, jest przyciskiem „Przeglądaj kod”, ale przycisk prowadzi do pustego repozytorium. Zastanawiam się więc, czy możliwe jest połączenie mojego projektu SourceForge z moim istniejącym repozytorium GitHub, czy też muszę usunąć narzędzie „Kod” z mojego projektu SourceForge i po prostu zostawić link do mojego repozytorium w opisie?


title: Czy istnieją języki, które rozszerzają się na typy iteratorów STL?

text: Wiele języków używa koncepcji iteratora. C++ STL rozszerza się o iteratory wejściowe, iteratory wyjściowe, do przodu, dwukierunkowe, dostęp losowy i inne. O ile wiem, te rozróżnienia nie istnieją w innych językach. W tej prelekcji autor STL, Aleksander Stiepanow, mówi między innymi o iteratorach, wspomina o idei i iteratorach dwuwymiarowych. Nigdzie ich nie widziałem. Pytanie 1: Czy istnieją inne języki/biblioteki, które rozwijają się na iteratorach i/lub używają iteratorów dwuwymiarowych? Pytanie 2: Czy ktoś mógłby wskazać mi dobre zasoby na temat teorii iteratorów (jeśli tak to się nazywa)?


title: Efektywnie obliczać odległość lokalizacji od POI?

text: Chcę napisać aplikację na Androida, która przechowuje informacje o tym, gdzie skały (wspinaczkowe) znajdują się na większym obszarze. Chcę wyświetlić wszystkie skały w pobliżu mojej bieżącej lokalizacji (powiedzmy poniżej 500m) i mogę aktualizować wyświetlaną odległość do nich (odległość w linii prostej) w czasie rzeczywistym. Naiwne obliczenie odległości między dwoma punktami nie będzie skuteczne w przypadku bazy danych skał z tysiącami wpisów. W tym szczególnym przypadku odradza się korzystanie z usług online, ponieważ nie są one w ogóle dostępne. Słyszałem o bazach danych uwzględniających lokalizację. Czy ktoś ma z nimi doświadczenia (pod Androidem)? Czy wystarczy podzielić mapę skał na ćwiartki i wzbogacić bazę danych skał o te informacje? (Następnie oblicz kwadrant bieżącej lokalizacji i oblicz tylko odległości skał w pobliskich kwadrantach?) Próbowałem znaleźć odpowiedź na to pytanie (jestem pewien, że inni też mieli to pytanie), ale nie mogłem znaleźć niczego odpowiedniego. **tl;dr** Jak **skutecznie** znaleźć ciekawe miejsca w pobliżu mojej aktualnej lokalizacji GPS?


title: Dystrybucja serwerów zapewniająca wysoką wydajność

text: Opracowałem aplikację Socket na szczycie TCP w .NET C#, która umożliwia wielu klientom wysyłanie plików od siebie za pośrednictwem używanego przeze mnie VPS. Większość transferów plików odbywa się między osobami w tym samym regionie, powiedzmy, nawet w tej samej okolicy. Tak więc, jeśli podłączonych jest 300 klientów, niektórzy z nich będą połączeni, powiedzmy z Europy, inni z, powiedzmy, USA itd. Ci, którzy są połączeni z Europy, nigdy nie będą próbowali wysyłać plików do tych w USA. Najbardziej liczy się dla mnie skalowalność (miejmy nadzieję, że będę miał tysiące użytkowników łączących się jednocześnie) i niskie opóźnienia (responsywność) jeśli chodzi o szybkość przesyłania/pobierania. Coś mi mówi, że jeśli chcę, aby pliki (do 2 MB) były szybko przesyłane między moimi klientami, powinienem zaopatrzyć się w VPS w Europie, USA, Azji itp. W ten sposób użytkownicy uzyskają wyższe prędkości transferu, a w przypadku jeden z serwerów ulegnie awarii, będą mogli korzystać z drugiego. Poza tym powinienem mieć osobną bazę danych dla informacji/statystyk użytkowników, z którą łączą się wszystkie serwery w razie potrzeby. Moje pytanie brzmi, jaka jest powszechna praktyka dla takiego użytkowania i wymagań? Każda wskazówka/terminologia, z którą powinienem zacząć się zapoznawać, będzie bardzo mile widziana. Dziękuję


title: Jak uzasadnić migrację z Javy 6 do Javy 7?

text: Przeprowadzaliśmy migrację z Javy 6 do Javy 7. Projekt jest opóźniony i istnieje ryzyko porzucenia, w takim przypadku będzie nadal używał Javy 6. Jakie są konkretne ulepszenia w Javie 7, z którymi moglibyśmy wrócić do naszego menedżera i przekonać mu ważne jest, aby korzystać z JDK 7? Poszukuję poprawek błędów, które mógłbym wyróżnić w Oracle Java 7 (w odniesieniu do Javy 6). Poprawki w bezpieczeństwie, wydajności, Javie 2D/drukowaniu itp. będą w moim przypadku bardziej do sprzedania. Na przykład poprawki kompilatora na niewiele się zdadzą. [Przechodzę przez wiele witryn, takich jak przewodnik dotyczący przyjęcia Oracle, baza danych błędów, pytania dotyczące przepełnienia stosu]. Aktualizacja: Dzięki za odpowiedzi. Przesunęliśmy aktualizację do następnej wersji. Najbliżej dotarliśmy do bezpieczeństwa. Przyjęcie najwyżej głosowanej odpowiedzi.


title: Czy generalnie dobrym pomysłem jest praca z JDK 6 zamiast JDK 7?

text: O ile wiem, nie ma zbyt wielu różnic między JDK 6 a JDK 7. Przynajmniej nie natknąłem się jeszcze na różnicę (kodowałem z JDK 7 i JDK 6). Na wielu komputerach działa JRE 6 lub JRE 7. Kompilowanie mojego programu przy użyciu JDK 7 zmniejszy liczbę potencjalnych komputerów, na których można uruchomić moją aplikację. Czy generalnie dobrym pomysłem jest, aby zawsze programować przy użyciu JDK 6 i kompilować mój program dla JRE 6? Czy to coś powszechnego? A może to ogólnie zły pomysł?


title: Organizacja $(document).ready

text: Mam trochę kodu, który wygląda mniej więcej tak, z wyjątkiem 2 sekcji, jest ich około 20 i mają w sobie prawdziwy kod: /*------------ * Zawartość: * 1. Załaduj suwak * 2. Sprawdź formularz /*---------------- /*--------------- * 1. Załaduj suwak /*------------ --- var slider_id = 101; var liczba_slajdów = 10; $(document).ready(function(){ // Uruchom suwak gotowości dokumentu }); /*---------------- * 2. Sprawdź formularz /*---------------- var pola = {"tekst","liczba","textarea"}; $(document).ready(function(){ // Zrób trochę gotowego dokumentu }); Staram się, aby wszystko było schludne, ponieważ na pewnym etapie nastąpi przekazanie. Moje pytanie brzmi, czy powinienem zrobić to tak, jak zrobiłem, czy coś takiego: /*------------ * 1. Załaduj suwak * 2. Sprawdź formularz /*------- ----- /*--------------- * 1. Załaduj suwak /*------------ var slider_id = 101; var liczba_slajdów = 10; /*---------------- * 2. Sprawdź formularz /*---------------- var pola = {"tekst","liczba","textarea"}; $(document).ready(function(){ /*--------------- * 1. Załaduj suwak /*------------ // Uruchom suwak gotowości dokumentu /*------------ * 2. Sprawdź formularz /*---------------- // Zrób jakiś gotowy dokument z formularza }); Czy zatem mam zminimalizować wywołania związane z dokumentami, czy też pogrupować powiązane treści? Po prostu samoukiem, więc nie mam pojęcia o tego rodzaju najlepszych praktykach. Dziękuję


title: Przechowywanie znaków ucieczki mysqli w bazie danych, ale poprawne ich wyprowadzanie za pomocą htmlspecialchars()

text: Posiadam funkcję czyszczenia bazy danych, z której korzystam, gdy użytkownik wprowadza jakieś dane do mojej witryny. Uciekam do znaków mysqli za pomocą mysqli_real_escape_string(), ale chcę również wyprowadzić zawartość za pomocą htmlspecialchars(). Problem polega na tym, że po prostu powiedzmy, że użytkownik wprowadza coś za pomocą pojedynczego cudzysłowu; który zostanie zmieniony przez funkcję sanitize i zostanie wypisany jako \'. Czy istnieje sposób na zapisanie go w ten sposób, a następnie wyprowadzenie go jako '?


title: Ogólny interfejs kontroli usług

text: Potrzebuję interfejsu do usługi zaplecza, głównie do poleceń sterujących (stop, status, cancel, reload config). Usługa może być w Pythonie, Perlu, Javie lub cokolwiek i działa w sposób ciągły. Interfejs pozwoli mi wysyłać rzadkie polecenia do uruchomionego procesu. Obsługa sygnału może nakazać procesowi zatrzymanie się, a sygnały USR1 i USR2 pozwalają mu zrobić jeszcze dwie rzeczy. Tomcat konfiguruje specjalny odbiornik na stałym numerze portu, aby go wyłączyć, być może z powodu ograniczeń w obsłudze sygnałów Java. Ale chciałbym, żeby zareagował, a nie tylko zareagował. I chciałbym użyć tego do usługi napisanej w dowolnym języku na dowolnej platformie. Mam nadzieję, że uniknę komunikacji między oprogramowaniem pośredniczącym lub bazami danych, ponieważ jest to po prostu żądanie/odpowiedź (P: „jak się masz?” / A: „Pracuję od 3 godzin z najwyższą wydajnością”). Rzuciłem okiem na te, ale wydają się przesadą dla prostego interfejsu sterującego: * DBus \- ogólna magistrala komunikatów międzyprocesowych * UPnP \- komunikacja z urządzeniami * Avahi \- Zapytania DNS w celu znalezienia usług * Hadoop YARN \- Dystrybucja działa w sieci, równolegle przetwarzanie Każdy wydaje się atrakcyjny, ale wydaje się ciężki lub wymaga wcześniejszego zainstalowania specjalnego oprogramowania lub nie jest przeznaczony dla każdego języka lub każdej platformy. Gdybym napisał własny, mógłbym napisać jednowątkowy odbiornik TCP z żądaniami/odpowiedziami JSON. Wydaje się, że jest to tak lekkie i uniwersalne, jak to tylko możliwe, i jest wystarczająco małe, aby można było korzystać z usługi „hello world”, i wystarczająco duże, aby rozmawiać z dowolną usługą. JSON przez TCP byłby bardzo przyjazny dla wiersza poleceń (curl lub netcat), a zatem łatwo skryptowalny. Wiele języków ma już bibliotekę JSON (C++, Java itp.) na dowolnej platformie. Trudniejszym podejściem jest dodanie semantyki HTTP do żądania/odpowiedzi JSON, aby można było przejść do aplikacji lub użyć curl do jej kontrolowania. Ale osadzanie HTTP wydaje się być dużo miejsca i złożoności, gdy obsługuje tylko kilka zasobów (PUT text/plain "true" do /stop, aby zamknąć aplikację, pobierz aplikację/json z /status, aby zobaczyć, jak działa). Szczerze mówiąc, jestem zaskoczony, że nikt nie wymyślił standardowego interfejsu sterowania usługami dla prostych rzeczy, takich jak podstawowe polecenia sterujące. W pracy użyliśmy CORBA i zarejestrowaliśmy się w serwisie nazewniczym, a potem musieliśmy zajmować się problemami z połączeniem Java/C++ ORB i wydawało się, że to mnóstwo kodu na coś, co powinno być proste.


title: Czy istnieje nazwa tego antywzoru? (Zmienna ma znaczenie zależne od kontekstu)

text: Pracuję nad starszym systemem z problematycznym zachowaniem - używa tych samych identyfikatorów do oznaczania różnych rzeczy w różnych miejscach. Omawiany system to system CRM. Wykorzystuje specjalne kody dla konta każdego abonenta, aby oznaczyć pakiet funkcji, do których wykupili dostęp. Kody te są przesyłane do serwerów licencyjnych, które aktywują odpowiednie funkcje. Jednak ten sam kod oznacza różne rzeczy w zależności od tego, który serwer licencyjny obsługuje subskrybenta. Na przykład: * Kod 241 oznacza, że subskrybent ma dostęp do funkcji 1-10, 12 i 20-50, jeśli są one obsługiwane przez serwer licencji A. * Kod 241 oznacza, że subskrybent ma dostęp do funkcji 1-20, 33, 34, i 50, jeśli są obsługiwane przez serwer licencji B. Oczywiście (przynajmniej dla mnie), byłoby lepiej, gdyby każdy kod oznaczał jedno. Oznacza to, że 241 powinno oznaczać (1-10, 12, 20-50) wszędzie, a nowy kod 242 powinien wszędzie oznaczać (1-20, 33, 34 i 50). Czy istnieje nazwa problemu z danymi pozapasmowymi, które są wymagane do jednoznacznego określenia czegoś?


title: Wzorzec dziedziczenia kombinacji JavaScript

text: W rozdziale o Profesjonalnym JavaScript dla programistów WWW na temat OOP Nicholas Zachas opisuje wzorzec dziedziczenia JavaScript, który nazywa _dziedziczeniem kombinacji_. Podstawowa idea polega na tym, że metody są dziedziczone poprzez łańcuchowanie prototypów; mając na uwadze, że właściwości rodzica są przekazywane potomkom przez wywołanie konstruktora nadrzędnego w konstruktorze podrzędnym. Mały przykład: function Parent() { this.parentProperty; } Parent.prototype.parentMethod = function() { console.info(parentProperty); } funkcja Dziecko() { Rodzic(); } Child.prototype = new Parent(); Swoją dyskusję kończy stwierdzeniem, że „dziedziczenie kombinacyjne jest najczęściej używanym wzorcem dziedziczenia w JavaScript”. Jednak w dalszej dyskusji na temat wzorca dziedziczenia prototypowego wspomina o mankamencie dziedziczenia kombinacyjnego, a mianowicie, że typ potomny wywołuje konstruktor rodzica dwukrotnie: raz podczas tworzenia prototypu, a następnie ponownie w konstruktorze. Moje pytanie brzmi: dlaczego wzorzec dziedziczenia kombinacji sugeruje rozszerzenie prototypu poprzez posiadanie prototypu dziecka jako **instancja** typu rodzica, dlaczego nie miałby po prostu odwoływać się bezpośrednio do prototypu rodzica? Korzystając z poprzedniego przykładu, po prostu nie wykonaj następujących czynności: Child.prototype = Parent.prototype;


title: Jak mogę utrzymać swoje umiejętności techniczne po zostaniu kierownikiem projektu?

text: W miarę rozwoju kariery zauważyłem, że wykonuję mniej prac technicznych, a więcej prac związanych z zarządzaniem projektami. Żartuję, że z każdym dniem robię się coraz głupsza. Za każdym razem, gdy wracam do prac technicznych, wydaje mi się, że trochę trudniej jest zacząć działać. Jakie sugestie mają ludzie, aby utrzymać wiedzę techniczną przez całą twoją karierę?


title: Gdzie Windows Workflow Foundation wpisuje się w architekturę oprogramowania pośredniczącego zorientowanego na przesyłanie wiadomości?

text: Próbowałem znaleźć informacje online o tym, gdzie WWF 4.5 pasuje do architektury opartej na kolejce komunikatów przedsiębiorstwa przy użyciu centralnego brokera (w szczególności RabbitMQ). Wygląda na to, że obowiązki trochę się pokrywają, ponieważ WWF oferuje możliwość wstrzymywania i wznawiania (utrzymywania/przywracania) wystąpień przepływu pracy. Zastanawiam się, czy błędnie utożsamiam tę funkcję WWF z funkcją wstrzymywania i wznawiania z ogólną koncepcją kolejkowania wiadomości. Po przyjrzeniu się MassTransit, w szczególności wykazowi kodu przykładowej Sagi pokazującej „działania” kodu równoległego, które następnie „łączą się” po zakończeniu… wydaje się, że WWF wykluczający funkcję wstrzymania-wznawiania w tym kontekście, jest lepszy w porównaniu z MassTransit. .czy to trafna ocena?


title: Jak wprowadziłbyś zwinną metodologię, taką jak scrum?

text: Jeśli znalazłeś zwinne i wszedłeś do miejsca pracy, które nie przestrzega żadnej metodologii i jest odporne na zmiany (jak zwykle większość ludzi), w jaki sposób możesz wprowadzić zwinną metodologię, taką jak scrum? **UWAGA:** * Cóż, sformułowałem to jako pytanie hipotetyczne, ale tak nie jest. * Sam nie jestem zbyt pewny Agile


title: Czy mogę udostępniać ~1k dynamicznie aktualizowanych danych między stronami HTML5/JS używając tylko apache2?

text: Mam stronę internetową HTML5/Javascript. Istnieje formularz, który aktualizuje dane JSON. Są inne strony, na których chciałbym dynamicznie załadować dane JSON. Wiem, jak to zrobić przez Tomcat/JSP, ale chciałbym, aby ta strona była wyłącznie apache2. Czy istnieje sposób na utrwalenie i odczytanie danych JSON? Jest w porządku, jeśli dane są tymczasowe i zostaną utracone po odbiciu Apache2.


title: Jako programista samouk, jak mogę zdobyć podstawy akademickie bez ponownego chodzenia do szkoły?

text: Zarabiałem całkiem nieźle jako programista-samouk, ale kiedy odkrywam, że dyskutuję na podstawowe tematy niskiego poziomu z moimi rówieśnikami, którzy mają dyplom CS, pojawiają się dziury w mojej wiedzy. Zajmuję się szeroko pojętym obrazem (architekturą), więc przez długi czas nie przeszkadzało mi to, ale ostatnio zastanawiałem się, czy mogę zastosować podejście, które pomogłoby mi nauczyć się tych podstaw bez wracania do szkoły? Czy istnieją książki, strony internetowe lub filmy, które możesz polecić, które dałyby mi oddolną perspektywę, a nie uczenie się ich tak, jak potrzebujesz mentalności?


title: Jak śledzić błędy logiczne w algorytmach

text: Jestem początkujący w algorytmach. W zeszłym roku brałem udział w Google Code Jam. Jednym z głównych problemów, z jakimi zetknąłem się podczas konkursu, było to, że mój kod działał poprawnie na moich przypadkach testowych, ale kiedy przesyłałem dużą liczbę przypadków testowych, nie udało mi się ich zaliczyć, powodując błąd logiczny. Więc moje pytanie brzmi w zasadzie, jak mogę śledzić błędy logiczne w moim kodzie w sytuacji, gdy nie pasuje on do niektórych przypadków testowych?


title: Jak poradzić sobie z wolnym API w PHP?

text: Piszę publiczną aplikację sieci Web, aby uzyskać dane giełdowe ze sklepu Magento. Udało mi się uzyskać dostęp do danych, ale okazuje się, że każdy produkt muszę zapytać o dane magazynowe z osobna. Z tysiącami przedmiotów jest to świnia zasobów i zajmuje dużo czasu. Tego nie da się uniknąć. Tak po prostu działa ich API i muszę to zrobić w ten sposób. Jak mogę zakodować coś w php, które działa w tle, zbierając dane api przez skubanie ich w spokojniejszy, bardziej przyjazny sposób, i nie nękać ich sklepów wywołaniami SOAP api? Czy mam rację myśląc, że muszę użyć takiego procesu w tle: $pid = shell_exec(sprintf('%s > /dev/null 2>&1 & echo $!', $command)); ...a potem zapytaj o $pid? Przechowywać je w bazie danych? Czy są jakieś przykłady menedżerów procesów w tle?


title: Uzasadnione powody dla odwołań cyrkularnych w C++

text: Mam projekt napisany w C++, nad którym pracuję, który ma relację rodzic-dziecko, gdzie każde dziecko ma tylko jednego rodzica. Po obejrzeniu tego postu postanowiłem wcześniej, że sprawię, że dzieci nie będą wiedziały o swoich rodzicach. Trochę tła mojego projektu, zanim przejdę do mojego pytania: rodzicami w tej sytuacji są obiekty reprezentujące zbiór powiązanych ze sobą „bloków” obliczeniowych. Rodzic (klasa "Model") pobiera jedną lub więcej wartości wejściowych, przepuszcza je przez swoje bloki, a bloki zwracają jedną lub więcej wartości wyjściowych. Obiektami potomnymi są Bloki, a Blok należy do dokładnie jednego Modelu. Problem polega na tym, że pewien rodzaj Bloku może zawierać Model, abym mógł je zagnieździć i ponownie wykorzystać modele. Chociaż większość bloków nie wie nic o klasie Model, ModelBlock (blok dziedziczący) wie o modelach i może hermetyzować Model. **Pytanie:** Wygląda na to, że powyższe działa całkiem dobrze, przynajmniej w konsolowej wersji mojej aplikacji. Jednak potrzebuję GUI, aby móc stworzyć dowolny duży model bez utraty rozumu, więc zacząłem go tworzyć. Problem powrócił do swojej brzydkiej głowy, gdy zdałem sobie sprawę, że Bloki ogólnie muszą wiedzieć o swoim Modelu, aby ModelBlocks mógł informować Model, gdy jest używany w innym Modelu. Dzieje się tak, aby móc łatwo znaleźć „osierocone” modele, które nie są modelem głównym i nie są używane w żadnym innym kontekście (co oznacza, że nigdy nie zostaną uruchomione). Myślę, że mógłbym uczynić to specyficznym dla ModelBlocks, ale jeśli mam zamiar zrobić coś takiego, dlaczego nie zastosować go do wszystkich bloków? W języku C# pozornie nie jest to zła praktyka, aby użyć odwołania cyklicznego, aby to osiągnąć (Entity Framework robi to wazoo... sieje spustoszenie z serializatorami). Jednak używanie odwołań cyklicznych wydaje się bardzo tabu w C++. Zastanawiam się więc, czy powyższe jest uzasadnionym użyciem. Gdybym to zrobił, Blocks zostałby poinformowany o zniszczeniu ich macierzystego Modelu, aby wiedzieli, czy są sierotami. Nawet jeśli powyższe nie jest, czy są uzasadnione zastosowania odwołań cyklicznych w C++, ponieważ wydają się one być stosunkowo powszechnymi innymi językami (oczywiście przy założeniu, że te programy w tych innych językach korzystające z odwołań cyklicznych nie mają poważnych problemów projektowych) ? Jeśli nie wyjaśniłem wystarczająco dobrze mojego pytania, daj mi znać, a postaram się wyjaśnić. EDYCJA: Powinienem wspomnieć, że rzeczywiste implementacje są oddzielone od tego wszystkiego, ponieważ używam interfejsów (klas ze wszystkimi czystymi funkcjami wirtualnymi) do definiowania wyglądu bloku lub wyglądu modelu. Oto częściowy diagram klas z proponowanymi przeze mnie zmianami: http://oi50.tinypic.com/16c8cwn.jpg Oto źródło: https://github.com/kcuzner/Simulate/tree/develop. Jeśli masz ochotę to zbudować, zależy to od Qt >= 4,7, boost >= 1,52. Projekty są projektami Qt-Creator. Konsola i GUI zależą od silnika.


title: Czy konwencja nad konfiguracją to „wiedza w świecie” czy „wiedza w twojej głowie”?

text: W przełomowym dziele Dona Normana „The Design of Everyday Things” autor ukuł frazy i wyjaśnia różnicę między „Wiedza w świecie” a „Wiedza w twojej głowie”; przykładem tego jest panel świetlny z wieloma przełącznikami, który może zawierać „Wiedzę w świecie”, będąc modelem/mapą pokoju, z przełącznikami w odpowiednim miejscu, lub „Wiedzę w twojej głowie” (w ten sposób są one prawie zawsze projektowane/realizowane), gdy trzeba zapamiętać, który przełącznik przełącza jakie światło. Możesz myśleć o „Wiedzy w świecie” jako o czymś, co możesz wywnioskować za pomocą obserwacji i logiki, a „Wiedzę w twojej głowie” jako o czymś, co należy zapamiętać. W świecie DI i „Auto-rejestracji”, która opiera się na wzorcu „Konwencja nad konfiguracją”, użycie tego procesu byłoby przypadkiem, w którym programista używa „Wiedzy w świecie” (funkcja jest oczekiwana, ponieważ framework zapewnia) czy jest to „Wiedza w Twojej głowie” (programista musi być świadomy i nauczyć się tej konwencji). Przyjmuję niewyraźny/pośrodku drogi pogląd, że Konwencja nad konfiguracją jest światem pośrednim pomiędzy tymi dwoma. Czy się mylę?


title: Zaznaczone węzły w stosach Fibonacciego

text: Nie rozumiem, dlaczego stosy Fibonacciego mają zaznaczone węzły (obrazek). Węzeł jest zaznaczany po usunięciu jego dziecka. Cytując z Wikipedii: „[Utrzymywanie niskiego stopnia każdego węzła] osiąga się dzięki regule, że możemy wyciąć co najwyżej jedno dziecko z każdego węzła innego niż root. Kiedy drugie dziecko jest wycinane, sam węzeł musi zostać odcięty od swojego rodzica i staje się korzeniem nowego drzewa." Dlaczego musimy to zrobić? Dlaczego po prostu nie pozostawić węzła tam, gdzie jest po wycięciu drugiego dziecka? Struktura sterty nie jest naruszona. Nie widzę sensu tej optymalizacji.


title: Dlaczego klasy opakowujące nie są przystosowane do użycia w frameworkach wywołań zwrotnych?

text: Właśnie przeczytałem pytanie, co to są frameworki wywołań zwrotnych?, gdzie pytający cytuje następujące z Efektywnej Javy: > Wad klas opakowujących jest niewiele. Jedynym zastrzeżeniem jest to, że wrapper > klasy nie nadają się do użycia w frameworkach wywołań zwrotnych, w których obiekty przekazują > autoreferencje do innych obiektów w celu kolejnych wywołań („callbacks”). Jestem więc ciekaw, dlaczego klasy opakowujące nie nadają się do użycia w frameworkach wywołań zwrotnych? Czy możesz podać przykład, na czym polega problem?


title: Czym właściwie jest „zespół wielofunkcyjny”?

text: W ogólnym znaczeniu „zespół wielofunkcyjny” to zespół, który łączy specjalistów z różnych dziedzin, potrzebnych do osiągnięcia celu. Wygląda jednak na to, że w Agile cross-funkcjonalność oznacza nie tylko łączenie różnych specjalistów, ale mieszanie ich. Henrik Kniberg definiuje zespół interdyscyplinarny w ten sposób: „Międzyfunkcjonalny oznacza po prostu, że zespół jako całość posiada wszystkie umiejętności potrzebne do zbudowania produktu i że każdy członek zespołu jest gotów robić więcej niż tylko swoje”. Ale gdzie jest narysowana linia? Czy to normalne, że prosi się programistów, aby zostali testerami dla iteracji, jeśli jest to wymagane?


title: Dyskretny JavaScript (dotyczy asp.net mvc3) nie jest jasny

text: Dyskretny JavaScript pozwala uniknąć wstrzykiwania wbudowanego JavaScript do HTML. Dzięki temu Twój HTML jest mniejszy i mniej zaśmiecony, a także ułatwia wymianę lub dostosowywanie bibliotek JavaScript http://www.asp.net/mvc/mvc3#BM_JavaScript_and_Ajax_Improvements co to naprawdę jest? powyższy artykuł) czy ktoś może wyjaśnić prostszymi słowami


title: Czy istnieją rzeczywiste aplikacje, w których użycie prefiksów w porównaniu z operatorami postfiksowymi ma znaczenie?

text: Na studiach uczy się, w jaki sposób można rozwiązywać zadania matematyczne, które używają operatorów ++ lub -- na jakiejś zmiennej, do której odwołuje się równanie, tak że wynik równania da różne wyniki, jeśli zmienisz operator z przyrostka na przedrostek lub na odwrót . **Czy są jakieś rzeczywiste zastosowania z użyciem postfiksa lub operatora prefiksu, w których ma znaczenie, którego używasz?** Nie wydaje mi się (może po prostu nie mam jeszcze wystarczającego doświadczenia w programowaniu), że istnieje naprawdę bardzo przydaje się posiadanie różnych operatorów, jeśli ma to zastosowanie tylko w równaniach matematycznych. EDYCJA: Sugestie do tej pory obejmują: 1. wywołania funkcji //f(++x) != f(x++) 2. porównanie pętli //while (++i < MAX) != while (i++ < MAX) 3. operacje na obiektach, w których ++ i -- zostały przeciążone


title: Czy użycie interfejsu Comparator łamie enkapsulację w Javie?

text: Według eseju „The Object Calisthenics” Jeffa Baya w książce ThoughtWorks Anthology, należy unikać używania Getters and Setters, ponieważ łamią one hermetyzację, a zamiast tego powinniśmy poprosić obiekt, aby zrobił coś dla nas, zamiast wkopać się w obiekt i zdobywanie swoich pól. co powiesz na porównanie obiektów? Muszę znaleźć najlepszy obiekt np. Resort dla klienta na podstawie zasady, która wykorzystuje kilka właściwości obiektu Resort. Ta zasada może się zmienić w przyszłości. Dlatego uważam, że korzystanie z interfejsu porównawczego jest lepsze w porównaniu z porównywalnym interfejsem. Ale potem będę musiał użyć getterów i seterów, aby uzyskać dostęp do poszczególnych właściwości w celu porównania z obiektami w innej klasie.


title: Jak duża jest odpowiednia dla klasy?

text: Od dawna jestem programistą (mam 49 lat), ale raczej nie mam doświadczenia w programowaniu obiektowym. Czytałem o OO od czasu Eiffla Bertranda Meyera, ale zrobiłem naprawdę niewiele programowania OO. Chodzi o to, że każda książka o projektowaniu OO zaczyna się od przykładu łodzi, samochodu lub innego wspólnego obiektu, którego bardzo często używamy, a następnie zaczynają dodawać atrybuty i metody oraz wyjaśniać, w jaki sposób modelują stan obiektu i co można z tym zrobić to. Zwykle więc brzmią coś w stylu „im lepszy model, tym lepiej reprezentuje obiekt w aplikacji i tym lepiej wszystko wychodzi”. Jak dotąd tak dobrze, ale z drugiej strony znalazłem kilku autorów, którzy podają przepisy, takie jak „klasa powinna zmieścić się tylko na jednej stronie” (dodawałbym „na jakim rozmiarze monitora?”, teraz, gdy staramy się nie Weźmy na przykład klasę `PurchaseOrder`, która ma skończoną maszynę stanów kontrolującą jej zachowanie i kolekcję `PurchaseOrderItem`, jednym z argumentów tutaj jest użycie prostej klasy `PurchaseOrder` , z niektórymi metodami (trochę więcej niż klasa danych) i mieć „klasę ekspercką” `PurchaseOrderFSM`, która obsługuje maszynę skończonych stanów dla `PurchaseOrder`. ” klasyfikacja posta Jeffa Atwooda Code Smells na temat Coding Horror. Nazwałbym to po prostu zdrowym rozsądkiem. Jeśli mogę wystawić, zatwierdzić lub anulować moje prawdziwe zamówienie, klasa `PurchaseOrder` powinna zawierać `issuePO`, `approvePO` i metody `cancelPO`. Czy to nie idzie w parze z „maksymalizacją spójności” i „minimalizacją sprzężenia” starą zasadą? iple, które rozumiem jako podwaliny OO? Poza tym, czy to nie pomaga w utrzymaniu klasy?


title: Udostępnianie kodu nowicjuszowi w naszej grupie?

text: Pracuję nad projektem grupowym dla szkoły, a to tylko ja i kolega z zespołu. Cóż, on naprawdę ma problemy z kodowaniem i zastanawiałem się, czy nadal powinienem dać mu dostęp (wyślij kopię e-mailem) do źródła, nad którym pracowałem wyłącznie. Do tej pory nie zrobił nic poza podstawowym TUI. Czy wskazane jest, aby delikatnie powiedzieć mu, aby najpierw „dogonił” poziom kodowania?


title: Wstrzykiwanie zależności i łatwość użycia

text: Piszę przydatną bibliotekę (nazwiemy ją Thinger), która wyłącza się i pobiera dokument XML, wykonuje na niej kwerendę X-Path i robi coś przydatnego w wyniku tego. (To, co właściwie robię, jest zbyt nudne, aby wam wszystkim przeszkadzać, to tylko uproszczony przykład.) Ponieważ jestem mądrym i leniwym programistą, korzystam z dwóch komponentów innych firm, jednego do zdalnego pobierania Dokumenty XML (nazwiemy go Fetcher) i jeden do uruchamiania zapytań X-Path (nazwiemy go Querier). Moja biblioteka udostępnia klasę Thinger, do której należy wstrzyknąć moduł pobierania i kwerier. Mogłem to zrobić za pomocą seterów lub konstruktora. Ale potem myślę o biednych ludziach korzystających z mojej biblioteki, którzy teraz muszą myśleć o wstrzykiwaniu moich zależności, kiedy tak naprawdę chcą tylko wywołać coś takiego jak new Fetcher()->fetch(someurl); Do tej pory napisałem statyczną fabrykę, która tworzy instancje nowego Thingera, Fetchera i Queriera, montuje je odpowiednio i zwraca Thingera. To sprawiło, że poczułem się nieco nieczysty. Z pewnością jest lepszy sposób? EDYCJA Większość platform itp. prawdopodobnie obejdzie to przy użyciu kontenera wstrzykiwania zależności lub podobnego, ale ponieważ piszę dość małą bibliotekę innej firmy, która wydaje się złym podejściem.


title: Jaka jest różnica między wzorcami wydawca-subskrybent a reaktorem?

text: Wzorce publikuj-subskrybuj i Reactor wyglądają bardzo podobnie do mnie. Czym się różnią? W obu wzorcach wiadomość jest przekazywana do subskrybentów pośrednio (słuchacze we wzorcu reaktora). Czuję, że wzorzec obserwatora jest bardzo podobny do dwóch innych wzorców. Jakie są kluczowe różnice między tymi wzorami?


title: Scratch - dlaczego szkoły uczą uczniów języka, który nie jest używany nigdzie indziej?

text: Dlaczego szkoły uczą Scratcha zamiast powszechnie używanych języków programowania (C, C++, Java, C#, Python itp.)?


title: Definiowanie statusu między ostatnim sprawdzeniem a teraz

text: Mam zestawy danych sondujących z wewnętrznego narzędzia do monitorowania, które reprezentują dostępność różnych usług (bazy danych, usługi internetowe itp.). Teraz moim zadaniem jest wizualizacja tych danych i doszedłem do punktu, w którym powinienem podjąć decyzję dotyczącą interpretacji danych dla najnowszego zbioru danych. **Szybka ogólna definicja** , każdy zestaw danych odzwierciedla stan w momencie weryfikacji, a interwały sondowania różnią się w zależności od usługi, więc nie ma stałego okna czasowego. Jeśli więc występuje przedział np. pięć minut pomiędzy zbiorem A i B, dla tych pięciu minut (zakładając, że z B następuje zmiana) zawsze zakładany jest status A. Jak dotąd nie ma problemu, teraz jednak moje pytanie brzmi, jaki powinien być czas między **teraz** a **najnowszymi** danymi. Widzę dwa rozwiązania * Wizualizuj tylko dane do ostatniego sprawdzenia i ignoruj upływający czas od tego czasu lub * Załóż, że status z ostatniego sprawdzenia jest nadal ważny do tej pory (jak między dwoma podanymi wpisami danych) Mogłem zobaczyć argumenty dla obu i mam nadzieję, że ktoś wskaże mi właściwy kierunek, które podejście byłoby najbardziej logiczne.


title: Czy muszę wszystko przetestować?

text: Zamierzam rozpocząć swój pierwszy prawdziwy projekt w Ruby on Rails i zmuszam się do pisania testów TDD. Nie widzę realnych korzyści w pisaniu testów, ale ponieważ wydaje się to bardzo ważne, spróbuję. Czy konieczne jest przetestowanie **_każdego_** części mojej aplikacji, w tym stron statycznych?


title: Jak zaprojektować harmonogram zadań (np. cron) z kolejką kalendarza?

text: Pracowałem nad dynamicznym harmonogramem zadań opartym na strukturze kolejki kalendarza i uderzyłem trochę w ścianę. Kolejka kalendarza pozwala mi dodawać i usuwać zdarzenia z kolejki, jednak wydaje mi się, że nie rozumiem poprawnie pseudokodu, ale wydaje się, że nie mogę znaleźć żadnego pseudokodu odwołującego się do pętli aplikacji i sposobu, w jaki aplikacja czeka na właściwy czas przed wykonaniem zadanie. Oto naiwne rozwiązanie tego, o czym mówię: Niech calQueue będzie CalendarQueue wypełnioną zdarzeniami. while(1){ czas = DateTime.now nextTask = calQueue.dequeue() if(time!= nextTask.time){ sleep(nextTask.time-time); executeTask(nextTask) } } Oczywiście wiąże się to z wieloma problemami: 1. wiele zdarzeń może wystąpić dokładnie w tym samym czasie 2. wykonanie metody executeTask może zająć dużo czasu, co oznacza, że zdarzenia mogą zostać pominięte. 3. Używam CalendarQueue wspieraną przez bazę danych, więc wykonanie metody usuwania z kolejki może zająć sporo czasu. 4. To również ignoruje zadania dodane do calQueue, które muszą zostać wykonane przed następnym zadaniem, tj. zadanie zostało dodane podczas snu, do natychmiastowego wykonania. Inne uwagi: 1. Chciałbym ostatecznie uczynić to harmonogramem rozproszonym (klastrowym). 2. Przyjrzałem się cronowi i fcronowi, ale szczerze mówiąc, oba są dość dużymi aplikacjami i nieco trudnymi do śledzenia. Zasadniczo to, czego szukam, to sposób zaprojektowania harmonogramu CalendarQueue.


title: Szablon głównej metody

text: Teraz, gdy dostałem się do rowka wstrzykiwania zależności, uważam, że główne metody dla różnych aplikacji wyglądają zasadniczo tak samo. Jest to podobne do rzeczy, które można znaleźć w dokumentacji Guice, ale umieszczę tutaj przykład: public class MojaAplikacja { public static void main(String... args) { Injector inj = Guice.createInjector(new SomeModule(), new DatabaseModule() new ThirdModule()); DatabaseService ds = inj.getInstance(DatabaseService.class); ds.start(); SomeService ss = inj.getInstance(JakaśUsługa.klasa); ss.start(); // itd. } } Dla wielu aplikacji mam główne metody, które wyglądają właśnie tak. Ale teraz powiedzmy, że chcę stworzyć zupełnie nową aplikację, która, powiedzmy, ponownie wykorzystuje mój `DatabaseModule`. Prawie muszę skopiować i wkleić metodę `main` i wprowadzić odpowiednie zmiany... Postrzegam kopiuj-wklej jako zapach kodu. Co więcej, powiedzmy, że zdaję sobie sprawę, że prawdopodobnie powinienem umieścić haki zamknięcia, teraz muszę przejść i zmienić każdą główną metodę we wszystkich moich aplikacjach, aby dołączyć haki zamknięcia do każdej usługi. Czy jest jakiś dobry sposób na zaplanowanie tego procesu i zminimalizowanie schematu?


title: W DVCS z gałęziami produkcyjnymi i deweloperskimi, czym jest gałąź master/default?

text: Jeśli postępujesz zgodnie ze standardową metodologią DVCS polegającą na posiadaniu gałęzi produkcyjnej i gałęzi programistycznej, naprawdę interesuje mnie, co robisz z gałęzią domyślną (mercurial) lub master (git)? * Czy go usuwasz (nie jest to zalecane przez kilka przewodników)? * Czy używasz go jako produkcji? * Czy używasz go jako rozwoju? * A może zostawiasz to puste i masz osobne gałęzie deweloperskie i produkcyjne? Uwaga: bardzo interesuje mnie konkretnie Mercurial, ale każdy inny DVCS lub tylko ogólne zasady byłyby w porządku


Haskell często udostępnia dwie wersje danej funkcji f, tj.: f :: Int ... genericF :: Integral i => i ... Istnieje wiele standardowych funkcji bibliotecznych z tymi dwiema wersjami: length, take, drop, itp. Cytując opis `genericLength`: > Funkcja genericLength jest przeciążoną wersją długości. W szczególności, zamiast zwracać Int, zwraca dowolny typ, który jest > instancją Num. Jest jednak mniej wydajny niż długość. Moje pytanie brzmi: skąd bierze się utrata wydajności? Czy kompilator nie może wykryć, że używamy `genericLength` jako Int, a zatem używamy `length` dla lepszej wydajności? Dlaczego „długość” nie jest domyślnie rodzajowa?


title: dużo małych przedmiotów - makaron OO

text: W kodzie, nad którym pracuję, jest wiele naprawdę małych obiektów, takich jak: class HasFieldLameSetter { public: HasFieldLameSetter(field& p_):m(_p){} void set(bool p2) { m.hasLame = p2; } pole& m; }; Posiadanie wielu małych klas tworzy trudny do odczytania i skomplikowany „makaron kodu”. Czasami czytanie tego jest naprawdę trudne, ponieważ spędzam dużo czasu skacząc z pliku do pliku, aby przekonać się, że klasa zrobiła coś trywialnego, jak w przykładzie ustawiając wartość bool na true. Ponadto obiekty te są wszędzie przekazywane przez „wstrzykiwanie zależności”, co jeszcze bardziej utrudnia ich odczytywanie. **Jak przekonać autora kodu do pisania nieco większych obiektów?** Moim zdaniem zbyt wiele małych obiektów to tylko zmora programistów. Czy czegoś mi brakuje, czy jest jakiś błąd w moim myśleniu? Chętnie przeczytam wszelkie artykuły, które mogą zmienić mój punkt widzenia.


title: Kiedy Rob Pike mówi „Go dotyczy kompozycji”, co dokładnie ma na myśli?

text: From Less to Exponentially More > Jeśli C++ i Java dotyczą hierarchii typów i taksonomii typów, Go dotyczy > kompozycji.


title: Zrozumienie portów otwartych i nasłuchujących

text: Napisałem aplikację w Javie (która działa doskonale; za pomocą tej aplikacji można skanować porty TCP/UDP -tylko do celów testowych-), ale w międzyczasie pisząc kod przeczytałem kilka dokumentacji (wiki) na temat gniazd. Myślałem, że otwarty port to podły protokół, w którym klient/serwer może nawiązać/powiązać połączenie, nawet jeśli po stronie serwera nie ma nic, co mogłoby obsłużyć dane/odpowiedzieć. Myślałem, że otwarty port to wredny (jeśli nie ma routerów/zapory ogniowej) protokół, który jest gotowy do użycia. Testowałem swoją aplikację na moim lokalnym serwerze, ale na początku myślałem, że moja aplikacja nie działa. Działało, ale nie było żadnego oprogramowania, które mogłoby odpowiedzieć na moje pytania. Po otwarciu serwera APACHE i napisaniu prostego serwera UDP (który może obsłużyć/odpowiedzieć na dowolne zapytanie na określonym porcie) aplikacja była w stanie znaleźć te porty. Myślałem, że port nasłuchiwania to port, który jest używany i jest otwarty. Co oznacza port nasłuchiwania? Jeśli wysyłam pakiety UDP do zdalnego hosta i nie ma zamkniętych portów (routera lub zapory), co się dzieje z pakietem? Czy dane są zapisywane w buforze? Lub po prostu ignoruje/odrzuca pakiet.


title: Czy lepiej jest utworzyć procedurę składowaną lub encje, aby uzyskać dostęp do potrzebnych danych?

text: Właśnie wskoczyłem do nowego projektu z nową firmą używającą Entity Framework i ASP.NET MVC 4. Nie jestem ekspertem od Entity Framework, ale myślę, że mam przyzwoite pojęcie, jak z niego korzystać. Z tego, co wiem, moje modele powinny odzwierciedlać tabelę w bazie danych z pominięciem kolumn, których nie potrzebuję. Ponadto możemy użyć procedur składowanych z Entity Framework lub IoC do mapowania modelu. Muszę połączyć relację z dwoma obiektami, których relacja jest dość zagnieżdżona. Mógłbym w tym celu utworzyć procedurę składowaną lub utworzyć kilka modeli (na podstawie tabel w bazie danych) i użyć konfiguracji IoC, aby mieć tabelę z bazy danych dla każdego modelu, a następnie wysłać zapytanie do modeli w warstwie repozytorium dla dane, których potrzebuję przy użyciu Linq to Entities. Wygląda na to, że miałbym dużo ".Include(x=>x.SomeModel)" Moje pytanie brzmi: która opcja jest lepsza do utrzymania i integracji w przyszłości projektu? Procedura składowana czy Linq to encje? Czy nie rozumiem poprawnie Entity Framework?


title: Jak podłączyć kilka urządzeń (mobilnych)

text: Chcę rozpocząć mały projekt, w którym chcę podłączyć kilka moich urządzeń. Niektóre to urządzenia mobilne z systemem Android, inne to urządzenia stacjonarne, takie jak komputer stacjonarny lub laptop. Ponadto chcę, aby projekt był jak najbardziej ogólny. Oznacza to, że chcę się nim podzielić, aby inni mogli z niego korzystać. Łącząc mam na myśli przesyłanie wiadomości między nimi. Mój problem polega na tym, że nie jestem pewien, jakiej technologii lub architektury użyć i mam nadzieję, że uzyskam od Ciebie poradę. (Myślę, że to pytanie dotyczy bardziej architektury oprogramowania niż goryl kontra rekin) Rozważałem już kilka podejść. Spojrzałem na Google Cloud Messaging, ale wydaje się, że nie pasuje do moich wymagań, gdzie kilku użytkowników może zarejestrować się, aby wysyłać niezależne wiadomości. Wygląda bardziej na wysyłanie od jednego mastera do kilku urządzeń. Następną rzeczą, o której pomyślałem, było coś, co zrobił mały VLC ze swoją zdalną aplikacją na Androida, w której aplikacja komputerowa obsługuje coś w rodzaju serwera, z którym musi się połączyć aplikacja mobilna. Wydaje się, że ogranicza się to do sieci LAN i pasuje tylko do około 80% moich przypadków użycia. Czy istnieje inne podejście, które nie wymaga czegoś takiego jak serwer, który jest świadomy wszystkich klientów, który musi oddzielać urządzenia użytkownika i kierować wiadomości?


title: Co powinienem zrozumieć, zanim spróbuję zrozumieć programowanie funkcjonalne?

text: Uczyłem się „Ja Haskell dla wielkiego dobra”, ponieważ uważałem, że wygląda interesująco. Oczywiście jestem całkowicie przekonany, że programowanie funkcjonalne położy kres głodowi na świecie, zaprowadzi pokój na świecie, wyśle wrony, by wydziobały oczy moim wrogom, przyprowadzą wiele młodych kobiet z dobrymi biodrami do porodu na moje skinienie i zawołanie, podwójnie moje zamówienie za darmo i po prostu ogólnie poprawiam moje życie pod każdym względem, kształtem i formą bez żadnych wad. Jestem dość dobrze zorientowany w paradygmatach imperatywnych. Nauczyłem się Javy i C++ zanim rzuciłem studia, po czym sam nauczyłem się Pythona. Mój problem polega na tym, że nawet samouczki dla początkujących dość szybko przerastają moją głowę i nie jestem pewien, czy jest coś konkretnego, czego nie rozumiem, czy po prostu nie mogę jeszcze ogarnąć całego paradygmatu. Doszedłem do sekcji 4.7 samouczka Haskella dla programistów języka C, zanim nie mogłem już tego zrozumieć. Czy brakuje mi czegoś fundamentalnego (jak te ostatnie dwa lata studiów)? A może powinienem po prostu iść powoli i mam nadzieję, że kliknie? Innymi słowy, jakie informacje pomogłyby mi najlepiej wypełnić lukę między paradygmatem imperatywnym a paradygmatem funkcjonalnym?


title: lepsze podejście do sprawdzania wydajności programistów?

text: Jestem programistą stron internetowych. Moje biuro ustala listę kryteriów, takich jak * Dyscyplina * Obecność * Harmonogram projektu * Praca zespołowa * Rozwiązywanie problemów * Dzielenie się pomysłami * Dedykacja do oceny wydajności pracowników. Każdemu kryterium przydzielana jest pewna ilość punktów, a przegląd opiera się na łącznej liczbie punktów uzyskanych w każdym z kryteriów. Mój problem polega na tym, że czuję, że te kryteria są dość niejasne i nie sądzę, aby faktycznie odzwierciedlały wydajność pracowników. Myślę, że w rozwoju oprogramowania istnieją inne sposoby mierzenia wydajności pracowników. Jakieś sugestie? Dziękuję


title: Kryteria akceptacji rejestru produktów

text: Czytałem na podobnym forum http://stackoverflow.com/questions/8117530/examples-for-acceptance-criteria-for-a-user-story o umieszczaniu kryteriów akceptacji dla pozycji backlogu produktu. Pracuję nad projektem opartym na Scrum i potrzebuję więcej informacji, ponieważ mój element zaległości jest następujący - UserProfiles (używam tego w polu tytułowym w tfs 2013), a opis zawiera wszystkie "Jako użytkownik chcę być w stanie tworzenie nowych użytkowników i przypisywanie uprawnień' Kryteria akceptacji mówią o tym, jak użytkownik wchodzi w interakcję z interfejsem użytkownika (co zostało omówione w jednej z odpowiedzi w powyższym linku - co jest bardzo logiczne) Na przykład * Gdy użytkownik klika przycisk home, system wyświetli 3 opcje * Następnie użytkownik będzie mógł wpisać swoją nazwę użytkownika Czy to jest właściwe podejście do wykorzystania tytułu dla PBI i umieszczenia rzeczywistej historyjki użytkownika w polu opisu w tfs Z góry dziękuję


title: Wzorzec modelu danych rozszerzalności

text: Zastanawiałem się, jak możesz zmapować poniższe kryteria do typowych wzorców projektowych. Używam PHP 5.3 i MySQL 5.5 i mam własny framework mvc dla mojej firmy, ale niektóre części mogą być lepsze, a oto wymagania: (Weź koncepcję katalogu, ponieważ jest to pierwsza aplikacja, która zostałaby zmieniona w naszej puli aplikacji) kontrolery (produkty, klienci i koszyk) zarządzają różnymi informacjami, a mianowicie własnym zestawem modeli. Na przykład koszyk utworzy obiekty koszyka w pamięci, przypisze do niego produkty, ilości itp. Następnie zapisze koszyk do bazy danych i wypróbuje logikę płatności i zapisze płatność powiązaną z koszykiem. Mój problem polega na tym, że przez większość czasu nasi klienci chcą dostosować różne obiekty, takie jak klient (dodaj więcej pól współrzędnych lub pól opisowych) lub produkt (dodaj niestandardowe właściwości do produktu). Jeśli mój kontroler zawsze odwołuje się do produktu klasy, ale chcę go rozszerzyć, aby utworzyć: MyCompany_Models_Product MyClient_Models_Product extends MyCompany_Models_Product Jak skonfiguruję mój system, aby obsługiwał rozszerzanie klas i zmieniał klasy używane przez moje różne moduły, kontrolery, widoki i inne modele. Jeśli zakoduję na stałe MyCompany_Models_Product jako nazwę klasy w kontrolerze i wszystkich innych obiektach, jak bym poszedł do tworzenia systemu nadrzędnego. Czy jest jakiś wzór, który mogę zastosować, aby wykorzystać ten problem?


title: Uruchom zarządzany bean z widoku JSF w folderze WEB-INF

text: Rozpoczynamy projekt Spring + Primefaces i pierwszy problem jaki napotkaliśmy dotyczy przechowywania stron XHTML w folderze WEB-INF. Kiedy używamy formularza twarzy w widoku znajdującym się w folderze WEB-INF, wtedy `commandButton` nie wykonuje metody managed bean. <h:form id="loginForm"> <p:commandButton action="#{LoginMgr.doLogin()}" value="Login"/> </h:form> Nasze ziarna: <bean id="LoginMgr" name ="LoginMgr" class="com.tesipro.channelmanager.business.implemented.CMLoginManager"> </bean> W rzeczywistości uważamy, że problem polega na tym, że w przypadku JSF strony są renderowane za pomocą linku do tej samej strony, co działanie formularz, więc jeśli strona znajduje się w WEB-INF nie jest publicznie dostępna. Wiemy, że posiadanie wszystkich naszych widoków XHTML w folderze sieciowym zamiast WEB-INF faktycznie rozwiązuje problem, ale chcielibyśmy przechowywać te strony w WEB-INF.


title: Czy obsługa wyjątków narusza „program do abstrakcji”?

text: Mówię na podstawie doświadczeń z Javą i C#. Nie wiem, czy inny język ma inną implementację obsługi wyjątków. Aby osiągnąć luźne sprzężenie, musimy zaprogramować nasz kod tak, aby używał abstrakcji, a nie implementacji. Jednak przypadek obsługi wyjątków jest odwrotny. Najlepszą praktyką jest konieczność obsługi określonego typu wyjątku (`SqlException`, `StackOverflowException` itp.). Ta rzecz może być lepsza (lub nie) w javie dzięki za `sprawdzony wyjątek`, istnieje rodzaj „umowy” między interfejsem a konsumentem. Ale w C# lub dla `Niesprawdzonego wyjątku` nie ma kontraktu określającego, jaki wyjątek może zostać zgłoszony przez interfejs. Załóżmy na przykład, że używamy „Wzorzec repozytorium”, aby oddzielić DAL od LOGIKI biznesowej. Zwykle używa się prostego wyjątku catch, takiego jak: public void Consume() { try{ productRepository.Get(k=>k.Id == "0001"); } catch(Exception e){ // handle } } W bardziej konkretnym przypadku zwykle używamy `SqlException`. Oznacza to jednak, że musimy wiedzieć, że `ProductRepository` jest repozytorium serwera bazy danych. Co by się stało, gdyby implementacja zmieniła się tak, aby zamiast tego korzystała z repozytorium plików? Teraz musisz złapać `FileNotFoundException` lub coś takiego. Dlaczego narusza zasadę „kodu do abstrakcji”? A co możemy zrobić, aby temu zapobiec?


title: Spróbuj złapać wyłapywanie błędów, dlaczego jest to tak istotne?

text: Próbuję zrozumieć, dlaczego powinienem „wypróbować” metodę wyłapywania błędów. Wygląda na to, że koncepcja brzmi: „pozwolenie na uruchomienie procesu zakładając, że nie jest on właściwie opracowany”. Czy powinienem zawsze zakładać, że program oparty na klasach i dziedziczeniu wiąże się z nieoczekiwanymi błędami, z którymi powinienem sobie poradzić za pomocą narzędzi typu try catch and throw? Czy wszystkie programy Java powinny być zawarte w frameworku try catch?


title: Jaka jest zaleta owijania wyjątków

text: W .NET bardzo często zdarza się, że wyjątek jest opakowany w kilka warstw „zewnętrznych wyjątków”, które dają nieco więcej danych kontekstowych. Na przykład, w EF, jeśli twoja aktualizacja się nie powiedzie, otrzymasz wyjątki zapakowane w podobny sposób: * `EntityException` * `DbUpdateException` * `SqlException` Dane, które muszę zrozumieć, co się nie powiodło, są prawie zawsze w `SqlException`, więc jaki jest korzyść dla pozostałych dwóch? Co jeśli używam EF w bibliotece niestandardowej, czy powinienem owinąć ten wyjątek jednym z moich własnych? Podobnie jak `MyCustomLibraryException: Nie można zaktualizować danych. Zobacz wyjątek wewnętrzny, aby poznać szczegóły.`


title: Czy wyjątki jako przepływ kontroli są uważane za poważny antywzorzec? Jeśli tak, dlaczego?

text: W późnych latach 90-tych pracowałem trochę z bazą kodu, która używała wyjątków jako kontroli przepływu. Wdrożył maszynę skończonych stanów do obsługi aplikacji telefonicznych. Ostatnio przypominają mi się tamte czasy, ponieważ robiłem aplikacje webowe MVC. Obaj mają kontrolery, które decydują, gdzie iść dalej i dostarczają dane do logiki docelowej. Akcje użytkownika z domeny starego telefonu, jak tony DTMF, stały się parametrami metod akcji, ale zamiast zwracać coś w rodzaju `ViewResult`, wyrzucały `StateTransitionException`. Myślę, że główna różnica polegała na tym, że metody akcji były funkcjami 'pustymi'. Nie pamiętam wszystkich rzeczy, które zrobiłem z tym faktem, ale wahałem się, czy chociażby iść dalej drogą pamięci, ponieważ od tej pracy, na przykład 15 lat temu, _Nigdy nie widziałem tego w kodzie produkcyjnym w żadnej innej pracy_. Przypuszczałem, że to znak, że to tak zwany antywzór. Czy tak jest i dlaczego? Aktualizacja: kiedy zadałem pytanie, miałem już na myśli odpowiedź @MasonWheelera, więc wybrałem odpowiedź, która najbardziej wzbogaciła moją wiedzę. Myślę, że jest to również rozsądna odpowiedź.


title: Spróbuj/Złap lub testuj parametry

text: > **Possible Duplicate:** > Argumenty za lub przeciw używaniu Try/Catch jako operatorów logicznych > Efektywne użycie bloku try/catch? Niedawno byłem na rozmowie kwalifikacyjnej i dostałem zadanie napisania w C# prostej metody obliczania terminu spotkania pociągów. Kod był prostym równaniem matematycznym. To, co zrobiłem, to sprawdzenie wszystkich parametrów na początku metody, aby upewnić się, że kod nie zawiedzie. Moje pytanie brzmi: czy lepiej sprawdzić parametry, czy użyć try/catch? Oto moje przemyślenia: * Try/catch jest krótszy * Try/catch będzie działać zawsze, nawet jeśli zapomnisz o jakimś warunku * Catch jest wolny w .NET * Parametry testowania to prawdopodobnie czystszy kod (wyjątki powinny być wyjątkowe) * Parametry testowania dają ci większa kontrola nad zwracanymi wartościami Wolałbym testować parametry w metodach dłuższych niż +/- 10 linii, ale co myślisz o używaniu try/catch w prostych metodach takich jak ta – np. `return (a*b)/(c+d );` Istnieje wiele podobnych pytań dotyczących stackexchnage, ale mnie interesuje ten konkretny scenariusz.


title: Efektywne wykorzystanie bloków try/catch?

text: Czy bloki catch powinny być używane do pisania logiki, tj. obsługi kontroli przepływu itp.? A może tylko do rzucania wyjątków? Czy wpływa na wydajność lub łatwość utrzymania kodu? Jakie są skutki uboczne (jeśli są) pisania logiki w bloku catch? **EDYTUJ:** Widziałem klasę Java SDK, w której napisali logikę wewnątrz bloku catch. Na przykład (fragment zaczerpnięty z klasy `java.lang.Integer`): try { result = Integer.valueOf(nm.substring(index), radix); wynik = ujemny ? nowy Integer(-result.intValue()) : wynik; } catch (NumberFormatException e) { Stała string = ujemna ? nowy String("-" + nm.substring(indeks)) : nm.substring(indeks); wynik = Integer.valueOf(stała, podstawa); } **EDIT2** : Przeszedłem przez tutorial, w którym liczą to jako zaletę pisania logiki wyjątkowych przypadków wewnątrz wyjątków: > Wyjątki umożliwiają napisanie głównego przepływu kodu i radzenie sobie z > wyjątkowymi przypadkami gdzie indziej. **Jakieś konkretne wytyczne, kiedy pisać logikę w bloku catch, a kiedy nie?**


title: Co spróbować/złapać?

text: **Uwaga na pytanie: to nie jest duplikat, Efektywne użycie bloku try/catch? został zapytany po tym. Drugie pytanie to duplikat.** Zastanawiałem się, jaki był najlepszy sposób na użycie try/catch. Czy lepiej ograniczyć zawartość bloku try do minimum, czy umieścić w nim wszystko? Pozwólcie, że wyjaśnię się na przykładzie: Kod 1: try { thisThrowsAnException(); } catch (Wyjątek e) { e.printStackTrace(); } toNie(); Kod 2: spróbuj { thisThrowsAnException(); toNie(); } catch (Wyjątek e) { e.printStackTrace(); } Zakładając, że `thisThrowsAnException()`... cóż... może rzucić wyjątek i `thisDoesnt()`... Jestem pewien, że to rozumiesz. Znam różnicę między tymi dwoma przykładami: w przypadku przechwycenia wyjątku, w pierwszym przypadku zostanie wywołane `thisDoesnt()`, a nie w drugim. Skoro nie ma to dla mnie znaczenia, bo wyrzucenie tego wyjątku oznaczałoby zatrzymanie aplikacji, to dlaczego jedna wersja miałaby być lepsza od drugiej?


title: Czy można zgłosić wyjątek w normalnej ścieżce kodu, który eliminuje możliwy błąd programisty?

text: Wiem, że wyjątek powinien zostać wyrzucony w wyjątkowych przypadkach (np. brak pamięci, błąd programisty). W takich przypadkach nie muszę się martwić o wydajność zgłaszania tych wyjątków. Ale co się stanie, jeśli użyjesz wyjątku w normalnej ścieżce kodu? W moim przypadku użyj go do zatrzymania funkcji dostarczonej z kodem użytkownika. Więc dla danego kodu, czy `foo` jest lepsze czy `foo2` lepsze? Jest bardzo prawdopodobne, że `outputFunc` zwróci fałsz/zgłosi wyjątek. // funkcja udostępniona przez bibliotekę void foo(std::function<void(std::function<bool(int)>)>); // jak użytkownik ma z tego korzystać foo([](std::function<bool(int)> outputFunc){ while (/*warunek*/) { // użytkownik musi sprawdzić zwracaną wartość i przerwać pracę po jej zwróceniu false if (!outputFunc(/*jakaś wartość*/)) return; } }); // funkcja udostępniona przez bibliotekę void foo2(std::function<void(std::function<void(int)>)>); // jak użytkownik ma go używać foo2([](std::function<void(int)> outputFunc){ while (/*warunek*/) { // to zrzuci wyjątek i zostanie obsłużony wewnętrznie, kiedy powinien się zatrzymać // użytkownik nie musi sprawdzać zwracanej wartości, ale musi napisać bezpieczny dla wyjątków kod outputFunc(/*jakaś wartość*/)); } }); * * * W moim przypadku użycie wyjątku eliminuje ewentualny błąd programisty (poprzez niesprawdzanie zwracanej wartości `outputFunc`) i ułatwia pisanie kodu (nie ma potrzeby sprawdzania zwracanej wartości). żaden kod użytkownika nie jest wymagany do radzenia sobie z nimi (poza tym, że muszą napisać kod bezpieczny dla wyjątków w lambdzie, ale zawsze powinniśmy pisać kod bezpieczny dla wyjątków)


title: Czy ponowne zgłoszenie wyjątku powoduje wyciek abstrakcji?

text: Mam metodę interfejsu, która stwierdza w dokumentacji, że zgłosi określony typ wyjątku. Implementacja tej metody używa czegoś, co zgłasza wyjątek. Przechwycony zostanie wyjątek wewnętrzny i zostanie zgłoszony wyjątek zadeklarowany przez kontrakt interfejsu. Oto mały przykład kodu, aby lepiej wyjaśnić. Jest napisany w PHP, ale jest dość prosty do naśladowania. // w interfejsie /** * @return Ta metoda zwraca klucz doohickey, który ma być użyty, gdy musisz chybić * @throws DoohickeyDisasterException */ public function getThatDoohickey(); // w implementacji public function getThatDoohickey() { try { $SomethingInTheClass->doSomethingThatThrowsAnException(); } catch (Exception $Exc) { throw new DoohickeyDisasterException('Komunikat o awarii doohickey'); } // inny kod może zwrócić doohickey } Używam tej metody, aby zapobiec wyciekowi abstrakcji. Moje pytania to: czy przekazywanie zgłoszonego wyjątku wewnętrznego jako poprzedniego wyjątku spowoduje wyciek abstrakcji? Jeśli nie, czy byłoby odpowiednie ponowne użycie komunikatu z poprzedniego wyjątku? Gdyby przeciekała abstrakcja, czy mógłbyś podać jakieś wskazówki, dlaczego uważasz, że tak jest? Aby wyjaśnić, moje pytanie wiązałoby się z przejściem do następującego wiersza kodu, wyrzuć nowe DoohickeyDisasterException($Exc->getMessage(), null, $Exc);


title: Argumenty za lub przeciw używaniu Try/Catch jako operatorów logicznych

text: Właśnie odkryłem piękny kod w naszej aplikacji firmowej, który używa bloków Try-Catch jako operatorów logicznych. Oznacza to "zrób jakiś kod, jeśli to spowoduje ten błąd, zrób ten kod, ale jeśli to spowoduje ten błąd, zamiast tego zrób trzecią rzecz". Używa "Wreszcie" jako wyrażenia "inny", które się pojawia. Wiem, że jest to z natury złe, ale zanim wybiorę się do walki, liczyłem na kilka dobrze przemyślanych argumentów. I hej, jeśli masz argumenty przemawiające za użyciem Try-Catch w ten sposób, proszę powiedz. Dla każdego, kto się zastanawia, język to C#, a kod, o którym mowa, ma około 30+ linii i szuka określonych wyjątków, nie obsługuje WSZYSTKICH wyjątków.


title: Częściowe odzyskiwanie z wyjątku

text: Widziałem bloki _Obsługa wyjątków_, które `zrzucały` ostatnio złapany `Wyjątek` w bloku `catch`. Coś w stylu: } catch ( Exception $e ) { // Wykonaj tutaj odzyskiwanie callSomeFunction(); rzut $e; } Dla mnie `wyrzucanie` dokładnie tego samego `wyjątku` w ten sposób nie ma większego sensu, ale nie jestem pewien, czy mam rację, czy nie. Może zdarzają się sytuacje, że to jedyna opcja? Moje pytanie brzmi: jakie są plusy i minusy tego podejścia i czy nie powinno się go całkowicie unikać w jak największym stopniu?


title: Punkt wyjścia do tworzenia aplikacji na iPhone'a

text: Mam jeden pomysł, że chcę zrobić aplikację na iPhone'a, niedawno kupiłem mac w tym samym celu. Chcę stworzyć małą aplikację i budować na niej w późniejszych wersjach. Pracuję w małej firmie i mam roczne doświadczenie w pracy na platformie iOS. Jestem programistą i nie mam żadnego doświadczenia w projektowaniu, więc chcę wiedzieć - czy powinienem skorzystać z pomocy jakiegoś projektanta? Lub nauczyć się samodzielnie i zacząć programować dla aplikacji? Chciałbym wiedzieć przed rozpoczęciem, jakie rzeczy powinienem wziąć pod uwagę lub nadać im większą wagę. Ogólnie rzecz biorąc, jak powinienem podejść do tworzenia aplikacji, najpierw zaprojektować, a później kodować lub odwrócić.


title: jak ocenić własny projekt

text: Pracuję nad projektem open source w czystym `C`, który zacząłem jakiś czas temu, ale dopiero niedawno znalazłem czas na dodanie kilku funkcji. Wyraźnie widzę pewne słabości mojego starego projektu, więc staram się zrefaktoryzować mój stary kod. Nie mam jednak pojęcia, jak właściwie ocenić mój nowy kod. Czy znasz jakieś techniki lub narzędzia do oceny kodu? Jestem całkiem niezły w projektowaniu obiektowym, ale przez około trzy lata nie miałem styczności z projektowaniem czysto strukturalnym. Dlatego nie mam wystarczającego doświadczenia, aby móc rozróżniać dobre i złe wybory projektowe.


title: Czy warto, aby developer był scrum masterem? Czy to oficjalne oznaczenie, czy?

text: Czy dla dewelopera korzystne jest zostanie „scrum masterem”? Czy to oficjalny certyfikat, czy tylko ktoś, kto się specjalizuje? Jakie są kroki w kierunku stania się jednym?


title: Czy długie metody zawsze są złe?

text: Więc rozglądając się wcześniej zauważyłem kilka komentarzy, że długie metody to zła praktyka. Nie jestem pewien, czy zawsze zgadzam się, że długie metody są złe (i chciałbym uzyskać opinie od innych). Na przykład mam kilka widoków Django, które trochę przetwarzają obiekty przed wysłaniem ich do widoku, a długa metoda to 350 linii kodu. Mam swój kod napisany tak, aby zajmował się parametrami - sortowanie / filtrowanie zestawu zapytań, a następnie bit po bicie wykonuje pewne przetwarzanie na obiektach zwróconych przez moje zapytanie. Tak więc przetwarzanie jest głównie agregacją warunkową, która ma wystarczająco złożone reguły, których nie można łatwo wykonać w bazie danych, więc mam pewne zmienne zadeklarowane poza pętlą główną, a następnie zostają zmienione podczas pętli. zmienna_1 = 0 zmienna_2 = 0 dla obiektu w queryset : jeśli obiekt.warunek_warunek_a i zmienna_2 > 0 : zmienna 1+= 1 ..... ... . więcej warunków do zmiany zmiennych zwraca zapytanie i kontekst Tak więc zgodnie z teorią powinienem rozłożyć cały kod na mniejsze metody, aby metoda widoku miała maksymalnie jedną stronę. Jednak pracując w przeszłości nad różnymi bazami kodu, czasami stwierdzam, że sprawia to, że kod jest mniej czytelny, gdy musisz ciągle przeskakiwać z jednej metody do drugiej, rozgryzając wszystkie jej części, jednocześnie zachowując w głowie najbardziej zewnętrzną metodę. Uważam, że mając długą metodę, która jest dobrze sformatowana, łatwiej można zobaczyć logikę, ponieważ nie jest ona ukryta w wewnętrznych metodach. Mógłbym rozłożyć kod na mniejsze metody, ale często istnieje wewnętrzna pętla używana do dwóch lub trzech rzeczy, więc skutkowałoby to bardziej złożonym kodem lub metodami, które nie robią jednej rzeczy, ale dwie lub trzy (alternatywnie Mógłbym powtórzyć wewnętrzne pętle dla każdego zadania, ale wtedy będzie hit wydajności). Czy jest więc przypadek, że długie metody nie zawsze są złe? Czy zawsze jest sprawa na pisanie metod, kiedy będą one używane tylko w jednym miejscu? AKTUALIZACJA: Wygląda na to, że zadałem to pytanie ponad rok temu. Więc przerobiłem kod po (mieszanej) odpowiedzi tutaj, podzieliłem go na metody. Jest to aplikacja Django pobierająca złożone zestawy powiązanych obiektów z bazy danych, więc argument testowy jest niedostępny (prawdopodobnie zajęłoby większość roku, aby utworzyć odpowiednie obiekty dla przypadków testowych. Mam typ „to trzeba zrobić wczoraj” środowiska pracy, zanim ktokolwiek złoży skargę). Naprawianie błędów w tej części kodu jest teraz nieco łatwiejsze, ale nie masowo. przed : #komentarz 1 bit kodu (nieskomplikowanego) 1a bit kodu 2a #komentarz 2 bit kodu 2a bit kodu 2b bit kodu 2c #komentarz 3 bit kodu 3 teraz: method_call_1 method_call_2 method_call_3 def method_1 bit (nieskomplikowane) kod 1a bit kodu 2a def metoda_2 bit kodu 2a bit kodu 2b bit kodu 2c def metoda_3 bit kodu 3


title: nazewnictwo zbiorów - liczba pojedyncza lub mnoga

text: Jest to związane z tym pytaniem, ale nie do końca to samo. BTW, nie jestem native speakerem języka angielskiego. Ciągle mam problemy z wybraniem właściwej nazwy dla kolekcji - Powiedzmy, że mamy kolekcję _elementów_ i że każdy _element_ ma _nazwę_. Jak nazwiemy kolekcję nazw tak, aby nazwa kolekcji była jak najbardziej zrozumiała przy standardowych konwencjach nazewnictwa? var NazwyPozycji = PobierzNazwyPozycji(); // Może być interpretowany jako pojedynczy element o wielu nazwach var itemsNames = GetItemsNames(); // Brak dwuznaczności, ale nie wygląda jak poprawny angielski var itemsName = GetItemsName(); // Również brzmi dziwnie i wydaje się nie pasować do np. a loop: foreach( itemName in itemsName){...} Jako rodowici anglojęzyczni, jak nazwalibyście swoje kolekcje i jak oczekiwalibyście, że będą się nazywać?


title: Rotacja par w zespole dla efektywnego programowania par

text: Śledzimy programowanie w parach w naszej firmie i zawsze stajemy przed problemem zrównoważonej i efektywnej rotacji par wśród programistów opowiadających historie. Postępujemy zgodnie z prostą metryką, w której nazwa każdego programisty jest zmapowana z każdym innym programistą i zaznaczamy odpowiednie przecięcie, gdy dwóch programistów łączy się w pary. To nie działa dobrze, nie możemy śledzić, ile czasu para spędziła na parowaniu, a ludzie wiele razy zapominają o aktualizowaniu wskaźników. Śledzenie rotacji par jest pomocne, ponieważ chcemy, aby wiedza o projekcie była udostępniana w całym zespole, a nie tylko w jednej parze. Więc zwykle dzieje się tak, że ktokolwiek paruje, kontynuuje parowanie, dopóki cała historia nie zostanie ukończona (biorąc pod uwagę lepszy kontekst), i nikt inny nie wie o tym, co się dzieje i jeśli historia lub błąd regresji/produkcji powróci, to samo para musi to podnieść (pozostawiając to, co aktualnie robi), co tworzy wąskie gardło. Czy są jakieś znane wskaźniki, które można wykorzystać do śledzenia rotacji par.


title: Czy programowanie w C# jest skutecznie nierozerwalnie związane z IDE, którego używasz?

text: Jestem programistą Pythona uczącym się C#, który próbuje przestać się martwić i po prostu kocha C# tym, czym jest, zamiast ciągle porównywać go z powrotem do Pythona. Jestem złapany w jednym punkcie: brak jednoznaczności w tym, gdzie są zdefiniowane rzeczy, jak szczegółowo opisano w tym pytaniu Stack Overflow. W skrócie: w C#, `using foo` nie mówi, jakie nazwy z `foo` są udostępniane, co jest analogiczne do `from foo import *` w Pythonie — forma, która jest odradzana w kulturze kodowania Pythona dla bycie ukrytym, a nie bardziej jednoznacznym podejściem „from foo import bar”. Uderzyły mnie raczej odpowiedzi Stack Overflow od programistów C#, które polegały na tym, że w praktyce ten brak jednoznaczności tak naprawdę nie ma znaczenia, ponieważ w twoim IDE (prawdopodobnie Visual Studio) możesz po prostu najechać kursorem na nazwę i otrzymać komunikat system, z którego pochodzi nazwa. Np.: > Teraz, teoretycznie zdaję sobie sprawę, że oznacza to, że gdy patrzysz z edytorem tekstu, > nie możesz powiedzieć, skąd pochodzą typy w C#... ale w praktyce nie > uważam, że to jest problem. Jak często faktycznie patrzysz na kod i > nie możesz korzystać z programu Visual Studio? To dla mnie objawienie. Wielu programistów Pythona preferuje podejście edytora tekstu do kodowania, używając czegoś takiego jak Sublime Text 2 lub vim, gdzie wszystko sprowadza się do kodu, plus narzędzia wiersza poleceń oraz bezpośredni dostęp i manipulacja folderami i plikami. Pomysł polegania na IDE w celu zrozumienia kodu na tak podstawowym poziomie wydaje się przekleństwem. Wygląda na to, że kultura C# jest pod tym względem radykalnie inna. I zastanawiam się, czy po prostu muszę to zaakceptować i przyjąć jako część mojej nauki C#. Co prowadzi mnie do mojego pytania tutaj: czy rozwój C# jest skutecznie nierozerwalnie związany z IDE, którego używasz?


title: Zasada pojedynczej odpowiedzialności — jak uniknąć fragmentacji kodu?

text: Pracuję w zespole, w którym lider zespołu jest zajadłym zwolennikiem zasad rozwoju SOLID. Brakuje mu jednak dużego doświadczenia w wyciąganiu skomplikowanego oprogramowania poza drzwi. Mamy sytuację, w której zastosował on SRP do dość złożonej bazy kodu, która teraz stała się bardzo rozdrobniona i trudna do zrozumienia i debugowania. Mamy teraz problem nie tylko z fragmentacją kodu, ale także z enkapsulacją, ponieważ metody w klasie, które mogły być prywatne lub chronione, zostały uznane za „powód do zmiany” i zostały wyodrębnione do publicznych lub wewnętrznych klas i interfejsów, które nie jest zgodne z celami enkapsulacji aplikacji. Mamy kilka konstruktorów klas, które przejmują 20 parametrów interfejsu, więc nasza rejestracja i rozdzielczość IoC stają się potworem samym w sobie. Chcę wiedzieć, czy istnieje podejście „refaktoryzacji z dala od SRP”, które moglibyśmy wykorzystać, aby pomóc rozwiązać niektóre z tych problemów. Przeczytałem, że nie narusza SOLID, jeśli stworzę kilka pustych, gruboziarnistych klas, które „zawijają” wiele ściśle powiązanych klas, aby zapewnić pojedynczy punkt dostępu do sumy ich funkcjonalności (tj. naśladując mniej nadmierna implementacja klasy SRP). Poza tym nie mogę wymyślić rozwiązania, które pozwoliłoby nam pragmatycznie kontynuować nasze wysiłki rozwojowe, jednocześnie uszczęśliwiając wszystkich. Jakieś sugestie ?


title: Jak ustalić, czy klasa spełnia zasadę pojedynczej odpowiedzialności?

text: Zasada pojedynczej odpowiedzialności opiera się na zasadzie wysokiej spójności. Różnica między nimi polega na tym, że wysoce spójne klasy mają zestaw obowiązków, które są ze sobą ściśle powiązane, podczas gdy klasy przestrzegające SRP mają tylko jedną odpowiedzialność. Ale jak ustalić, czy dana klasa ma określony zestaw obowiązków i przez to jest po prostu bardzo spójna, czy też ma tylko jedną odpowiedzialność i tym samym przestrzega SRP? Mianowicie, czy nie jest to mniej lub bardziej subiektywne, skoro niektórzy mogą uznać klasę za bardzo szczegółową (i jako taką uznają ją za zgodną z SRP), podczas gdy inni mogą uznać ją za niewystarczająco szczegółową?


title: Wiele klas z tylko jedną statyczną metodą o tej samej nazwie co klasa - Zapach kodu?

text: Staram się przestrzegać zasady pojedynczej odpowiedzialności (SRP) w moich aplikacjach. Mam wiele klas CRUD, które właśnie nazywam xxxxxManager. Zgodnie z SRP utworzyłem 4 klasy dla każdej z nich: xxxxxCreator, xxxxxGetter, xxxxxDeleter, xxxxxUpdater W efekcie mają tylko jedną statyczną metodę: xxxxxCreator::create(Model $model), xxxxUpdater::update(Model $model) itp. To dla mnie zapach kodu. Czy za bardzo naciskam na SRP?


title: Równolegle.Dla niespójności wyników

text: Używam VB.net do pisania kodu opartego na równoległym. Używam _Parallel.For_ do generowania par 500 obiektów lub w kombinacji C(500,2), takich jak poniższy kod; ale stwierdziłem, że nie zawsze generował wszystkie kombinacje, które powinny być 124750 (pokazane ze zmiennej Licznik). Żaden inny wątek nie działał podczas uruchamiania tego kodu. Używam komputera stacjonarnego Win-7 32 Bit z procesorem Intel Core i5 650@3,2 GHz, 3,33 GHz i pamięcią RAM 2 GB. Co jest nie tak z kodem i jak rozwiązać ten problem? Dziękuję. Dim Counter As Integer = 0 Równolegle.For (0, 499, Sub(i) For j As Integer = i + 1 To 499 Licznik += 1 Konsola.Write(i & ":" & j) Next End Sub) Console. Writeline("Numer iteracji: " i licznik)


title: Wycena projektu z zamkniętym źródłem

text: Siedzę z projektem, który muszę zacytować, i dopóki praca nie zostanie przyznana, mogę jedynie sprawdzić i zadać kilka pytań na temat systemu za pomocą „Wyświetl źródło”. To sprawia, że cytowanie jest dla mnie całkowicie niemożliwe. Moje pytanie brzmi: jak zabrać się za wycenę takiego projektu? Jakie pytania powinienem zadać? Czy odmawiam wyceny? Czy ze względu na niepewność mam uzupełnić wycenę?


title: Czy powinienem podać siebie jako autora po zmodyfikowaniu kodu innej firmy?

text: Powszechną praktyką jest dokonywanie pewnych poprawek lub poprawek w kodzie firm trzecich (czy to prosty sens, czy cała biblioteka). Ale często zdarza się, że wiele z tych kodów ma swoje własne zasady licencjonowania i ostatecznie nagłówek każdego pliku z informacjami o prawach autorskich. Po dokonaniu tych modyfikacji, co należy zrobić dalej? Utrzymać informacje o licencji nietykalne lub spróbować zaktualizować je, włączając siebie za pomocą tagów „@author” lub „@revision”? Innym częstym problemem jest zmiana przestrzeni nazw/pakietu innej firmy, aby dopasować ją do konwencji projektu. Niektóre typy licencji zawierają tego rodzaju informacje w swoich blokach licencyjnych, czy mogę je dowolnie zmieniać? Wiem, że odpowiedź na te pytania zależy od rodzaju licencji, więc aby moje pytanie było bardziej szczegółowe... Biorąc pod uwagę ogólne zasady licencjonowania (zazwyczaj różnią się one w drobnych aspektach, prawda?), czy jest etyczne (a przynajmniej dozwolone), że ja swobodnie **dodaj informacje** do bloku licencji o moich modyfikacjach i być może także **zmodyfikuj sposób, w jaki mam się do tego odnosić** w moim kodzie (np. użyj `YACorp.YALib` jako `Utils.YALib`)? Właściwie moje obawy dotyczą bardziej „szacunku dla społeczności” niż aspektów prawnych, pytam bardziej o to, jak bardzo możemy „zaszaleć”, pozostając etycznym, jeśli nasz projekt można uznać za prywatny lub osobisty.


title: Przenoszenie danych między bazami danych za pomocą XML

text: Właśnie przeczytałem ten cytat online: > XML to bardzo przydatna technologia do przenoszenia danych między różnymi bazami danych > lub między bazami danych i innymi programami. Sama jednak nie jest > bazą danych. Jest to cytat z książki „Skuteczny XML: 50 konkretnych sposobów ulepszania kodu XML”. Nie rozumiem, co mógłbyś zawracać sobie głowę przenoszeniem danych między bazami danych w formacie XML. Bazy danych zwykle zawierają dużo danych, więc czy nie byłoby gadatliwe przekształcenie ich w format XML? Czy nie ma sposobu, aby po prostu serializować dane bazy danych w coś mniej szczegółowego, zamiast zawracać sobie głowę konwersjami?