title: Czy java.util.prefs.Preferences jest odpowiedni do uzyskiwania dostępu do zmian stanu, do których należy uzyskać natychmiastowy dostęp w czasie wykonywania?

text: W mojej aplikacji obecnie tworzę pojedynczą instancję obiektu `UserPrefs` podczas uruchamiania, a następnie przekazuję referencję do tego obiektu do wielu innych obiektów za pośrednictwem ich konstruktorów. Robię to, ponieważ ważne jest, aby wiele klas miało natychmiastowy dostęp do wszelkich zmian w czasie rzeczywistym, które użytkownik wprowadza do swoich preferencji w czasie wykonywania. Problem w tym, że przekazywanie tego obiektu wielu różnym konstruktorom wydaje mi się kłopotliwe i chciałbym od tego odejść. Dlatego jestem zainteresowany wykorzystaniem API `java.util.prefs.Preferences` w każdej klasie, która potrzebuje dostępu do tych informacji. Ale odnoszę wrażenie, że API `Preferencje` jest częściej używane do po prostu zapisywania migawki preferencji użytkownika podczas zamykania aplikacji, a następnie do ładowania ich z powrotem podczas uruchamiania. Więc moje pytanie brzmi: czy `java.util.prefs.Preferences` byłoby odpowiednie w tej sytuacji? Jeśli nie, czy jest jakiś inny sposób, w jaki mogę udostępniać stan preferencji w czasie rzeczywistym na wielu zajęciach?


title: Trwałe przetwarzanie przeanalizowanych danych w języku naturalnym

text: Niedawno zacząłem eksperymentować z przetwarzaniem języka naturalnego (NLP) przy użyciu CoreNLP Stanforda i zastanawiam się, jakie są niektóre ze standardowych sposobów przechowywania przeanalizowanych danych NLP dla czegoś takiego jak aplikacja do eksploracji tekstu? Jednym ze sposobów, który pomyślałem, że może być interesujący, jest przechowywanie dzieci jako listy sąsiedztwa i dobre wykorzystanie zapytań rekurencyjnych (Postgres obsługuje to i stwierdziłem, że działa naprawdę dobrze). Ale zakładam, że prawdopodobnie istnieje wiele standardowych sposobów, aby to zrobić, w zależności od rodzaju wykonywanej analizy, które zostały przyjęte przez ludzi pracujących w tej dziedzinie na przestrzeni lat. Jakie są więc standardowe strategie utrwalania danych analizowanych przez NLP i jak są używane?


title: Używanie mod_rewrite dla wirtualnego systemu plików w porównaniu z rzeczywistym systemem plików

text: Zacząłem pracę w dziale, który używa CMS, w którym cały "system plików" wygląda tak: 1. utwórz nazwany plik lub folder - plik ten otrzymuje unikalny węzeł (np. 2345) oraz domyślną "nazwę pliku" (np. `/WelcomeToOurProductsPage`) i zastosuj szablon 2. przypisz jeden lub więcej _aliasów_ do pliku dla przekierowania adresu URL (np. `/home-page-products` \- można również uzyskać poprzez `/home-page- products.aspx`) 3. Nowe polecenie Rewrite jest zapisywane w pliku .htaccess dla _każdego aliasu_ 4. Serwer uzyskuje dostęp do `/WelcomeToOurProductsPage` lub `/home-page-products` i przekierowuje do czegoś takiego jak `/template. aspx?tmp=2&node=2345` (tu zgaduję, co robi - na razie mam dostęp tylko do frontonu - ale mam wystarczająco dużo wskazówek, aby zdecydowanie założyć) 5. Węzeł 2345 pobiera zawartość przechowywaną w bazie danych SQL i aplikuje go do szablonu. Uwaga: W systemie plików nie są tworzone żadne pliki. Jest całkowicie wirtualny. Jest to prawdopodobnie bardzo powszechna rzecz, ale ponieważ nigdy wcześniej nie spotkałem się z tego rodzaju systemem przed dwoma miesiącami, chciałem to wyjaśnić na wypadek, gdyby nie był powszechny. Nie jestem fanem wszystkich ASP ani systemów z zamkniętymi źródłami, więc może się okazać, że jest to powszechna praktyka dla programistów ASP. Moje pytanie, które zajęło zdecydowanie zbyt dużo czasu, brzmi: jakie są zalety tego rodzaju systemu, w przeciwieństwie do tworzenia rzeczywistej hierarchii plików? Czy są jakieś wady przekierowywania każdego pojedynczego wywołania serwera plików? Aby plik .htaccess zawierał reguły przepisywania dla _każdego aliasu_?


title: Jak najlepiej sformatować pliki tekstowe statutów w HTML z określonymi identyfikatorami?

text: Staram się znaleźć najlepszy sposób na przetworzenie około 20 000 linijek statutu w formacie tekstowym na HTML, aby można go było wyświetlać i manipulować w sposób granularny, tj. według klauzuli. Format jest zasadniczo zagnieżdżoną listą, taką jak (a)(1)(A)(i)(II)(aa) i jest dość spójny. Każda klauzula zaczyna się od nowej linii i jest ujęta w nawias, jak powyżej. Celem jest, aby każda klauzula była ujęta w znacznik paragrafu z unikalnym identyfikatorem, takim jak p id="sec101a1AiI" (przepraszam, nie mogę rozgryźć formatowania kodu). Chodzi o to, aby móc później odnieść się do konkretnego punktu. Bawiłem się wyrażeniami regularnymi, ale wydaje się, że nie pozwalają mi one na iterację przez cały statut i tagowanie rzeczy w unikalny sposób. Jestem pewien, że istnieją lepsze opcje przy użyciu niestandardowego skryptu, ale nie wiem, od czego zacząć szukać. Wszelkie sugestie będą mile widziane.


title: Wzorzec projektowy do kompleksowego modelowania danych

text: Zajmuję się tworzeniem programu, który ma bazę danych SQL jako magazyn zapasowy. W bardzo szerokim opisie sam program pozwala użytkownikowi na generowanie rekordów w dowolnej liczbie zdefiniowanych przez użytkownika tabel i nawiązywanie między nimi połączeń. Co do specyfikacji: 1. Każdy wygenerowany rekord musi mieć możliwość połączenia z dowolnym innym rekordem w dowolnej innej tabeli użytkownika (wyłączając siebie... rekord, a nie tabelę). Tak, tworzy to dowolną mapę relacyjną wygenerowaną przez użytkownika. 2. Te „połączenia” są kierunkowe: przychodzące, wychodzące i dwukierunkowe. 3. Lista połączeń, które posiada rekord jest uporządkowana przez użytkownika. 4. Rekord musi „wiedzieć” o połączeniach nawiązanych _od_ do innych, jak również powiązań nawiązanych _z_ nim od innych. 5. Pole rekordu może również zawierać zagregowane informacje z jego połączeń (takie jak uzyskiwanie średniej, sumy itp.), które muszą być aktualizowane przy zmianie z innego rekordu, z którym jest połączony. 6. Aby oszczędzać pamięć, tylko istotne informacje muszą być ładowane w dowolnym momencie (nie można załadować całej bazy danych do pamięci podczas ładowania i stamtąd przejść). 7. Nie mogę zakładać, że zapasowy sklep jest lokalny. W tej chwili tak jest, ale ostatecznie ten program będzie zawierał synchronizację ze zdalną bazą danych. 8. Nie mogę polegać na konkretnej implementacji sklepu wspierającego. Oznacza to, że nie mogę być pewien, że zapasowy sklep jest w rzeczywistości relacyjny. W ten sposób wszystkie dane relacyjne są przechowywane w sposób jawny. Połączenia są swego rodzaju punktem tego programu, więc istnieje duże prawdopodobieństwo, że liczba wykonanych połączeń jest bardzo wysoka, zwłaszcza jeśli użytkownik korzysta z oprogramowania zgodnie z przeznaczeniem. Ani tabele użytkownika, połączenia ani rekordy nie są znane w czasie projektowania, ponieważ są generowane przez użytkownika. Spędziłem dużo czasu, próbując wymyślić, jak zaprojektować zapasowy sklep i model obiektowy, aby najlepiej pasowały do tych specyfikacji. W mojej pierwszej próbie projektowania miałem jeden obiekt zarządzający wszystkimi rekordami i połączeniami tabeli. Spróbowałem tego najpierw, ponieważ zmniejszało to zużycie pamięci (rekordy i połączenia były prostymi wzmiankami), ale utrzymywanie informacji zbiorczych i linków między tabelami stało się… uciążliwe (tj. ogromny bałagan). Śledzenie zależności przy użyciu tej metody stało się prawie niemożliwe. Zamiast tego zdecydowałem się na rozproszony inteligentny wykres, w którym każdy rekord i połączenie jest „świadomy” tego, co go otacza, zarządzając własnymi danymi i połączeniami z innymi rekordami. Zwiększa to mój ślad w pamięci, ale pozwala mi również stworzyć system powodujący błędy, dzięki czemu połączenia/rekordy nie są ładowane do pamięci, dopóki nie będą potrzebne. Znacznie łatwiej jest też kodować: śledzić zależności, eliminować cykliczne aktualizacje rekurencyjne itp. Moim największym problemem jest przechowywanie/ładowanie połączeń. Nie jestem zadowolony z żadnego z moich obecnych rozwiązań/pomysłów, więc chciałem zapytać i zobaczyć, czy ktoś jeszcze ma jakieś pomysły na to, jak to powinno być skonstruowane. Połączenia są dość proste. Zawierają: fromRecordID, fromTableID, fromRecordOrder, toRecordID, toTableID, toRecordOrder. Oto, co do tej pory wymyśliłem: 1. Przechowuj wszystkie połączenia w jednej dużej tabeli. Jeśli to zrobię, albo ładuję wszystkie połączenia na raz (jedno wywołanie big db) albo wykonuję wywołanie za każdym razem, gdy ładowana jest tabela użytkowników. Duży problem tutaj: rozmiar tabeli połączeń może być ogromny i obawiam się, że spowolniłoby to działanie. 2. Przechowuj w osobnych tabelach wszystkie połączenia wychodzące dla każdej tabeli użytkownika. To chyba najgorszy pomysł, jaki miałem. Teraz moje połączenia są „rozłożone” na wiele tabel (po jednej dla każdej tabeli użytkownika), co oznacza, że muszę załadować każdą tabelę tylko po to, aby znaleźć wszystkie połączenia przychodzące dla konkretnej tabeli użytkownika. Unikałem robienia „jednego wielkiego stołu”, ale nie jestem pewien, czy koszt jest tego wart. 3. Przechowuj w osobnych tabelach wszystkie połączenia wychodzące ORAZ przychodzące dla każdej tabeli użytkownika (używając flagi do rozróżnienia między przychodzącymi a wychodzącymi). To jest idea, do której się skłaniam, ale zasadniczo podwoi całkowitą pamięć dla wszystkich połączeń (ponieważ każde połączenie będzie przechowywane w dwóch tabelach). Oznacza to również, że muszę upewnić się, że informacje o połączeniu są zsynchronizowane w obu miejscach (każde połączenie „od” ma odpowiadające połączenie „do” w odpowiedniej tabeli. Oczywiście nie jest to idealne, ale oznacza to, że ładuję użytkownika tabeli, muszę tylko załadować jedną tabelę „połączenia” i mieć wszystkie potrzebne informacje.To również przedstawia osobny problem, związany z tworzeniem obiektu połączenia.Ponieważ każda tabela użytkownika ma listę wszystkich połączeń, istnieją dwie możliwości obiekt połączenia, który ma zostać wykonany.Jednak obiekty połączeń (zaprojektowane w celu ułatwienia komunikacji między rekordami) powinny być tworzone tylko raz.Oznacza to, że będę musiał opracować wspólny obiekt pamięci podręcznej/fabryki, aby upewnić się, że na połączenie zostanie utworzony tylko jeden obiekt połączenia. Czy ktoś ma jakieś pomysły na lepszy sposób, aby to zrobić?Kiedy już zaangażuję się w konkretny wzorzec projektowy, prawie go utknąłem, więc chcę się upewnić, że wymyśliłem najlepszy z możliwych. zauważę również, że moje obecne plecy sklepem jest SQLite. Napisałem program tak, aby nie był zależny od konkretnego magazynu zapasowego, wprowadzając warstwę adaptera, aby oddzielić pobieranie danych od reszty programu. Tak więc zapasowy magazyn może być wszystkim, nawet prostym plikiem tekstowym. Używam zapasowego sklepu wyłącznie do przechowywania i odzyskiwania danych, nic więcej. Nie używam żadnych konkretnych funkcji relacyjnych bazy danych/SQL i nie używam bazy danych do wykonywania obliczeń (agregacyjnych lub innych). Wszystko to jest obsługiwane w logice programu.


title: UML: Procesor kolejkowy w diagramie sekwencji

text: Jaki jest właściwy sposób reprezentowania procesora kolejek na diagramie sekwencji UML? Chcę przedstawić na tym samym diagramie dwa systemy, które są luźno połączone w kolejce. Pierwszy system wykonuje jakieś akcje i wstawia akcję do kolejki, drugi system zawsze nasłuchuje i gdy zdarzenie pojawi się w kolejce, usuwa zdarzenie z kolejki i je przetwarza, generując nowe akcje. Oba znajdują się na tym samym diagramie, ponieważ ma on reprezentować przypadek użycia integracji, który pokazuje, jak działają razem. Czy powinienem stworzyć linię życia reprezentującą kolejkę? Czy powinienem reprezentować proces „nasłuchiwania” jako pętlę zawierającą: wiadomość własną z etykietą „nasłuchuj”, wiadomość własną do przetwarzania wiadomości i wiadomości reprezentujące wysłanie wyniku.


title: Czy usługa internetowa korzystająca z formatu JSON przez POST może zostać zaklasyfikowana jako RESTful?

text: Ostatnio zacząłem używać nowego (dla mnie) paradygmatu dla serwisów internetowych. Używam kontrolera do akceptowania ciągów JSON przesyłanych przez POST, przetwarzania ich i zwracania ciągów JSON. GET, PUT, DELETE i inne metody rzucają HTTP 405. Ten wzorzec okazuje się bardzo wydajny z punktu widzenia asynchronicznych frameworków webowych (vert.x i play w szczególności), a także z punktu widzenia prac programistycznych. Jestem zdezorientowany, że nie wydaje się to być ani SOAP, ani REST. Nie sądzę, że jest to nawet JSON-RPC, ponieważ używam własnych nagłówków, takich jak: Request: { 'requestId':<generated req Id>, 'token':<wcześniej uwierzytelniony token>, 'action':<kontroler zdefiniowana akcja>, 'parameters':[ <tablica parametrów> ] } Odpowiedź: { 'result':'success/fail', 'payload':{ <payload> } } EDIT: Jest tylko jeden adres URL punktu końcowego, coś w rodzaju https://my.domain.com/api Czy ktoś może podać jakieś pomysły na temat tego, do czego można zaklasyfikować ten paradygmat?


title: dostępne metody zmieniają się wraz ze stanem obiektu

text: Programuję obiekt wykresu, który może być w stanie mutowalnym lub niezmiennym. W obu stanach ma metodę `get`, ale tylko w stanie mutable metoda `set` jest dozwolona. Przejście następuje, gdy wywołuje się metodę `compress`, która optymalizuje przechowywanie wykresu. **Jak mam sobie poradzić z faktem, że niektóre metody są legalne w niektórych stanach, a w innych nie?** Przychodzą mi do głowy dwa podejścia. Dosadnym sposobem jest użycie wzorca stanu. Jeśli wywołasz `set`, gdy wykres jest zmienny, wykona się on normalnie; ale jeśli wywołasz `set`, gdy wykres jest niezmienny, zostanie zgłoszony błąd. Dla mnie wygląda to brzydko, ponieważ niezmienny obiekt nadal ma metodę `set`. Alternatywnie mogę utworzyć typ `graph` z podtypem `mutable_graph`; tylko drugi ma metodę `set`. Zmiana stanu następuje poprzez zmianę typu wykresu. Jednak dla mnie to też wygląda brzydko; dla każdej implementacji `grafu` (których jest kilka), muszę teraz stworzyć dwa typy zamiast tylko jednego. EDYCJA: używam wzorca stanu i zgłaszam wyjątek; jeśli żadne rozwiązanie nie jest szczególnie preferowane, to wymaga napisania najmniejszego kodu. Dzięki za radę!


title: Zgłaszanie wyjątku dla błędów, które można naprawić

text: Powiedzmy, że mam taką klasę: public class MyObject { public List<string> MyCollection { get; ustawić; } } I metoda taka jak ta: public void DoSomething(MyObject object) { if(object.MyCollection == null) { // MyCollection nie może być null // Czy powinienem... // a) object.MyCollection = new List <ciąg>(); // b) wyrzuć nowy ArgumentException("MyCollection nie może być null"); } } Nie mam kontroli nad MyObject. Normalnie po prostu utworzyłbym instancję kolekcji w konstruktorze i skończyłem z tym. Czy należy po prostu utworzyć wystąpienie kolekcji w mojej metodzie, czy zgłosić wyjątek?


title: Najlepsza praktyka — wyjście z pętli przez modyfikację iteratora

text: Miałem dzisiaj ciekawą dyskusję z moim szefem na temat wyjścia z pętli przed spełnieniem warunku terminala. W części kodu VB6 miał konstrukcję, która wyglądała mniej więcej tak: Dim Termination As Int Termination = 10 For Iterator1 = 1 To Termination If Iterator1 = 5 Then Iterator1 = Termination End If Next Zakwestionowałem tę implementację, twierdząc, że `Exit For` był właściwym sposobem na przedwczesne wyjście z pętli w oparciu o warunek, taki jak ten: For Iterator2 = 1 do 10 If Iterator2 = 5 Then Exit For End If Next Zauważyłem, że w praktyce prawdopodobnie oba obliczają ten sam język maszynowy JMP kod operacji. Mój szef zapewnił, że jego implementacja może być bardziej wydajna, ponieważ miałaby tylko jeden JMP, jeden na końcu pętli, zamiast dwóch, jednego na końcu i jednego w środku dla instrukcji `Exit For`. Drugą implementację wolę ze względu na czytelność i semantykę. Ponadto w najnowszych wersjach Visual Studio for .Net, jeśli dodasz wiersze po instrukcji `Exit For`, zostaniesz ostrzeżony, że w kodzie znajdują się niedostępne wiersze. Jednak nie otrzymasz tego ostrzeżenia w VB6, od którego rozpoczęła się debata. Więc jaka jest najlepsza praktyka tutaj? Czy pierwszy przykład jest lepszy w VB6, czy drugi przykład jest lepszy we wszystkich sytuacjach? Jakie są zalety / wady każdego podejścia. **Edytuj** : Usunięto magiczną liczbę z przykładu kodu, aby zwiększyć przejrzystość pytania.


title: Czy „Jeśli metoda jest ponownie używana bez zmian, umieść metodę w klasie bazowej, w przeciwnym razie utwórz interfejs” to dobra zasada?

text: Mój kolega wymyślił praktyczną zasadę wyboru między tworzeniem klasy bazowej a interfejsu. Mówi: > Wyobraź sobie każdą nową metodę, którą zamierzasz wdrożyć. Dla każdego z nich > rozważ to: **czy ta metoda będzie zaimplementowana przez więcej niż jedną klasę w > _dokładnie_ tej formie, bez _żadnej_ zmiany?** Jeśli odpowiedź brzmi "tak", stwórz > klasę bazową. W każdej innej sytuacji stwórz interfejs. Na przykład: > Rozważmy klasy `cat` i `dog`, które rozszerzają klasę `ssak` i > mają jedną metodę `pet()`. Następnie dodajemy klasę `alligator`, która > niczego nie rozszerza i ma jedną metodę `slither()`. > > Teraz chcemy dodać do nich metodę `eat()`. > > Jeśli implementacja metody `eat()` będzie dokładnie taka sama dla `cat`, > `ps` i `aligator`, powinniśmy stworzyć klasę bazową (powiedzmy `zwierzę`), > która to implementuje metoda. > > Jednakże, jeśli implementacja w `alligator` różni się w najmniejszym stopniu, > powinniśmy stworzyć interfejs `IEat` i sprawić, by `mammal` i `alligator` > go zaimplementowały. Twierdzi, że ta metoda obejmuje wszystkie przypadki, ale wydaje mi się to zbytnim uproszczeniem. **Czy warto przestrzegać tej zasady?**


title: Jakie są wady samoenkapsulacji?

text: # Tło Błędem miliarda dolarów Tony'ego Hoare'a było wynalezienie "null". W związku z tym wiele kodu zostało usianych wyjątkami dotyczącymi wskaźnika zerowego (segfaults), gdy programiści próbują używać (dereferencji) niezainicjowanych zmiennych. W 1989 roku Wirfs-Brock i Wikerson napisali: > Bezpośrednie odniesienia do zmiennych poważnie ograniczają zdolność programistów do > udoskonalania istniejących klas. Opisane tutaj konwencje programowania mają strukturę > wykorzystanie zmiennych do promowania projektów wielokrotnego użytku. Zachęcamy użytkowników wszystkich > języków obiektowych do przestrzegania tych konwencji. Ponadto zdecydowanie zachęcamy projektantów języków obiektowych do rozważenia wpływu nieograniczonych odwołań do zmiennych na możliwość ponownego wykorzystania. # Problem Wiele programów, zwłaszcza w Javie, ale prawdopodobnie w C# i C++, często używa następującego wzorca: public class SomeClass { private String someAttribute; public SomeClass() { this.someAttribute = "Jakaś wartość"; } public void jakasMetoda() { if( this.someAttribute.equals( "Jakaś wartość" ) ) { // zrób coś... } } public void setAttribute( String s ) { this.someAttribute = s; } public String getAttribute() { return this.someAttribute; } } Czasami stosuje się rozwiązanie typu band-aid sprawdzając, czy w całym kodzie nie ma wartości „null”: public void someMethod() { attach this.someAttribute != null; if( this.someAttribute.equals( "Jakaś wartość" ) ) { // zrób coś... } } public void innaMetoda() { attach this.someAttribute != null; if( this.someAttribute.equals( "Jakaś wartość domyślna" ) ) { // zrób coś... } } Plaster nie zawsze pozwala uniknąć problemu ze wskaźnikiem zerowym: istnieje sytuacja wyścigu. Warunki wyścigu są łagodzone za pomocą: public void anotherMethod() { String someAttribute = this.someAttribute; asercja jakiegośAtrybutu != null; if( someAttribute.equals( "Jakaś wartość domyślna" ) ) { // zrób coś... } } Jednak wymaga to dwóch instrukcji (przypisania do lokalnej kopii i sprawdzenia `null`) za każdym razem, gdy zmienna o zasięgu klasowym jest używana do upewnij się, że jest ważny. # Self-Encapsulation Ken Auer's _Reusability Through Self-Encapsulation_ (Języki wzorcowe projektowania programów, Addison Wesley, Nowy Jork, s. 505-516, 1994) zalecał samokapsułkowanie połączone z leniwą inicjalizacją. Wynik w Javie przypominałby: public class SomeClass { private String someAttribute; public SomeClass() { setAttribute( "Jakaś wartość" ); } public void jakasMetoda() { if( getAttribute().equals( "Jakaś wartość" ) ) { // zrób coś... } } public void setAttribute( String s ) { this.someAttribute = s; } public String getAttribute() { String someAttribute = this.someAttribute; if( someAttribute == null ) { someAttribute = createDefaultValue(); setAtrybut( jakiśAtrybut ); } zwróć jakiśAtrybut; } protected String createDefaultValue() { return "Pewna wartość domyślna"; } } Wszystkie zduplikowane sprawdzenia dla `null` są zbędne: `getAttribute()` zapewnia, że wartość nigdy nie jest `null` w pojedynczym miejscu wewnątrz klasy zawierającej. Argumenty dotyczące wydajności powinny być dość dyskusyjne — nowoczesne kompilatory i maszyny wirtualne mogą w miarę możliwości wstawiać kod. Dopóki zmienne nigdy nie są przywoływane bezpośrednio, pozwala to również na prawidłowe zastosowanie zasady otwarte-zamknięte. # Pytanie Jakie są wady samoenkapsulacji, jeśli są? (Idealnie chciałbym zobaczyć odniesienia do badań, które przeciwstawiają solidność podobnie złożonych systemów, które używają i nie używają samoenkapsulacji, ponieważ wydaje mi się to dość prostą, testowalną hipotezą).


title: Typowe przypadki testowe dla walidatora schematu XML

text: Właśnie napisałem mój pierwszy walidator schematu XML oparty na SAX (Java), w którym przekazujesz mu adres URL schematu (wskazujący na plik `.xsd`) i instancję XML, a on określa, czy ta instancja jest ważna, czy nie . Teraz chcę napisać kilka testów jednostkowych dla walidatora (osoby z TDD, _wiem_, wiem!) i zastanawiałem się, jakie były typowe powody, dla których walidacja XML nie powiedzie się. W tym schemacie jest tak wiele elementów i atrybutów, że mógłbym dosłownie napisać _tysiące_ przypadków testowych. Pomyślałem, że ktoś tutaj może znać sposób na uproszczenie ich wszystkich do łatwego zestawu.


title: Ile funkcjonalności potrzeba do stworzenia nowej klasy?

text: Obecnie pracuję nad własnym małym projektem aplikacji do tworzenia kopii zapasowych plików WPF. Doszedłem do punktu, w którym chcę stworzyć metodę, która będzie rekurencyjnie kopiować pliki z jednego miejsca do drugiego. Nie po raz pierwszy zadaję sobie pytanie: > Czy ta metoda powinna być częścią istniejącej klasy, czy też powinnam ją przechowywać w > nowej klasie? Najbardziej przeszkadza mi to, że jeśli utworzę nową klasę, najprawdopodobniej będzie się ona składać wyłącznie z tej metody, więc wydaje się, że tworzenie zupełnie nowego typu tylko dla jednej akcji wydaje się naciąganiem. Z drugiej strony uważam, że to dobra abstrakcja. Kopiowanie plików nie ma wiele wspólnego z oknem WPF. Przykład, który tu pokazuję nasuwa bardziej ogólne pytanie. **Jak zachować równowagę między funkcjonalnością/abstrakcją/czytelnością, aby stworzyć kod, w którym zasady OOP nie przesłaniają zdrowego rozsądku?** Jestem stosunkowo nowy w programowaniu, ale chciałbym jak najszybciej zacząć stosować dobre praktyki kodowania, np. nie realizuję wzorców projektowych jak szalone, bo właśnie o nich czytałam.


title: Rozwijanie systemu Windows Phone 7 — jaki jest najtańszy sposób?

text: Prawdopodobnie konieczne jest posiadanie rzeczywistego urządzenia. Ale wolałbym nie kupować telefonu z umową. Czy to jest możliwe?


title: Przewaga umów nad oświadczeniami typu „assert”

text: Dzisiaj natknąłem się na pakiet Pythona o nazwie PyContracts. Jednak python ma instrukcję „asert”, która wydaje się pozwalać ci robić dokładnie te rzeczy. Jaką przewagę mają umowy nad oświadczeniami typu „assert”?


title: Praca zdalna i relokacja

text: Przepraszam, jeśli to pytanie jest duplikatem, przeprowadziłem rozległe poszukiwania i nie znalazłem niczego na ten sam temat (choć kilka na częściowo pokrywające się tematy). Ostatnio, będąc na wakacjach w Monachium w Niemczech, zaskoczyła mnie sama liczba stanowisk związanych z programowaniem dostępnych w mieście, na które łatwo się kwalifikuję (zarówno pod względem wiedzy, jak i doświadczenia). Reklamowane środowiska pracy wydawały się dobre, a wynagrodzenie wydawało się co najmniej tak dobre, jak oczekiwałbym w Wielkiej Brytanii. Prawdopodobnie 80% ogłoszeń, które widziałem w metrze dotyczyło zawodów związanych z IT, a dobre 60% tych, do których łatwo się zakwalifikowałem. W tej chwili pracuję jako freelancer głównie przy projektach internetowych i małych projektach programistycznych, ale widząc ogromną dostępność miejsc pracy w Monachium w porównaniu z moją okolicą, myślę o pracy zdalnej. Nie jestem w stanie _przenieść się_ do pracy przez następne 3 lata (moja żona ma kontrakt na dalsze bycie lekarzem w jej obecnym szpitalu przez ten czas), ale prawie na pewno będę na to otwarty po tym czasie (w końcu moja żona i Oboje kocham Monachium). W międzyczasie byłbym _bardzo_ zainteresowany pracą zdalną. Tak więc moje pytanie brzmi: **czy firmy kiedykolwiek zatrudniają pracowników zdalnych** (nawet z rzadkimi wyjazdami do biura) **z zagranicy, w celu _później_ relokacji?** A jeśli tak, to **jak czy rozmawiasz na ten temat z rekruterem, gdy kontaktujesz się w sprawie oferty pracy?** Język nie jest tu dla mnie barierą, ponieważ 90% ofert, które wyszukałem w Monachium, nie wymaga języka niemieckiego prelegenci (wydaje się, że mają duży rynek rekrutacyjny za granicą). Nie mam też złudzeń co do wad pracy zdalnej, ale bardziej interesuje mnie wykonalność scenariusza niż zawiłości (przynajmniej w tym momencie). Byłbym bardzo wdzięczny za każdy wkład, zwłaszcza od tych, którzy mają doświadczenie w pracy w takim scenariuszu!


title: Czy ten interpreter byłby uważany za maszynę wirtualną?

text: _(Przeredagowałem moje pytanie, aby było bardziej szczegółowe)._ Rozważ język programowania, jego programy mogą być uruchamiane tylko w określonym programie, który służy jako interpreter. Interpreter skanuje każdy wiersz kodu źródłowego i wykonuje go tak, jak jest. **Czy interpreter byłby uważany za maszynę wirtualną?** Koncepcyjnie maszyna wirtualna to program, którego inne programy używają jako platformy do uruchamiania. Tak więc ten interpretator pasuje do definicji. Ale ten interpreter interpretuje tylko kod źródłowy zwykłego tekstu na wykonania (a nie kod bajtowy).


title: Przyszłość WPF i wolnych formantów ?

text: Jestem chętny do pracy nad osobistym projektem, który chciałbym opublikować publicznie. Pracuję z Silverlight i mam doświadczenie z XAML, ponieważ jest to moja praca na pełen etat. Tworzenie interfejsów użytkownika w Blend i XAML sprawia mi przyjemność. Jestem również wielkim fanem języka C#. Nie wiem, co bym teraz zrobił bez LINQ. W każdym razie szukałem użycia WPF w moim osobistym projekcie. Wygląda na to, że wiele elementów sterujących w sieci to płatności za przedmioty. Jedynym miejscem, w którym znalazłem znaczną liczbę bezpłatnych kontrolek, jest rozszerzona struktura WPF na codeplex. Chcę stworzyć aplikację finansową i potrzebuję potężnej kontroli typu datagrid, która pozwoli mi wprowadzać dane transakcyjne. Nie znalazłem takiego sterowania za darmo w necie. Wygląda na to, że nie istnieje wiele darmowych bibliotek/kontrolek społecznościowych dla produktów Microsoft. Zastanawiałem się więc, czy WPF byłby dla mnie właściwą drogą. Nie mogłem znaleźć żadnych informacji na temat użycia WPF w systemie Windows 8, który wkrótce się pojawi. Nie znam planów Microsoftu co do tej technologii. Czy lepszym pomysłem byłoby użycie czegoś innego dla interfejsu użytkownika zamiast WPF?


title: Domyślny cel Ant: pomoc czy jar?

text: Co byś wybrał jako domyślny cel Ant? W kontekście małego narzędzia wizualnego z interfejsem użytkownika, open source. Myślałem o `jar`, ponieważ dystrybucją projektu jest plik jar. Ale ktoś woli mieć `pomoc` jako domyślny cel, aby pokazać dostępne cele. A może inny cel? Wątpię, czy ktoś by się tym przejmował, ale czy byłby to wybór „najmniejszej niespodzianki”?


title: Jak zostać dobrym graczem zespołowym?

text: Programuję (obsesyjnie) odkąd skończyłem 12 lat. Jestem dość kompetentny w całym spektrum języków, od asemblera, przez C++, Javascript, po Haskell, Lisp i Qi. Ale wszystkie moje projekty zostały wykonane przeze mnie. Ukończyłem inżynierię chemiczną, nie CS czy inżynierię komputerową, ale po raz pierwszy tej jesieni będę pracował nad dużym projektem programistycznym z innymi ludźmi i nie mam pojęcia, jak się na to przygotować. Całe życie używam Windowsa, ale ten projekt będzie bardzo unixowy, więc niedawno kupiłem Maca w nadziei na zapoznanie się ze środowiskiem. Miałem szczęście uczestniczyć w hackathonie z kilkoma przyjaciółmi w zeszłym roku – obiema specjalnościami CS – i co ciekawe, wygraliśmy. Ale zdałem sobie sprawę, gdy z nimi pracowałem, że ich przepływ pracy bardzo różnił się od mojego. Użyli Gita do kontroli wersji. Nigdy go nie używałem, ale od tego czasu nauczyłem się o nim wszystkiego, co mogłem. Wykorzystali również wiele frameworków i bibliotek. Musiałem dowiedzieć się, czym Railsy były praktycznie z dnia na dzień podczas hackathonu (z drugiej strony nie wiedzieli, jaki jest zakres leksykalny lub domknięcia). Cały nasz kod działał dobrze, ale oni nie rozumieli mojego, a ja nie rozumiałem ich. Słyszę odniesienia do rzeczy, które prawdziwi programiści robią na co dzień - testy jednostkowe, przeglądy kodu, ale mam tylko mgliste pojęcie, czym one są. Zwykle nie mam wielu błędów w moich małych projektach, więc nigdy nie potrzebowałem systemu śledzenia błędów ani testów dla nich. I ostatnią rzeczą jest to, że zrozumienie kodu innych ludzi zajmuje mi dużo czasu. Konwencje nazewnictwa zmiennych (które różnią się w zależności od nowego języka) są trudne (__mzkwpSomRidicAbbrev), a luźne sprzężenie jest dla mnie trudne. Nie oznacza to, że nie dzielę się luźno — myślę, że jestem w tym całkiem dobry do własnej pracy, ale kiedy pobieram coś takiego jak jądro Linuksa lub kod źródłowy Chromium, aby się temu przyjrzeć, spędzam godziny na próbach aby dowiedzieć się, jak łączą się wszystkie te katalogi i pliki o dziwnych nazwach. Wymyślanie koła na nowo jest grzechem programistycznym, ale często uważam, że po prostu szybciej jest napisać samemu funkcjonalność niż spędzać godziny na analizowaniu jakiejś biblioteki. Oczywiście ludzie, którzy robią to zawodowo, nie mają takich problemów, a ja sam muszę dojść do tego punktu. **Pytanie:** Jakie kroki mogę podjąć, aby rozpocząć „integrację” ze wszystkimi innymi? Dziękuję!


title: Porady dla nietradycyjnego studenta CS?

text: Jestem tutaj w dość wyjątkowej sytuacji. Mam zamiar rozpocząć jutro (dosłownie) szkołę informatyki na lokalnym uniwersytecie w ramach programu BS. Jednak zaczynam jako **nietradycyjny** student. Moje wykształcenie: > Posiadam już tytuł licencjata i magistra socjologii, > które zdobyłem podczas studiów doktoranckich, które opuściłem pół roku temu > z powodów > osobistych (takich jak uświadomienie sobie przedmiotu i związanej z nim pracy > nie miało już dla mnie żadnego znaczenia). Po wielomiesięcznych zmaganiach ze znalezieniem > pracy w tej gospodarce -- gdzie lata studiów i moje > doświadczenie w służeniu jako asystent nauczyciela (i zajęciach dydaktycznych) wydają się > mało liczyć -- postanowiłem wrócić do szkoły na CS . Pomiędzy pracą nauczyciela w lokalnym college'u, pracą na pół etatu w lokalnej restauracji i pożyczką, mogę sobie pozwolić na czesne w tym semestrze i wydatki na życie. Nie kodowałem od najmłodszych lat, jak niektórzy studenci CS. Prawie dziesięć lat temu wziąłem dużo zaawansowanej matematyki i nauk ścisłych w liceum oraz kilka zajęć z programowania, gdzie używałem Javy i C++ - i osiągnąłem przyzwoity poziom wydajności, wystarczający, aby uzyskać A z każdej klasy. Potrafię posługiwać się komputerem wystarczająco kompetentnie, ale nie potrafię robić większości fajnych rzeczy, które potrafią robić prawdziwi komputerowi nerdowie, geekowie, hakerzy itp. Potrafię zrobić kilka rzeczy z HTML, ale dopiero teraz uczę się zastosowań CSS -- nieważne JavaScript, PHP, XML, Ruby on Rails itp. Do tej pory czytałem kilka wątków na tej stronie (także jako strony poza tym miejscem), które są skierowane do studentów informatyki. W związku z tym otrzymuję wiele ogólnych porad – takich jak nauka dobrego pisania, zdobywanie staży i samodzielnych projektów, dużo kodowania, czytanie książek, bieżące śledzenie w tej dziedzinie itp. Oczywiście planuję to zrobić wszystkie te rzeczy. Staram się również nauczyć (ponownie) HTML (w szczególności XHTML) i dodać CSS, PHP i MySQL do mojego repertuaru. (Chociaż z tego, co czytałem i słyszałem od znajomych z dziedzin technicznych, prawdopodobnie powinienem skupić się na HTML5 i CSS3.) Zacząłem też czytać książkę o Pythonie i bawić się kodowaniem. Mogę teraz powiedzieć, że przez następne kilka lat będzie ciężko, ale zrobię co w mojej mocy. Staram się zebrać jak najwięcej rad z różnych stron, które znalazłem i z wątków już rozpoczętych tutaj. Mimo to mam kilka obaw, które miałem nadzieję, że niektórzy z Was zechcą się zająć (dla mnie i dla wszystkich **innych** nietradycyjnych studentów, którzy mogą czytać): * Czy możecie polecić jakieś dobre sposoby na zrekompensowanie tych wszystkich lata **nie** spędzam na kodowaniu przy każdej okazji? Czy jest to po prostu kwestia grania w „nadrabianie zaległości”? * Jak mogę zrównoważyć potrzebę kodowania z innymi obowiązkami (praca szkolna, praca itp.)? _Och, jak czule wspominam czasy, kiedy wszystkie moje czesne i wydatki były pokrywane ze stypendiów i tym podobnych, haha!_ * Wydaje mi się, że prawdopodobnie **mógłbym** zrobić, to zostać przyjętym do finansowanego letniego programu badawczego doktorantów, realizując projekty badawcze pod kierunkiem profesora. Myślisz, że to wygląda dobrze dla potencjalnych pracodawców? * Ponieważ mam już stopnie naukowe, prawdopodobnie po ukończeniu kilku klas licencjackich mógłbym pójść na program MS na wydziale informatyki. Program MS kładzie nacisk na rozwój oprogramowania i obejmuje końcowy projekt inżynierii oprogramowania. Czy powinienem po prostu spróbować przejść do tego programu po ukończeniu wystarczającej ilości materiału licencjackiego? * Czy masz jakieś inne rady (poza moimi własnymi pytaniami), które byłyby szczególnie istotne dla nietradycyjnych studentów CS, którzy mogą mieć inną sytuację niż bardziej tradycyjni studenci? Wszelkie porady lub uwagi, które możesz zaoferować, będą bardzo mile widziane. Bardzo dziękuję za poświęcony czas i uwagę.


title: Jakie są alternatywy dla używania stosu do reprezentowania semantyki wywołań funkcji?

text: Wszyscy wiemy i uwielbiamy, że wywołania funkcji są zwykle implementowane przy użyciu stosu; są ramki, adresy zwrotne, parametry, cała masa. Stos jest jednak szczegółem implementacyjnym: konwencje wywoływania mogą robić różne rzeczy (tj. szybkie wywołanie x86 używa (niektórych) rejestrów, MIPS i zwolennicy używają okien rejestrów itd.), a optymalizacje mogą robić nawet inne rzeczy (wstawianie, pomijanie wskaźnika ramki, optymalizacja ogona..). Oczywiście, obecność wygodnej instrukcji stosu na wielu maszynach (VM jak JVM i CLR, ale także na prawdziwych maszynach jak x86 z ich PUSH/POP itp.) sprawia, że wygodnie jest używać go do wywołań funkcji, ale w niektórych przypadkach jest to możliwe programować w sposób, w którym stos wywołań nie jest potrzebny (myślę tutaj o stylu Continuation Passing Style, lub o aktorach w systemie przekazywania komunikatów) Zacząłem się więc zastanawiać: czy jest możliwe zaimplementowanie semantyki wywołań funkcji bez stosu lub lepiej, używając innej struktury danych (być może kolejki lub mapy asocjacyjnej?) Oczywiście rozumiem, że stos jest bardzo wygodny (jest powód, dla którego jest wszechobecny), ale ostatnio natknąłem się na implementację, która mnie zastanowiło.. Czy ktoś z was wie, czy kiedykolwiek zostało to zrobione w jakimkolwiek języku/maszynie/maszynie wirtualnej, a jeśli tak, jakie są uderzające różnice i niedociągnięcia? EDYCJA: Moje przeczucie jest takie, że różne podejścia do obliczeń cząstkowych mogą wykorzystywać różne struktury danych. Na przykład rachunek lambda nie jest oparty na stosie (idea aplikacji funkcji jest wychwytywana przez redukcje), ale patrzyłem na prawdziwy język/maszynę/przykład. Dlatego proszę...


title: Sprzedaż skryptów/modułów CMS w internecie

text: Chociaż ubieganie się o pracę jako freelancer bez wystarczającego portfolio/doświadczenia zawodowego jest prawie niemożliwe, postrzegam sprzedaż moich skryptów jako rozwiązanie. Problem w tym, że do tej pory widziałem tylko jedno forum, na którym taki handel się odbywa - DigitalPoint. Czy są jeszcze jakieś +/- zaufane miejsca, w których można oferować swoje skrypty na sprzedaż?


title: Rozpoczęcie nowego projektu w Pythonie i qt. Gdzie mogę znaleźć dobry układ kodu do budowania rusztowania?

text: Jestem w trakcie rozpoczynania nowego projektu z pythonem i Qt. Projekt zaczyna się od zera i może stać się aplikacją komercyjną. Podczas gdy programowanie kodu samo w sobie jest zadaniem, kolejnym zadaniem, z którym muszę się najpierw uporać, jest wdrożenie odpowiedniego układu programistycznego (pliki makefile, pakowanie do wydania na wielu platformach itd.). Poszukuję już wdrożonego oprogramowania open-source o komercyjnej jakości, z którego mogę zapoznać się z najlepszymi praktykami w celu zorganizowania komercyjnej aplikacji lub ewentualnie sugestii dobrych praktyk w tym zakresie. Zrobiłem swoje badania i nadal jestem otwarty na to pytanie. Chcę przyzwoitego przykładu, aby wiedzieć, jak to się robi w odpowiedni sposób. Wszystkie repozytoria, które znalazłem, są zazwyczaj tworzone przez ludzi, którzy nie dbają o jakość (to tylko kilka naprawdę zhakowanych skryptów) ani możliwość przenoszenia platformy, ani nie zajmują się różnymi fazami (rozwojem, testowaniem, wdrażaniem, instalacją). Alternatywnie, oferują w pełni rozwiązania CI/IDE, które są niedostępne dla pojedynczego programisty.


title: Rozbijanie klasy modeli - MVC

text: Nie jestem pewien, czy istnieje „prawidłowa” czy „niewłaściwa” odpowiedź na to pytanie, ale byłem ciekaw ogólnego konsensusu. Mam model użytkownika, który obecnie wykonuje funkcje użytkownika (takie jak pobieranie danych użytkownika z bazy danych, wstawianie nowych użytkowników do bazy danych, aktualizowanie danych użytkownika itp.) Prowadzi to do dość dużej klasy. Czy jest jakaś przyjęta myśl o rozpadzie modeli, skoro model odnosi się już do jednego rodzaju bytu? A może w tym przypadku dopuszczalne są duże klasy? W tej chwili klasa będzie przypominać coś takiego: <?php class Users_Model { public function userExists($user_id) { //kod do sprawdzenia, czy użytkownik istnieje } public function fetchUser($user_id) { //kod do pobrania obiektu użytkownika z ID... } protected function fetchUserPassword($user_id) { return $this->fetchUserValue($user_id, "password"); } protected function fetchUserLowercaseUsername($user_id) { return $this->fetchUserValue($user_id, "lower"); } private function fetchUserValue($user_id, $value) { //pobierz wartość użytkownika z bazy danych } public function logout() { //kod do wylogowania użytkownika } public function didPasswordMatch($user_id, $password) { //checks jeśli wprowadzone hasło pasuje do zapisanego... } public function createSession($user_id) { //tworzy sesje dla BAZY DANYCH } private function createCookie($code, $user_id) { //utwórz ciasteczka dla sesji } } ?> Moje koncern robił zbyt wiele rzeczy (wykonywał pobieranie informacji o użytkowniku z bazy danych oraz obsługę bazy danych po stronie wylogowania i sesji dla użytkownika).


title: Kluczowe kompetencje programistów w sektorze finansowym?

text: Zbliża się rozmowa kwalifikacyjna dla firmy działającej na rynkach finansowych. Jakie są główne obszary, poza ogólnymi umiejętnościami, takimi jak OOD, refaktoryzacja, testowanie itd., które są szczególnie potrzebne programiście finansowym? Przychodzą mi do głowy pewne oczywiste, takie jak tryby zaokrąglania, różnice między typami danych zmiennoprzecinkowych itp. Jakie inne obszary powinienem odświeżyć?


title: Problemy psychologiczne – pokonywanie nieśmiałości i nudy?

text: Programuję od około 11 miesięcy. Nauczyłem się kilku rzeczy, a niektórych uniknąłem. Znam kilka zaawansowanych rzeczy i nie znam podstawowych rzeczy. Łatwo mi się nudzi programowanie, gdy programuję w języku programowania, który znam, ale jest inaczej, gdy programuję w nowym języku. Lubię uczyć się programować, a nie tworzyć aplikacje, ale chciałbym, żeby to się zmieniło. Nie jestem też zbyt konsekwentny. Zaczynam jedną rzecz i po kilku dniach kończę czymś, co nie ma nic wspólnego z tym, co zacząłem. Jestem też samotnikiem i osobą nieśmiałą, więc staram się nie prosić o pomoc (uparty?) iz biegiem czasu tracę pewność siebie i cierpliwość. Kiedy odwiedzam strony z projektami open source, chcę dołączyć do jakiegoś zespołu, ale wygląda na to, że wszyscy używają jakiegoś języka/narzędzi, o których istnieniu nawet nie wiem. Czy to brak pewności siebie, czy nadal jestem początkującym? I jak powiedziałem, staram się robić rzeczy sam, co bardzo często jest całkowicie demotywujące. Czy ktoś może mi powiedzieć, jak czuć się pewniej, jak zdobyć siłę woli, by dołączyć do jakiegoś zespołu? Jeśli uznasz, że to pytanie jest niewłaściwie umieszczone, nie odrzucaj mnie, po prostu powiedz mi, jak je usunąć lub jak wysłać do StackExchange.


title: Skąd wiesz, kiedy przestać dodawać funkcje?

text: Jakiś czas temu napisałem bardzo mały skrypt w Pythonie, który okresowo sprawdzał kanał xml pod kątem nowych wpisów i ostrzegał użytkownika o nowych wpisach, gdy są obecne. Napisałem to dla siebie, więc zasadniczo był to program oparty na konsoli, z którego mógł korzystać każdy, kto jest zaznajomiony z interfejsem konsoli. Po pewnym czasie zdecydowałem, że może być bardziej przydatny dla innych ludzi i zacząłem porządkować, oczyszczać dane wejściowe, usuwać błędy. Przyszło mi do głowy, że ponieważ napisałem skrypt, wiedziałem, jak go używać efektywnie, dokładnie itp. Inni mogą nie, więc zacząłem dodawać GUI. Zaczęło się od prostego menu, a następnie rozwinęło się do bardziej pełnego GUI z interfejsem i menu opcji. Następnie dodałem zapisane preferencje użytkownika, a także miejsce na wcześniej wyszukiwane kanały xml, aby przyspieszyć powtórne wyszukiwanie. Dodałem logowanie, aby pomóc w debugowaniu aplikacji na wypadek, gdyby coś poszło nie tak, przeniosłem aplikację do najnowszej dostępnej stabilnej bazy kodu Pythona dla wybranej przeze mnie platformy i poprawiłem funkcje okna dialogowego. Poprawiłem błędy i wyraźnie skomentowałem mój kod, a mimo to nadal mam rzeczy, które moim zdaniem można zrobić, aby ulepszyć aplikację, zanim udostępnię ją testerom alfa. Jest to bardzo dalekie od mojego oryginalnego skryptu 20-30 linii. To, co oczekiwałem, zajęłoby mi tylko godzinę lub dwie, aby przejść od weryfikacji koncepcji do programu do akceptowalnego użycia, zajęło mi to 10-20 razy więcej. (Nadal jestem noobem i zajmuje mi to dużo czasu, ale nadal…) Skąd wiesz, kiedy przestać dodawać/ulepszać/naprawiać rzeczy i pozwolić dziecku czołgać się na zewnątrz?


title: Jak działa wielozadaniowość

text: Nie mam pojęcia o wewnętrznym działaniu systemu operacyjnego, ale mogę mniej więcej odgadnąć przybliżone zachowanie wielu funkcji. Jedyną rzeczą, której nie jestem w stanie rozgryźć, jest wielozadaniowość. Teoretycznie system operacyjny zarządza czasem, w zależności od procesora w krótkich odstępach czasu do różnych uruchomionych programów. Ale nie jest jasne, jak to **naprawdę** działa. Powiedzmy, że system operacyjny chce uruchomić mój program. Kod maszynowy jest ładowany gdzieś w pamięci RAM, zaczynając od określonego adresu. Myślę, że wtedy należy wykonać skok do tego adresu, umożliwiając wykonanie mojego kodu. Ale w ten sposób system operacyjny nie może odzyskać kontroli, dopóki nie odskoczę. Zasadniczo mogę sobie wyobrazić tylko dwa sposoby, aby to zadziałało, ale żaden z nich nie wydaje się odpowiedni: * System operacyjny mógłby odczytać instrukcje maszyny, które chcę wykonać i emulować je zamiast wykonywać je bezpośrednio. Celowo jestem niejasny, ponieważ nie wiem, jak to działa, ale wygląda na to, że znacznie spowolniłoby to program. * Alternatywnie system operacyjny może poczekać, aż wykonam wywołanie systemowe. W tym momencie odzyskuje kontrolę i może sprawdzać, jak długo biegam i robić swoje rzeczy związane z timesharingiem. To może działać, ale wydaje się niewiarygodne, ponieważ mógłbym wykonać długie obliczenia, które nie wymagają wywołań systemowych i zawiesić wszystko na chwilę. Wygląda więc na to, że żaden mechanizm nie działałby zbyt dobrze. Jak faktycznie działa wielozadaniowość?


title: Jak stopień czynnik ludzki może pomóc informatykowi?

text: Kończę studia magisterskie z CS i mam już połowę godzin kredytowych potrzebnych do uzyskania stopnia naukowego z czynnika ludzkiego. Niedawno odkryłem, jak przydatne zrozumienie poznania może pomóc komuś, kto tworzy interfejsy użytkownika i jest spragniony większej wiedzy w tej dziedzinie. Wydaje mi się, że posiadanie zarówno tytułu magistra w zakresie czynników ludzkich, jak i CS byłoby bardzo opłacalne, ale czy byłyby tam oferty pracy, które pozwoliłyby mi zastosować oba? To znaczy, co naprawdę chciałbym zrobić, to wziąć wymagania dla jakiejś aplikacji, zastosować różne teorie czynnika ludzkiego (GOMS, CE+) do opracowania interfejsu, może przeprowadzić poznawczy spacer z użytkownikami, aby zoptymalizować interfejs użytkownika, a następnie opracować aplikację. Czy istnieją takie prace? Powodem, dla którego pytam, jest to, że zastanawiam się, czy większość miejsc chce, abyś był albo ekspertem od czynników ludzkich, albo programistą, ale nie obydwoma.


title: Benchmarking stowarzyszeń ORM

text: Próbuję porównać dwa przypadki autoreferencyjności od wielu do wielu, jak opisano w stowarzyszeniach datamapperów. Oba przypadki składają się z klasy Item, która może wymagać wielu innych elementów. W obu przypadkach potrzebowałem biblioteki testowej ruby i pliku źródłowego, utworzyłem dwa elementy i przetestowałem funkcje wymagające/niewymagane, jak poniżej: Benchmark.bmbm do |x| x.report("require:") { item_1.require_item item_2, 10 } x.report("unrequire:") { item_1.unrequire_item item_2 } end Aby było jasne, obie funkcje to datamapper dodaj/zmień funkcje takie jak: componentMaps.create :component_id => item.id, :quantity => ilość componentMaps.all(:component_id => item.id).destroy! oraz links_to_components.create :component_id => item.id, :quantity => ilość links_to_components.all(:component_id => item.id).destroy! Wyniki są zmienne i mieszczą się w zakresie 0,018001 do 0,022001 dla funkcji wymaganej w obu przypadkach oraz 0,006 do 0,01 dla funkcji niewymaganej w obu przypadkach. To wzbudziło moje podejrzenia co do poprawności mojej metody testowej. # Edycja Przeszedłem dalej i porównałem "pobierz według przypadku klucza podstawowego" do "znalezienia pierwszego pasującego przypadku rekordu" przez: (1..10000).each do |i| Item.create :name => "item_#{i}" end Benchmark.bmbm do |x| x.report("Get") { item = Item.get 9712 } x.report("First") { item = Item.first :name => "item_9712" } koniec, gdzie wyniki były bardzo różne, np. 0 sekund w porównaniu do 0,0312 zgodnie z oczekiwaniami. Sugeruje to, że benchmarking działa. Zastanawiam się, czy prawidłowo porównałem te dwa typy skojarzeń i czy różnica między 0,018 a 0,022 sek jest istotna?


title: Jak solidne są zatwierdzenia Git po wyłączeniu zasilania?

text: Pewnego dnia używałem Gita (nadal go używam) i prąd spadł, gdy się angażowałem. Kiedy wróciłem (a właściwie prąd), repozytorium git było uszkodzone. Nie pamiętam dokładnej nazwy, ale było to coś w stylu „nieprawidłowe referencje” lub coś w tym stylu. Łatwo zgadnąć, że commit został złamany w połowie operacji (commitowałem przez IntelliJ, który automatycznie dodaje indeksy). Łatwo też było zgadnąć, że tak naprawdę 'commit' nie jest tak KWASEM jak operacja DBMS o tej samej nazwie. **P** : Czy istnieje sposób na zapewnienie, że operacje repo-modyfikowania uwzględniają atomowość? tzn. jeśli prąd znowu spadnie, a ja się zobowiązuję, chciałbym, aby mój system plików nie był w uszkodzonym stanie.


title: Czy powinienem używać git dla plików projektu, innych niż rzeczywiste źródło?

text: Mam wiele małych projektów i chociaż ich kod źródłowy jest archiwizowany i śledzony za pomocą git, nie wiem, co zrobić z resztą plików powiązanych z projektem. Składają się z małych plików tekstowych, obrazów, może prototypu lub proof of concept itp. Nie są one konieczne do zbudowania lub wdrożenia, ale potrzebuję ich podczas pracy nad projektem. To nie jest tak naprawdę dokumentacja, ale raczej listy rzeczy do zrobienia, błędy do naprawienia, kilka zrzutów ekranu, tego typu rzeczy. Jak powiedziałem wcześniej, są to małe projekty, więc nie sądzę, że powinienem tworzyć wiki/bugtracker dla każdego z nich, zwłaszcza, że jestem jedynym programistą :) Tworzę ich kopie zapasowe, ale czuję, że mogą skorzystać z git jako dobrze (w innym repozytorium). Posortowałem te pliki w trzech głównych folderach: „bieżący”, „porzucony” i „zakończony”. **Czy powinienem używać git i po prostu `git mv` plików, gdy projekt jest skończony lub porzucony? Jestem trochę nowy w git i nie wiem, jak dobrze narzędzia „lubią” całe foldery, które się przemieszczają.** Jeśli masz lepszy sposób na śledzenie tych plików, jestem zainteresowany. Jednak prawdopodobnie jest zbyt szeroki na pytanie SE.


title: Czy możesz nadużywać delegatów i wydarzeń?

text: Właśnie zacząłem zajmować się programowaniem opartym na zdarzeniach i uważam, że delegaci i wydarzenia są bardzo przydatne. Odkąd zacząłem dostrzegać potencjał, zacząłem ich używać cały czas do rozwiązywania problemów, takich jak aktualizowanie wyświetlaczy między kontrolkami i wywoływanie procedur składowanych po aktualizacjach itp. Zaczynam ich używać tak często, że tworzę i subskrybuję zdarzenia więcej niż wywoływanie metod ręcznie w kodzie. Czy istnieją jakieś zasady, których należy przestrzegać, aby wiedzieć, kiedy należy użyć zdarzenia, czy tylko zwykłego, starego prostego wywołania funkcji? Każda rada jest bardzo ceniona. Dziękuję


title: Jak poradzić sobie ze strachem przed przyszłymi problemami licencyjnymi produktów firm trzecich w rozwoju oprogramowania?

text: Firma, w której pracuję, kupiła ostatnio kilka bibliotek zewnętrznych od bardzo znanego, uznanego dostawcy. Wśród kierownictwa panuje obawa, że istnieje możliwość, że nasza licencja na korzystanie z oprogramowania może zostać w jakiś sposób cofnięta. Przykład, który słyszę, dotyczy czegoś w rodzaju problemu patentowego; tzn. firma, od której kupiliśmy biblioteki, mogłaby zostać pozwana i utracić prawnie możliwość rozpowszechniania i udostępniania bibliotek. Wielkim strachem jest to, że otrzymujemy informację, że musimy całkowicie zaprzestać korzystania z bibliotek i mamy na to krótki okres czasu. W wyniku tego strachu nasza zdolność do korzystania z tych bibliotek (na które firma wydała pieniądze...) jest ograniczona, kosztem wielu godzin poświęconych na rozwój. W szczególności musimy opracować wiele funkcji, które biblioteka już zawiera. Czy powinniśmy się w ten sposób ograniczać? Czy jest możliwe, że licencja wieczysta przyznana nam przez stronę trzecią może zostać cofnięta w przypadku czegoś takiego jak problem patentowy i czy są jakieś przykłady takiego zdarzenia? Co najważniejsze, jeśli jest to coś, o co należy się słusznie martwić, w jaki sposób ludzie mogą kiedykolwiek skorzystać z oprogramowania innych firm, jednocześnie przygotowując się na możliwość całkowitej utraty tej możliwości? PS - Rozumiem, że będzie to zapuszczać się w wiedzę prawniczą i że żadna z udzielonych odpowiedzi nie może być w żaden sposób interpretowana jako porada prawna.


title: Dane testowe produkcyjne czy niestandardowe do testów jednostkowych?

text: Ostatnio miałem małą sprzeczkę z innymi programistami. Przekształcamy różne ontologie z oryginalnego formatu źródłowego (Pica+, RDF itp.) na nasz format danych i mamy kilka konwerterów dedykowanych właśnie do tego zadania. Pojawił się argument, czy powinniśmy użyć pełnego pliku danych ontologicznych, czy też stworzyć podzbiór specjalnie używany do testowania. Argumentowałem za podzbiorem: niestandardowym plikiem wszystkich przypadków użycia wymaganych do potwierdzenia, że konwertery działają poprawnie. Twierdzili, że plik produkcyjny jest zawsze aktualny i każda zmiana w pliku produkcyjnym spowoduje przerwanie testów. To prawda, powiedziałem, ale jeśli potrzebna jest zmiana plików produkcyjnych, to niezmiennie zmieniają się wymagania, więc nie jest to wina wykorzystania danych testowych. Uznali to za bardzo słaby argument i ostatecznie zrezygnowali z używania stworzonego na zamówienie pliku testowego. Pytanie sprowadza się do tego, czy użyć pliku produkcyjnego do testowania naszych konwerterów, czy też podzbioru danych. Jakie są plusy i minusy? Jestem bardzo za używaniem pliku testowego do konwersji, ale jestem skłonny założyć, że moje założenie jest błędne. Jeśli mam rację, czy jest jakiś sposób, w jaki mogę bardziej elokwentnie i przekonująco argumentować swoją sprawę?


title: Jak projektować różne modele architektury/biznesu?

text: Obecnie uczę się różnych podejść do projektowania aplikacji i jest jedna rzecz, której naprawdę nie mogę sobie wyobrazić. Załóżmy, że mam w sieci urządzenie fizyczne, kamerę IP do monitoringu. Potrzebuję modelu reprezentującego 'kamery IP monitorujące' do pracy z nimi w mojej aplikacji, który może wyglądać tak: public class IPCamera { public string Token { get; ustawić; } publiczny adres IP adres IP { get; ustawić; } ciąg publiczny RtspUri { get; ustawić; } } Teraz, jeśli chcę przechowywać IPCamera w bazie danych (np. za pomocą Entity Framework), potrzebuję może innych właściwości, a tym samym innego modelu z: public int Id { get; ustawić; } Och.. Chcę uzyskać dostęp do mojej aplikacji za pomocą usługi WCF. Nie mogę tutaj użyć obiektu „IPAddress”, ponieważ nie jest on zbyt przyjazny dla serializacji, dlatego potrzebuję innego modelu z niestandardową klasą IP, która przechowuje adres IP jako ciąg. I na koniec klient Androida chce uzyskać dostęp do moich danych. Projektuję RESTful API za pomocą WebApi2. Klient nie jest zainteresowany kamerami RTSPUri, ale chce wiedzieć o ich aktualnym stanie (jest online, jest offline). Zastanawiam się: jak nazwać wszystkie te modele, aby nie wchodziły w konflikt? Czy powinienem zaprojektować model dla każdego celu/warstwy/usługi? A jak je połączyć/mapować? Z wzorem adaptera?


title: Jeśli chodzi o konwersję little endian i big endian

text: Mam pytanie dotyczące big endian i little endian. Zasadniczo konwersja służy do `odwrócenia kolejności bajtów w pamięci` . Kiedy musimy dokonać konwersji, czy musimy przekonwertować każdy typ danych?


title: Nieodebrane pytanie w technicznej rozmowie telefonicznej i list uzupełniający

text: Być może właśnie zbombardowałem telefoniczny wywiad dotyczący C++. Ankieter pytał głównie o struktury danych i mogłem szczegółowo omówić każdą ze struktur danych, o którą pytał. Punkt dla mnie, myślę. Zło. Następnie prosi o dołączenie do mnie na stronie poświęconej współpracy, gdzie może zobaczyć, co piszę. To był ten sam proces, co wywiad nr 1, który przebiegł dobrze, nie idealnie, ale dobrze. Więc pytanie brzmiało: Jak odwrócić połączoną listę? dał prototyp funkcji podobny do Node *reverse(Node *head) Zmagałem się z tym przez około 10-15 minut, aż godzina się skończyła. Udało mi się przekazać ogólny pomysł, ale nie mogłem odwrócić listy linków. Moje pytanie brzmi, czy po przypomnieniu sobie odpowiedzi po wywiadzie wspominam o tym w liście z podziękowaniami, jeśli w ogóle powinienem go napisać?


title: Jak zlecić projektowanie stron internetowych?

text: Planuję uruchomić stronę internetową. Nie jestem dobry w projektowaniu. Planuję zlecić część projektową na zewnątrz. Jak mam to zrobić? Czy powinienem najpierw zaprogramować, a potem poprosić projektantów o pracę nad tym? A może powinienem otrzymać od nich projekt, a potem nad nim pracować? Co wolisz?


title: Przetestuj, aby potwierdzić wiadomość z losowym składnikiem

text: Piszę system uwierzytelniania, który używa wiadomości w formacie XML między klientem/serwerem. Pomyślne uwierzytelnienie nazwy użytkownika/hasła musi zwrócić klientowi losowo wygenerowany identyfikator sesji: <?xml version="1.0"?> <amhAPI> <auth> <sessionId>728c91ea-2ead-4fa9-93c5-3a8453174bea</sessionId> </auth> </amhAPI> Jak napisać test jednostkowy, który może potwierdzić format komunikatu o powodzeniu, skoro nie mogę po prostu wykonać prostego dopasowania ciągu ze względu na losowy składnik?


title: Gdzie zaimplementować logikę bezpieczeństwa wątków dla mojej struktury danych kolejki?

text: Od razu przyznam, że robię _bardzo_ mało wielowątkowości, więc pytania o styl i organizację w tej dziedzinie są dla mnie trochę świeże. Napisałem strukturę danych (w Pythonie, jeśli to ma znaczenie), która implementuje specjalny rodzaj kolejki. Chciałbym użyć tej kolejki do przekazywania wiadomości między wątkami. Obecnie jedyna logika jaką mam nie ma nic wspólnego z wątkami, a po prostu implementuje „specjalny sos” organizowania wiadomości w tej kolejce. Lubię mieć tę kolejkę jako strukturę danych, która nie ma nic wspólnego z wątkami, tak jak każda inna struktura danych. Muszę jednak użyć muteksów, zmiennych warunkowych itp., aby zaimplementować logikę bezpieczeństwa wątków. Pytanie brzmi, dokąd zmierza ta logika? Czy mam napisać klasę, powiedzmy `SpecialQueueConcurrent` pochodną od `SpecialQueue`? Czy piszę klasę, która otacza `SpecialQueue` zamiast wywodzić się z niej? Czy udostępniam opcję, aby była współbieżna w konstruktorze? Jak to się zwykle robi?


title: Java/C# — kiedy należy rozważyć AOT, jeśli problemem jest inżynieria wsteczna?

text: Długie i krótkie są tak naprawdę w tytule pytania. W przypadku języka, który kompiluje się do języka pośredniego, takiego jak kod bajtowy MSIL lub Java, jeśli istnieją obawy związane z inżynierią wsteczną lub hakowaniem w celu wyłączenia funkcji bezpieczeństwa, czy należy rozważyć kompilację AOT (z wyprzedzeniem), a nie tylko zaciemnianie? Oczywiście w tym pytaniu jest trochę swobody, ponieważ nie ma jednej odpowiedzi, której bym sobie nie wyobrażał, ale kiedy zacząłbyś patrzeć na wykonanie kompilacji AOT przed dystrybucją czegoś, a nie wysyłaniem tego w postaci zaciemnionej? Dla każdego, kto natknie się na to i nie jest zaznajomiony: Wpis w Wikipedii na temat kompilatorów AOT: http://en.wikipedia.org/wiki/AOT_compiler Funkcja kompilatora Mono AOT: http://www.mono-project.com/AOT


title: Jak radzić sobie z konfliktami między programistami w Twoim zespole?

text: Dzieje się tak w każdym zespole. Z jakichś powodów w zespole pojawiają się konflikty, które wpływają na ogólną motywację i produktywność. Jakie jest twoje zalecane podejście do rozwiązania tego powszechnego problemu? _Przykłady_ : * jedna część zespołu chce zaimplementować wstrzykiwanie zależności, druga uważa, że to strata czasu. * niektórzy programiści uważają, że reszta zespołu spowalnia rozwój (co wyjaśnia, dlaczego są spóźnieni) * osobiste niezgodności między jednym lub kilkoma programistami * jeden programista odmawia rozmowy z drugim (bez wyraźnego powodu)


title: Opisz najlepsze środowisko wdrożeniowe, z jakim pracowałeś

text: Test Joela zawiera pytanie: > Czy możesz stworzyć kompilację w jednym kroku? Co jest ważne, ale zastanawiam się, jak usprawnione były niektóre z procesów _wdrażania_? Obowiązuje całe oprogramowanie, od pakowania w folię do sieci: jakie jest najlepsze środowisko wdrożeniowe, z jakim pracowałeś i jakie kroki zostały podjęte?


title: Dlaczego identyfikatory URI przestrzeni nazw XML korzystają ze schematu http?

text: Przestrzeń nazw XML powinna być identyfikatorem URI, ale może używać dowolnego schematu URI, w tym tych, które nie są adresami URL. Dlaczego więc wszystkie powszechnie używane przestrzenie nazw XML używają schematu http (np. `http://www.w3.org/XML/1998/namespace`), biorąc pod uwagę, że próba użycia URI jako adresu URL poprzez pobranie tego dokumentu za pomocą HTTP protokół nie gwarantuje, że zrobi coś użytecznego (a często nie)? Rozumiem przydatność domen DNS w nazwach przestrzeni nazw w celu zagwarantowania unikalności. Ale to nie wymaga schematu http, może istnieć osobny schemat dla tego (coś w stylu `namespace:w3.org/XML/1998/namespace`). Pozwoliłoby to uniknąć pomylenia identyfikatorów URI i adresów URL przy zachowaniu unikalności opartej na domenie.


title: Jak zwiększyć wydajność konstrukcji uniwersalnej?

text: „Konstrukcja uniwersalna” to klasa opakowująca dla obiektu sekwencyjnego, która umożliwia jego linearyzację (silny warunek spójności dla współbieżnych obiektów). Na przykład, oto dostosowana konstrukcja bez oczekiwania w Javie, z [1], która zakłada istnienie kolejki bez oczekiwania, która spełnia wymagania interfejsu `WFQ` (który wymaga tylko jednorazowego konsensusu między wątkami) i zakłada Interfejs `sekwencyjny`: interfejs publiczny WFQ<T> // iteracja "FIFO" { int enqueue(T t); // zwraca numer sekwencyjny t Iterable<T> iterateUntil(int max); // iteruje aż do maksymalnej sekwencji } public interface Sequential { // Zastosuj wywołanie (metoda + argumenty) // i otrzymaj odpowiedź (zwracana wartość + stan) Response apply(Invocation i); } interfejs publiczny Factory<T> { T generate(); } // wygeneruj nowy domyślny obiekt publiczny interfejs Universal extends Sequential {} public class SlowUniversal implementuje Universal { Factory<? rozszerza generator Sequential>; WFQ<Inwokacja> wfq = new WFQ<Inwokacja>(); Universal(Fabryka<? extends Sequential> g) { generator = g; } public Response apply(Inwokacja i) { int max = wfq.enqueue(i); Sekwencyjne s = generator.generate(); for(wywołanie wywołania : wfq.iterateUntil(max)) s.apply(wywołanie); zwrot s.apply(i); } } Ta implementacja nie jest jednak zbyt satysfakcjonująca, ponieważ zakłada determinizm `Sekwencyjnego` i jest naprawdę powolna. Próbowałem dodać recykling pamięci: publiczny interfejs WFQD<T> extends WFQ<T> { T dequeue(int n); } // usuwa kolejkę tylko wtedy, gdy n jest końcem, w przeciwnym razie pomaga innym wątkom publiczny interfejs CopyableSequential extends Sequential { CopyableSequential copy(); } public class RecyclingUniversal implementuje Universal { WFQD<CopyableSequential> wfqd = new WFQD<CopyableSequential>(); Universal(CopyableSequential init) { wfqd.enqueue(init); } public Response apply(Inwokacja i) { int max = wfqd.enqueue(i); CopyableSequential cs = null; int ctr = max; for(CopyableSequential csq : wfq.iterateUntil(max)) if(--max == 0) cs = csq.copy(); wfqd.dequeue(max); zwróć cs.apply(i); } } **Oto moje szczegółowe pytania dotyczące rozszerzenia:** 1. Czy moja implementacja tworzy linearyzowalną, wielowątkową wersję `CopyableSequential`? 2. Czy możliwe jest rozszerzenie recyklingu pamięci bez rozszerzania interfejsu (być może moje nowe metody trywializują problem)? 3. Moja implementacja zmniejsza pamięć tylko po powrocie wątku, więc czy można to wzmocnić? 4. [1] dostarczył implementację dla `WFQ<T>`, a nie `WFQD<T>` \- jednak istnieje, prawda? [1] Herlihy i Shavit, _Sztuka programowania wieloprocesorowego_.


title: Co to jest zanieczyszczenie „używaniem przestrzeni nazw”?

text: Patrzyłem na przewodnik po kodowaniu Google [tutaj] i nie zalecają używania `using namespace lub `namespace:function` - jeśli nie zinterpretowałem tego błędnie. Czy dotyczy to również `std`? `cout<<` nie działa bez niego. Ta książka poleca to samo. Jak więc używać `cout<<` bez `używania przestrzeni nazw std;` lub `std::cout<<`? Jaki jest zalecany sposób? `std::cout<<`? Większość podręczników do c++ uczy początkujących z `używaniem standardowej przestrzeni nazw;` czy propagują one kiepską praktykę kodowania?


title: Kiedy można poświęcić „porządek” projektu, aby wykonać projekt?

text: Kiedy pracujesz nad produktem, który musi być wykonany szybko i działa dobrze, kiedy można poświęcić łatwość konserwacji i „porządek” projektu, aby szybko wykonać zadanie i wyjść z domu? A do jakiego stopnia jest to w porządku, zwłaszcza gdy techniki używane do jego „porządnego” są dla mnie nowe?


title: Wielobranżowy system sprzedaży detalicznej, jak kontrolować ilość towarów dla różnych branż?

text: Obecnie rozwijam oprogramowanie Multi-Branch Retail. Wszystkie gałęzie mają ten sam zestaw elementów. Jednak każdy ma swój własny stan magazynowy. Moje pytanie brzmi, jaka jest najlepsza praktyka do zastosowania w kontroli ilości oddziałów dla towarów? Obecnie myślę o następującym projekcie: Tabela pozycji ======== -Id -Opis Tabela gałęzi ======== -Id -Opis Tabela ilości gałęzi ======== -Id -ItemId (FK do tabeli pozycji) -BranchId (Fk do tabeli gałęzi) -Ilość (zawiera ilość dla określonej pozycji) Czy to dobry projekt? lub jakieś sugestie?


title: Wzorzec komunikacji MVC

text: To jest rodzaj pytania uzupełniającego do tego http://stackoverflow.com/questions/23743285/model-view-controller-and-callbacks, ale chciałem je opublikować osobno, ponieważ jest to rodzaj innego tematu. Pracuję nad wieloosobową grą karcianą na platformę Android. Podzieliłem projekt na MVC, który całkiem dobrze odpowiada potrzebom, ale obecnie utknąłem, ponieważ nie mogę znaleźć dobrego sposobu komunikacji między różnymi częściami. Mam wszystko skonfigurowane i pracujące z kontrolerem będącym dużą maszyną stanową, która jest wywoływana w kółko z pętli gry i wywołuje metody pobierające z GUI i części z systemem Android/sieci, aby uzyskać dane wejściowe. Wejście w GUI i sieci jest ustawiane przez inputlisteners, który ustawia zmienną lokalną, którą czytam w metodzie getter. Jak dotąd tak dobrze, to działa. Ale mój problem polega na tym, że kontroler musi sprawdzać każde wejście osobno, więc jeśli chcę dodać wejście, muszę sprawdzić, w których stanach jest on prawidłowy i wywołać metodę pobierającą ze wszystkich tych stanów. To nie jest dobre i sprawia, że kod wygląda dość brzydko, czyni dodatki niewygodnymi i dodaje nadmiarowości. Więc to, co otrzymałem z pytania, o którym wspomniałem powyżej, jest takie, że jakiś wzorzec polecenia lub zdarzenia będzie pasował do moich potrzeb. To, co chcę zrobić, to utworzyć w kontrolerze współdzieloną i bezpieczną wątkowo kolejkę i zamiast wywoływać wszystkie te metody pobierające, po prostu sprawdzam kolejkę pod kątem nowych danych wejściowych i kontynuuję. Z drugiej strony, GUI i sieć nie mają wszystkich tych pobierających, ale zamiast tego tworzą zdarzenie lub polecenie i wysyłają je do kontrolera przez, na przykład, obserwatora/obserwabilnego. Teraz mój problem: nie potrafię wymyślić sposobu, aby te polecenia/zdarzenia pasowały do wspólnego interfejsu (który może przechowywać kolejka) i nadal transportowały różne rodzaje danych (kliknięcia przycisków, zagrane karty, identyfikator gracza pochodzi polecenie, dane synchronizacji itp.). Jeśli projektuję komunikację jako wzorzec poleceń, muszę umieścić w nim wszystkie informacje potrzebne do wykonania polecenia po jego utworzeniu, jest to niemożliwe, ponieważ GUI lub sieć nie mają wiedzy o wszystkich rzeczach, które kontroler potrzebuje do wykonania rzeczy, które należy to zrobić, gdy na przykład zostanie zagrana karta. Myślałem o wprowadzeniu tych rzeczy do polecenia podczas jego wykonywania. Ale w przypadku wszystkich różnych poleceń, które mam, potrzebowałbym wszystkich informacji, które posiada kontroler, a zatem nadałbym poleceniu odniesienie do kontrolera, które upubliczniłoby wszystko w nim, co, jak sądzę, jest naprawdę złym projektem. Mogę więc wypróbować jakiś wzorzec zdarzeń. Mam do przewiezienia dane w zdarzeniu. Tak jak w przypadku polecenia, miałbym interfejs, który łączy wszystkie zdarzenia i który może być przechowywany w kolejce współdzielonej. Mógłbym utworzyć duże wyliczenie ze wszystkimi możliwymi zdarzeniami, zapisać jedno z tych wyliczeń w rzeczywistym zdarzeniu i zbudować dużą skrzynkę przełączników dla zdarzeń, aby przeprowadzić różne rzeczy dla różnych zdarzeń. Problem tutaj: mam różne dane dla wszystkich wydarzeń. Ale potrzebuję wspólnego interfejsu do przechowywania zdarzeń w kolejce. Jak uzyskać konkretne dane, jeśli mogę uzyskać dostęp do wydarzenia tylko przez interfejs? Nawet jeśli nie byłby to problem, tworzę kolejny duży przypadek przełącznika, który wygląda brzydko, a kiedy chcę dodać nowe zdarzenie, muszę utworzyć samo zdarzenie, sprawę, wyliczenie i metodę to się nazywa z danymi. Mógłbym oczywiście sprawdzić zdarzenie za pomocą enum i rzucić je na jego typ, dzięki czemu mogę wywołać metody specyficzne dla typu zdarzenia, które dostarczają mi potrzebnych danych, ale to też wygląda na zły projekt.


title: Czy istnieje alternatywa dla terminu „wywołujący obiekt”?

text: Załóżmy, że masz zdefiniowaną klasę (w pseudokodzie): class Puppy { // ... string sound = "Rawr!"; void bark() { print(dźwięk); } } I powiedzmy, że biorąc pod uwagę instancję `Puppy`, wywołujesz ją metodą `bark()`: int main() { Puppy p; p.kora(); } Zauważ, jak `bark()` używa zmiennej składowej `sound`. W wielu kontekstach widziałem, jak ludzie opisują „dźwięk” jako zmienną składową „obiektu wywołującego”. Moje pytanie brzmi: jaki jest lepszy termin niż „wywołanie obiektu”? Dla mnie obiekt nie wykonuje żadnego wywołania. Wiemy, że funkcje składowe są w pewnym sensie po prostu funkcjami z niejawnym parametrem `this` lub `self`. Wymyśliłem „obiekt odbierający” lub „odbiorca wiadomości”, co ma sens, jeśli nie zgadzasz się z paradygmatem „przesyłania wiadomości”. Czy któryś z was szczęśliwych hakerów ma określenie, którego lubicie używać? Uważam, że powinno to oznaczać „obiekt, na którym wywoływana jest metoda”, a TOUWAMIC po prostu tego nie wycina. Jeśli chodzi o to, kto jest "rozmówcą", powiedziałbym, że `main` tworzy instancję obiektu Puppy i wywołuje jego metodę `bark()`.


title: Jak stworzyć aplikację przy użyciu aparatu telefonu komórkowego do wykrywania słów?

text: Staram się stworzyć aplikację, która przechwyci wideo z kamery telefonu i wykryje w czasie rzeczywistym cały tekst, który zostanie przechwycony. Chciałbym to zrobić w C# (dla np. Windows Mobile), ale mogę też spróbować zrobić to w Javie (dla np. Androida). Czy ktoś może mi pomóc, jak mogę z tym zacząć?


title: Czy ktoś może mi wyjaśnić konwencję kodowania C#?

text: Niedawno zacząłem pracować z Unity3D i głównie pisać skrypty w C#. Ponieważ zwykle programuję w Javie, różnice nie są zbyt duże, ale mimo to odniosłem się do szybkiego kursu, aby upewnić się, że jestem na dobrej drodze. Jednak moją największą ciekawostką dotyczącą C# jest to, że pierwsze litery nazw metod są pisane wielką literą (np. java: getPrime() C#: GetPrime() aka: Pascal Case?). Czy jest ku temu dobry powód? Rozumiem ze strony kursu awaryjnego, że przeczytałem, że najwyraźniej jest to konwencja dla .Net i nie mam możliwości, aby kiedykolwiek to zmienić, ale jestem ciekaw, dlaczego zrobiono to w ten sposób, w przeciwieństwie do normalnego (względnego?) przypadku wielbłąda że, powiedzmy, używa Java. Uwaga: Rozumiem, że języki mają swoje własne konwencje kodowania (wszystkie metody Pythona są pisane małymi literami, co ma również zastosowanie w tym pytaniu), ale nigdy tak naprawdę nie zrozumiałem, dlaczego nie jest to sformalizowane w standardzie.


title: Dlaczego w niektórych wersjach Planning Pokera jest 20, a nie 21?

text: W Planning Poker karty zwykle zawierają liczby ciągu Fibonacciego, czyli 0,1,1,2,3,5,8,13,21,34,55 itd. Możesz jednak zobaczyć na stronie Wikipedii (i to zostało potwierdzone przez ludzi, którzy pracują na kilku stanowiskach, gdzie stosowany jest Planning Poker) w niektórych edycjach karty odchodzą od sekwencji Fibonacciego po 13. Obniżają się z 21 do 20, a następnie kontynuują z 40 i 100. Czy jest jakieś uzasadnienie dlaczego te wartości zostały zmienione, a konkretnie 21 na 20? (Zwróć też uwagę, że dodano kilka innych kart, takich jak ? i 1/2, ale są one dla mnie łatwiejsze do zrozumienia w porównaniu do zmiany 21 -> 20).


title: Problem z projektowaniem klas

text: Jestem nowicjuszem w programowaniu obiektowym i często wpadam w zakłopotanie w sytuacjach podobnych do tego przykładu: Zadanie: Wygeneruj dokument XML zawierający informacje o osobie. Załóżmy, że informacje są łatwo dostępne w bazie danych. Oto przykład struktury: <Osoba> <Imię>Jan Kowalski</Imię> <Age>21</Age> <Adres> <Ulica>100 Główna ulica</Ulica> <Miasto>Sylwania</City> <Stan>OH</Stan> </Address> <Krewni> <Rodzice> <Mama> <Imię>Jana Kowalski</Imię> </Mama> <Ojciec> <Nazwisko>Jan Kowalski Senior</Imię> </ Ojciec> </Rodzice> <Rodzeństwo> <Brother> <Name>Jeff Doe</Name> </Brother> <Brother> <Name>Steven Doe</Name> </Brother> </Rodzeństwo> </Krewni> < /Person> * Ok, stwórzmy klasę dla każdego znacznika (tj: Osoba, Imię, Wiek, Adres) Załóżmy, że każda klasa jest odpowiedzialna tylko za siebie i za elementy bezpośrednio zawarte * Każda klasa będzie wiedziała (zdefiniowane przez defau lt) klasy, które są w nich bezpośrednio zawarte * Każda klasa będzie miała funkcję process(), która doda siebie i swoje dzieci do tworzonego przez nas dokumentu XML * Kiedy dziecko zostanie narysowane, jak w poprzednim wierszu, będziemy mieli wywołują również process() * Teraz jesteśmy w pętli rekurencyjnej, w której każdy obiekt rysuje swoje dzieci, dopóki wszystkie nie zostaną narysowane * Ale co, jeśli tylko niektóre znaczniki muszą zostać narysowane, a reszta jest opcjonalna? Niektóre są opcjonalne w zależności od tego, czy dane istnieją (jeśli je mamy, musimy je narysować), a niektóre są opcjonalne w oparciu o preferencje użytkownika generującego dokument * W jaki sposób upewniamy się, że każdy obiekt ma dane potrzebne do narysowania siebie i jego dzieci? Możemy przekazać ogromną tablicę przez każdy obiekt, ale to wydaje się gówniane, prawda? Moglibyśmy poprosić o to, aby każdy obiekt wysyłał zapytanie do bazy danych, ale jest to wiele zapytań, a skąd on wie, jakie jest jego zapytanie? * A jeśli chcemy później pozbyć się tagu? Nie sposób się do nich odnieść. Myślałem o tym już od 20 godzin. Czuję, że źle rozumiem zasadę projektowania lub po prostu podchodzę do tego wszystkiego źle. Jak byś zabrał się do programowania czegoś takiego? Przypuszczam, że ten problem może dotyczyć dowolnego scenariusza, w którym istnieją klasy, które tworzą inne klasy, ale utworzone klasy potrzebują informacji do uruchomienia. Jak przekazać im informacje w sposób, który nie wydaje się bałaganiarski?


title: Jak uniknąć zajętej pętli wewnątrz funkcji, która zwraca obiekt, na który oczekiwano?

text: Mam funkcję, która ma taki sam interfejs jak wbudowane w Pythonie `input`, ale działa w środowisku klient-serwer. Po wywołaniu funkcja, która działa na serwerze, wysyła komunikat do klienta, prosząc go o uzyskanie danych wejściowych od użytkownika. Użytkownik wprowadza coś lub odrzuca monit, a wynik jest przekazywany z powrotem do serwera, który przekazuje go do funkcji. Funkcja następnie zwraca wynik. Funkcja musi działać jak `input` w Pythonie [to jest specyfikacja], więc musi się blokować aż do uzyskania wyniku. To wszystko działa, ale wykorzystuje zajętą pętlę, która w praktyce może z łatwością kręcić się przez wiele minut. Obecnie funkcja mówi klientowi, aby otrzymał dane wejściowe, przekazując identyfikator. Klient zwraca wynik z identyfikatorem. Serwer umieszcza wynik w słowniku, z id jako kluczem. Funkcja w zasadzie czeka na istnienie tego klucza. def input(): '''uproszczony przykład''' key = unique_key() tell_client_to_get_input(key) while key not in dictionary: pass return dictionary.pop(pin) Użycie wywołania zwrotnego byłoby normalnym sposobem, ale ` Funkcja input` musi się blokować, dopóki wynik nie będzie dostępny, więc nie widzę, jak to może działać. Specyfikacja nie może się zmienić, ponieważ Python będzie używał nowej funkcji `input` dla rzeczy takich jak `help` i `pdb`, które dostarczają swoje własne małe REPL. Mam dużą elastyczność, jeśli chodzi o to, jak wszystko działa ogólnie, ale po prostu nie mogę ruszyć z funkcją działającą dokładnie tak, jak w Pythonie. Czy istnieje sposób na zwrócenie wyniku, gdy tylko będzie dostępny, bez pętli zajętości?


title: Jak PHP zarządza pamięcią w tym przypadku?

text: Mam **bardzo** podstawowe pytanie, więc przepraszam, jeśli to nie jest na to miejsce. Jeśli mam plik "config.php" z jakąś konfiguracją w jakichś zmiennych i na jakiejś stronie załączam ten plik, to za każdym razem zmienne będą ponownie ładowane do pamięci serwera? Myślę, że odpowiedź brzmi tak, ale nie jestem pewien, nie wiem zbyt wiele o cyklu życia PHP. Nie wiem, czy wyraziłem się jasno, więc oto przykład. Załóżmy, że mam plik config.php jako: <?php $databaseConfig = array(); /* Ustawia konfiguracje wewnątrz tablicy */ ?> Następnie moja strona index.php zawiera plik config.php. Za każdym razem, gdy indeks jest ładowany, tablica $databaseConfig będzie ładowana do pamięci lub tylko za pierwszym razem, więc gdy strona zostanie ponownie zażądana, nie trzeba jej ponownie ładować? Naprawdę myślę, że skoro PHP jest bezstanowe, za każdym razem ładuje się ponownie. Z góry bardzo dziękuję!


title: Jak dopasować odpowiedzi z serwera do odpowiadających im żądań?

text: Istnieje serwer, który odpowiada na żądania w gnieździe. Klient ma funkcje do emitowania żądań i funkcje do obsługi odpowiedzi z serwera. Problem polega na tym, że funkcja wysyłania żądań i funkcja obsługi odpowiedzi to dwie niepowiązane ze sobą funkcje. Biorąc pod uwagę odpowiedź serwera X, skąd mam wiedzieć, czy jest to odpowiedź na żądanie X, czy na inne żądanie Y? Chciałbym stworzyć konstrukcję, która zapewni, że odpowiedź X jest zdecydowanie odpowiedzią na żądanie X, a także utworzyć funkcję requestX(), która zwraca odpowiedź X, a nie inną odpowiedź Y. To pytanie dotyczy głównie ogólnego podejścia do programowania i nie o żadnej konkretnej konstrukcji językowej. Najlepiej jednak, aby odpowiedź obejmowała Rubiego, gniazda TCP i PHP. Mój kod do tej pory: wymagaj klasy 'socket' TheConnection def initialize(config) @config = config end def send(s) toConsole("--> #{s}") @conn.send "#{s}\n" , 0 end def connect() # Połącz z serwerem begin @conn = TCPSocket.open(@config['server'], @config['port']) rescue Interrupt rescue Exception => detail toConsole('Exception: ' + detail.message()) print detail.backtrace.join('\n') retry end end def getSpecificAnswer(input) send "GET #{input}" end def handle_server_input(s) case s.strip when /^Hello. (.*)$/i toConsole "[ Serwer wita się ]" send "Witaj też! #{$1}" else toConsole(s) end end def main_loop() while true ready = select([@conn, $stdin ], nil, nil, nil) next if !ready for s in ready[0] if s == $stdin then return if $stdin.eof s = $stdin.gets send s elsif s == @conn then return if @ conn.eof s = @conn.gets handle_server_input(s) end end end end def toConsole(msg) t = Time.new puts t.strftime("[%H:%M:%S]") + ' ' + msg end end @config = Hash[ 'server'=>'test.server.com', 'port'=>'2020' ] $conn = TheConnection.new(@config) $conn.connect() $conn.getSpecificAnswer('itemsX') begin $conn.main_loop() rescue Wyjątek ratunkowy przerwania => szczegóły $conn.toConsole('Wyjątek: ' + szczegóły .message()) drukuj szczegóły.backtrace.join('\n') ponów próbę koniec


title: System punktacji względnej – jak rozwiązać ten problem?

text: Próbuję przypisać wyniki do specyfikacji telefonu, aby obliczyć końcową ocenę dla każdego telefonu. Kiedy jednak oceniałem punkty na podstawie megapikseli, odkryłem, że jeden z telefonów „A” ma aparat 41 MP. Ale wszystkie inne telefony mają 8 MP lub mniej, co jest całkiem dobre dla telefonu. W tej chwili, kiedy oceniam względnie telefon A (ocena 5/5), wszystkie inne telefony uzyskują wynik 1 lub 2 na 5. Chciałbym, aby było to trochę bardziej sprawiedliwe, ponieważ był to tylko jeden telefon z bardzo wysoka wartość. Czy możesz mi zasugerować najlepszy sposób rozwiązania tego problemu, w którym względna ocena jest bardziej sprawiedliwa?


title: Jak radzić sobie z dużymi zmianami w specyfikacji danych?

text: Mamy program w C, który używa pliku nagłówkowego .h do opisania niestandardowej struktury danych, której używamy. Struktura danych musi być zgodna z projektem w specyfikacji funkcjonalnej. Istnieje pewien diagram opisujący element składowy struktur danych i byłby on opisany jako abstrakcyjna składnia ANS.1, a następnie plik asn zostałby skompilowany do pliku nagłówkowego .h. W celu usprawnienia naszego systemu zatwierdzono prośbę o zmianę specyfikacji funkcjonalnej i sporządzono nową specyfikację. (Przeskoczyliśmy z 2.10 do 2.12, ponieważ pominęliśmy aktualizację 2.11) Porównując 2.10 do 2.12, wiele nowych rzeczy zostało dodanych, a niektóre stare zostały usunięte. Musimy użyć nowego .asn do skompilowania nowego pliku nagłówkowego .h zgodnie ze specyfikacją. Problem w tym, że usunięto coś przydatnego. Na przykład niektóre elementy struktury danych zostały usunięte i używaliśmy tego elementu do logiki w programie. Programu nie można nawet skompilować z nowym plikiem nagłówkowym. Program już działa i chcielibyśmy uniknąć poważnych przestojów spowodowanych tą aktualizacją. PS Specyfikacja nie tylko dla naszej firmy, jest standardem dla struktury plików przesyłanych pomiędzy firmami z całej branży. Powiedzmy, że jeśli ktoś zadeklaruje użycie specyfikacji 2.12, a druga strona potraktuje plik ze standardem 2.12 i odrzuci wszystkie pliki, które nie są zgodne ze standardem. PS Oczywiście nie ma opcji. Decyzja zapadła. Mam jednak problem, że program w c został napisany przez kilka innych osób i ma złożoną logikę. Program zostałby poważnie uszkodzony przez zmianę pliku nagłówkowego. I może nie mam pojęcia, jak przywrócić mu spokój i funkcjonalność. Wszelkie sugestie, jak sprawdzić każdą różnicę, są mile widziane.


title: Czy warto mieć autorów technicznych w zespole programistycznym?

text: Podczas mojej 5-letniej pracy w IT jako programista zauważyłem, że programiści mają silną niechęć do robienia jakiejkolwiek dokumentacji. Robienie zrzutów ekranu i tworzenie dokumentacji wydaje się być bolesnym i czasochłonnym doświadczeniem. W jednej firmie, dla której pracowałem, mieliśmy zespół dokumentacji technicznej z dwoma autorami technicznymi, którzy opracowali wszystkie podręczniki użytkownika dla naszych klientów. W innych firmach, w których sugerowałem zatrudnienie autora technicznego, powiedziano mi, że nie są warte swojej ceny, ale nie jestem pewien, czy to brzmi prawdziwie. Czy lepiej, aby programiści przestali kodować i poświęcili pół dnia na zrobienie zrzutów ekranu i stworzenie różnych przewodników, czy warto zatrudnić kogoś, kto zajmuje się takimi zadaniami?


title: Dlaczego F# ma tryb interaktywny, ale nie C#?

text: F# wychodzi z pudełka z interaktywną REPL. C# nie ma nic podobnego i w rzeczywistości jest trochę trudny do zabawy bez konfigurowania pełnego projektu (chociaż LINQpad działa i jest również możliwy do zrobienia za pomocą powershell). Czy jest coś zasadniczo innego w językach, które umożliwiają F# korzystanie z konsoli interaktywnej, ale utrudniają jej implementację w języku C#? **Edytuj** Ponieważ wiele lat później ludzie wciąż zadają to pytanie, powinienem zauważyć, że teraz jest wiele opcji. Możesz użyć powershella (preinstalowanego na każdym nowoczesnym komputerze z systemem Windows) do zabawy z frameworkiem .Net. Możesz też użyć LINQpad do prototypowania dowolnego kodu w języku c#. Możesz też użyć ScriptCs lub możesz użyć internetowego środowiska typu jsfiddle, takiego jak Complify.net lub Jsil. Wiele opcji.


title: Zalecenia dotyczące komponentów .NET, które obsługują i ulepszają pliki TIFF

text: Obecnie szukam składnika .NET, który spełnia następujące wymagania. * Pliki TIFF * Wyodrębnianie pojedynczych stron jako obrazów * Zapisywanie obrazów do nowych plików TIFF * Obsługa kolorowych plików TIFF/obrazów * Ulepszanie plików TIFF (konieczne jest usuwanie przekrzywienia, usuwanie plam itp. opcjonalnie) * Wdrażanie bez opłat na serwerach * W pełni niezależne od architektury ( tylko jeden montaż dla x64/x86) Odkryłem, że Libtiff.Net jest w stanie obsłużyć pliki tiff, ale API jest nadal bardzo złożone i nie może poprawić plików. Aby ulepszyć, wypróbowuję AForge.NET(http://www.aforgenet.com/), ale jego filtry wymagają konwersji obrazów do określonych formatów pikseli w zależności od operacji.


title: Różnica szybkości między kodem opartym na maszynie wirtualnej a skompilowanym

text: Nie tak dawno temu starszy pracownik naukowy powiedział mi, że w dzisiejszych czasach kod oparty na maszynach wirtualnych może działać prawie tak szybko, jak kod skompilowany, ale z własnego doświadczenia wiem, że skompilowany kod działa kilka rzędów szybciej. Opiera się to na kodzie, który próbuje zrobić to samo (przetwarzając bardzo duży plik XML) - w przypadku kodu opartego na maszynach wirtualnych (Groovy) mój kod byłby ukończony za około dwa lata (poprawnie), podczas gdy C/C++ oparta alternatywa zajęła około trzech godzin. Algorytmy nie były takie same - ale to dlatego, że użycie C/C++ pozwoliło mi manipulować pamięcią na poziomie bajtów za pomocą wskaźników. Kod Groovy'ego był łatwiejszy do napisania, ponieważ język był znacznie bardziej wyrazisty, ale zapłaconą ceną było powolne wykonanie. Nie twierdzę, że jestem najlepszym programistą na świecie, więc chętnie zaakceptowałbym, że mój kod można było poprawić: ale jaki jest ogólny pogląd?


title: Jak wyjaśnić mojemu szefowi, co oznacza „maszyna wirtualna”?

text: Najprawdopodobniej mój szef przez całe życie nie napisał ani jednego słowa na klawiaturze. Widział komputery i ma telefon komórkowy. To mądry człowiek. **Jak mam mu wytłumaczyć, co to jest 'maszyna wirtualna'?** (VM jak w VMWare + wirtualny Box, nie VM jak w Javie, LLVM, .NET) Jednym z powodów, dla których o to pytam jest to, że chcę powiedzieć mu, że posiadanie maszyny wirtualnej z systemem Linux do łączenia się z Internetem za pomocą hosta z systemem Windows jest bezpieczniejsze niż łączenie się bezpośrednio z systemem Windows.


title: Współpracownik zmienił nazwy wszystkich moich zapytań

text: Nie wiem, czy powinnam być bardzo zirytowana, czy co. Samodzielnie zbudowałem ponad 300 zapytań dla dużej bazy danych i opracowałem konwencję nazewnictwa, aby móc je później znaleźć. Nikt inny w moim biurze nawet nie wie, jak zbudować zapytanie, ale przyszedłem wczoraj i dowiedziałem się, że wszystkie zostały zmienione. Teraz bardzo trudno mi znaleźć rzeczy i próbuję wymyślić, co zrobić. Rozmawiałem z osobą odpowiedzialną, a ona po prostu zbagatelizowała całą sprawę. Powiedziała, że zmieniła ich nazwy, aby łatwiej je znaleźć. Niestety jestem jedynym, który wie, jak je budować, edytować i utrzymywać, a jedynym powodem, dla którego musiała je znaleźć, było przetestowanie zapytań. Nowa konwencja nazewnictwa w ogóle nie ma sensu i wydaje mi się, że zrobiliśmy krok wstecz w procesie tworzenia. To, co próbuję rozgryźć, to: 1) Czy przesadzam? 2) Jak najlepiej sobie z tym poradzić? Nienawidzę wspominać o tym mojej szefowej, ale po wczorajszej rozmowie z moją współpracowniczką już wiem, że czuje, jakby nie zrobiła nic złego.


title: Kolejność tematu i modyfikatorów w nazwach zmiennych

text: Poszukuję doświadczeń dotyczących porządkowania tematu i modyfikatorów w nazwach zmiennych. Prosty obiekt `Shape` miałby tylko temat nazwy zmiennej, taki jak `Area`. Nieco bardziej złożony przypadek „Sfera”, który ma ścianę, będzie miał „objętość wewnętrzną” i „objętość zewnętrzną”, i tutaj pojawia się moje pytanie. Co jest preferowane między _Modyfikator-Temat_ a _Subject-Modifier_? Jako przykładowy zestaw: class Containers_Modifier_Subject { AreaAdjustmentFactor WallThickness Height Length Width AdjustedArea SurfaceAreaInner SurfaceAreaOuter LongWallArea ShortWallArea TopArea InnerVolume OuterVolume } class Containers_Subject_Modifier { AreaAdjustmentFactorInner Area Obszar WallThickness Wysokość Length AreaSpyt. podobne do przykładów. W obiekcie było wystarczająco dużo zmiennych, aby tylko część wyświetlała się w oknie wyprzedzenia / wyszukiwania kodu z IDE. Chcę mieć pewność, że każdy przyszły programista zostanie szybko doprowadzony do właściwej zmiennej, której będzie szukał, bez konieczności przewijania okna wyszukiwania w górę i w dół. W moim przypadku szukałem całkowitej powierzchni, ale współczynnik powierzchni i skorygowane wartości powierzchni pojawiły się jako pierwsze. Spójność w nazewnictwie jako standardu kodu jest oczywista. Które podejście do nazewnictwa było: * najłatwiejsze w utrzymaniu? * bardziej zrozumiałe? * poprawne semantycznie? * tj. jak dobrze nazwa zmiennej pasuje do obiektu biznesowego i jak dobrze nazwa zmiennej wpływa na rozmowy o rozwiązywanym problemie? * sprzyja używaniu funkcji wyszukiwania kodu, takich jak Intellisense lub różne konstrukcje oparte na Eclipse?


title: Czy powinienem reprezentować przypadki specjalne (takie jak błędy/wyjątki) na diagramach UML?

text: Załóżmy, że piszesz program, który po uruchomieniu odczytuje swój plik konfiguracyjny, aby wiedzieć, które moduły należy uruchomić itp. Jeśli tego pliku konfiguracyjnego brakuje, prawdopodobnie pojawi się błąd. Jest to ważna sytuacja, z którą należy się zawsze uporać. Czytałem kiedyś statystykę, która mówiła, że około 70% kodu w typowym programie ma zajmować się przypadkami narożnymi (np. sprawdź, czy nie brakuje pliku, złap wyjątek, sprawdź, czy nie dzielę przez 0, sprawdź, czy wiek osoby jest liczbą dodatnią itd.). Nie wierzę, że to (tj. twierdzenie 70%) jest bardzo dokładne, ale z drugiej strony wiele kodu, który piszę, zawiera wiele „jeśli” sprawdzających prawidłowe parametry i tym podobne. Wątpię, czy tylko ja to robię. Więc ta statystyka ma w sobie trochę prawdy. Jeśli duża część kodu programu jest reprezentowana przez te sprawdzenia, to czy przypadki te nie powinny być reprezentowane na diagramach UML? (jak diagramy sekwencji itp.). Nie pamiętam, czy kiedykolwiek widziałem takie rzeczy. Czy powinienem je uwzględnić w moich diagramach? Czy to oświeci lub przeszkodzi/zdezorientuje innego programistę, który patrzy na te diagramy? Czy diagramy stałyby się z tego powodu zbyt duże?


title: Czego potrzebujesz od klienta, aby stworzyć stronę?

text: Próbuję dowiedzieć się, czego programista potrzebuje od klienta, aby stworzyć stronę internetową. Jest to skomplikowana witryna oparta na bazie danych. Jak powinny wyglądać informacje? Czy powinienem układać strony w stylu Photoshopa z adnotacjami? Czy to wszystko powinno być napisane. Czy jest na to standardowy sposób? Muszę jasno wyjaśnić programiście, co chcę zrobić na mojej stronie. Pomoc!


title: W zależności od ustalonej wersji biblioteki i zignoruj jej aktualizacje

text: Rozmawiałem wczoraj z szefem technicznym. Chodzi o projekt w C++, który zależy od opencv, a on chciał włączyć konkretną wersję opencv do svn i nadal używać tej wersji, ignorując wszelkie aktualizacje, z którymi się nie zgadzałem. Odbyliśmy ożywioną dyskusję na ten temat. Jego argumenty: 1. Wszystko musi być dostarczone w jednym pakiecie i nie możemy prosić klienta o instalowanie zewnętrznych bibliotek. 2. Zależymy od stałej wersji, aby nowe aktualizacje opencv nie zepsuły naszego kodu. 3. Nie możemy zagwarantować, że w ramach aktualizacji wersji, np. z 3.2.buildx do 3.2.buildy. 4. Zbuduj sygnatury funkcji nie zmienią się. Moje argumenty: 1. Co prawda wszystko musi być dostarczone klientowi jako jeden pakiet, ale do tego służą skrypty do budowania. Pobierają zewnętrzne biblioteki i tworzą pakiet. 2. W ramach aktualizacji tej samej wersji 3.2.buildx do 3.2.buildy zmiana sygnatury jest niemożliwa, chyba że jest to naprawdę kiepski framework, co nie ma miejsca w przypadku opencv. 3. Pozbawiamy się nowych aktualizacji i funkcji tej biblioteki. 4. Jeśli w wersji, którą wzięliśmy, jest błąd, a nawet jeśli zostanie naprawiony później, nie będziemy mogli go naprawić. 5. Jest po prostu nieefektywny i antyprojektowy, aby polegać na określonej wersji/kompilacji zewnętrznej biblioteki, ponieważ utrudnia to naszemu projektowi przystosowanie się do nowych zmian w przyszłości. Więc chciałbym wiedzieć, co myślicie. Czy naprawdę ma sens dołączanie określonej wersji zewnętrznej biblioteki do naszego svn i używanie jej, ignorując wszystkie aktualizacje?


title: Pytanie dotyczące wskazówek dla początkujących WINAPI

text: Uczę się tworzyć aplikacje pod Windows używając WINAPI i zwykłego C. Teraz trochę się pomyliłem z tymi wszystkimi uchwytami i chciałbym zapytać, czy moglibyście nauczyć mnie kilku dobrych praktyk dotyczących struktury i obsługi kontrolek i okien. Tutaj się mylę: Używając identyfikatorów zadeklarowanych w zasobach dla każdego obiektu, możemy uzyskać ich uchwyty za pomocą GetDlgItem(). A co jeśli nie znamy ich rodzica, który jest potrzebny tej funkcji. Jeden przykład: podczas uruchamiania mamy utworzone główne okno. Następnie rejestrujemy dwie nowe klasy okien i tworzymy okno dla każdej nowej klasy, a także tworzymy funkcję wiadomości dla każdej z nich. Teraz, jeśli w jednym z okien potomnych stworzę przycisk, a w drugim oknie potomnym utworzę etykietę tekstową. Teraz, gdy klikniemy przycisk wewnątrz okna potomnego A, etykieta w oknie potomnym B zostanie zmieniona na cokolwiek. Polecenie WM_COMMAND dla przycisku jest interpretowane wewnątrz pętli komunikatów okna potomnego A. Jaki byłby najlepszy i bardziej elegancki sposób uzyskania dostępu do etykiety tekstowej w oknie potomnym B? Jestem w trakcie uczenia się WINAPI i po prostu chcę nauczyć się go od samego początku, zamiast tworzyć zhakowany kod, który pewnego dnia stanie się nieczytelny i później będzie musiał dostosować się do nowego sposobu programowania. * * * Czy naprawdę nikt nie jest w stanie udzielić mi porady?


title: Testowanie logiki kontrolera korzystającego bezpośrednio z ISession

text: Właśnie przeczytałem ten wpis na blogu Jimmy'ego Bogarda i przyciągnął mnie ten komentarz. > Spada to wtedy, gdy komponent nie obsługuje danego > warstw/architektury. Ale nawet z NHibernate, po prostu używam ISession > bezpośrednio w akcji kontrolera. Po co komplikować sprawy? Następnie skomentowałem post i zadałem to pytanie:- ![moje pytanie do Jimmy'ego](http://i.stack.imgur.com/BCr01.jpg) Moje pytanie brzmi, jakie opcje miałbyś testować logikę kontrolera * *JEŚLI** nie wyśmiewasz sesji NHibernate ISession. Jestem ciekaw, jakie mamy opcje, jeśli korzystamy z ISession bezpośrednio na kontrolerze?


title: Praca domowa dla silnych programistów C++ uczących się języka Java

text: Mam za zadanie prowadzić przyspieszony uniwersytecki kurs tematyczny w języku Java dla programistów z wieloletnim doświadczeniem w C/C++. Jakie zadania o średniej długości (maksymalnie 1-2 godziny), które ćwiczą podstawowe umiejętności ucznia w języku Java, nie wyglądając na zadanie, które można by zlecić osobie uczącej się Javy jako pierwszego języka? (Chodzi o to, aby zastanowić się nad różnicą między Javą a C++, a nie obrażać studenta ogólnie śmiesznie prostym programowaniem.) Aby wyjaśnić, cały kurs nie trwa 1-2 godziny - będą to 4 godziny na pierwszym dzień i 7 godzin drugiego i trzeciego dnia przez dwa tygodnie, przy łącznej liczbie godzin kontaktu 36 godzin. Jest to porównywalne do liczby godzin standardowego kursu w college'u, tylko dramatycznie skompresowane.


title: Opracowywanie książki o programowaniu zespołowym?

text: > **Po pierwsze:** jeśli to działa w projektach open source, dlaczego nie w książkach? **Wspólne pisanie** nie jest niczym nowym. Rzadko jednak zdarza się to w dziedzinie programowania. **Ważne aspekty, które wymagają Twoich cennych danych wejściowych:** * **Inwestycja:** Czy na etapach rozwoju będą potrzebne inwestycje innego rodzaju niż _Czas_? * **Istniejące platformy:** czy są jakieś istniejące platformy, które najlepiej sobie z tym poradzą? Takich jak zintegrowana kontrola wersji online, wiki, CMS? * **Istniejące projekty:** Gdzie możemy znaleźć takie projekty? (Zakłada, że istnieje już wiele) * **Popularność:** Dlaczego nie widzimy zbyt wielu takich prac? (Odnosząc się konkretnie do aspektu tworzenia książek o programowaniu opartym na współpracy online. Oczywiste jest, że pisanie jakiejkolwiek książki wymaga dużego wysiłku z wieloma pośrednimi lub uznanymi współpracownikami, edytorami odniesień itp.) (Właściwie nie mogłem znaleźć wiele .WEBOOK nie ma t programowanie) * **Przeszkody w programowaniu:** Jakie są przeszkody, gdy mówimy o aspektach programowania, które sprawiają, że jest to trudne do osiągnięcia? * **Rozszerzenie do SE/SO:** Czy coś takiego można dodać jako rozszerzenie do SE/SO? Uczestnicy społeczności już publikują swoje cenne odpowiedzi na pytania. Tutaj śledziliby bardziej uproszczony zestaw postów zgodnie z styl/wizja. * **Reklama:** Czy można bezpiecznie założyć, że SO/SE może najlepiej służyć jako siła napędowa przynosząca właściwe światło, zainteresowanie doświadczonych profesjonalistów, którzy mogą wnieść swoją wiedzę? * **Marketing:** Jaki byłby najlepszy sposób na uzyskanie rozgłosu i utalentowanych ludzi, którzy przyczyniliby się do tego? Czy GIT/source forge zadziała, ponieważ jest to w zasadzie pisanie książek? > **Ostatnie:** Jak Twoim zdaniem taka książka zostałaby odebrana? * * * **Użyteczne miejsca** 1. **Ogólne przeszkody:** Świetny zestaw pułapek, przeszkód w ogólnym wspólnym pisaniu (oprócz technicznych wymienionych na wiki) Nie chcę dyskutować ani wspominać o tych tutaj, do których odsyłam bezpośrednio do odpowiedzi. 2. **Trendy:** Wspólne pisanie online: jak blogi i wiki zmieniają akademicki proces publikowania 3. **Kroki sukcesu:** Klucze do udanego wspólnego pisania 4. **Wskazówki:** Przydatne wskazówki dotyczące współpracy Pisanie w Dokumentach Google i Witrynach Google * * * **Moje zainteresowanie tym tematem:** Ostatnio po zetknięciu się z wzorcami projektowymi typu „head first” ciężko było mi znaleźć książkę typu „head first” o strukturach danych i algorytmach, a nawet zajrzeli na ich fora (O'Riley) i nie dano zbyt wiele światła na ten temat, mimo że wielu ludzi o to prosiło. Moim jedynym złym domysłem jest to, że nikt nie był człowiekiem (programistą / kompetentnym) na tyle, aby pisać o tym w ich stylu (bez obrazy dla nikogo). Co doprowadziło mnie do pomysłu wspólnego pisania i ku mojemu zdziwieniu znalazłem lub nie znalazłem wiele w dziedzinie programowania. Wierzę, że takie przedsięwzięcie tylko zwiększy wartość opublikowanej książki, ponieważ można osiągnąć wspaniałe rzeczy, zachowując zgodność z obrazami, mową, kontekstem i metodą przekazu oryginalnego stylu książki, z którego ta książka została zainspirowana. Czytałem gdzieś, że _prawdziwa głębia wiedzy człowieka polega na tym, jak wyjaśnia on złożoną koncepcję w terminach laika.


title: Zaszufladkowanie C++

text: Jestem specjalistą EE, który przez ostatnie 4 lata pracował jako inżynier oprogramowania. Prawie całe programowanie, które wykonuję w pracy, jest w C++. Podobnie jak wielu innych członków tutaj, obawiam się, że zostanie zaszufladkowany w określonej dziedzinie w tej branży. Zastanawiam się nad zmianą pracy na nowy obszar, np. web lub mobile. Ale ponieważ nie mam dyplomu CS LUB doświadczenia w sieci / na urządzeniach mobilnych, obawiam się, że potencjalni pracodawcy będą mieli problem z zatrudnieniem mnie – zwłaszcza, że nie starałbym się o pracę na poziomie podstawowym. Czytałem w innym wątku, że programiści C++ są postrzegani jako góra nad innymi deweloperami. Czy to prawda i czy zrekompensuje to mój brak doświadczenia w odpowiednich technologiach? Co powinien zrobić ktoś na moim stanowisku, aby zwiększyć moje szanse?


title: Ekstremalne niepowodzenia projektów programistycznych

text: Przeszukałem sieć w poszukiwaniu przykładów ekstremalnych błędów programistycznych, ale nie znalazłem żadnych. Znalazłem historie sukcesu, ale chcę poznać „drugą stronę medalu”. Więc moje pytanie dotyczy tylko projektów, które kończą się niepowodzeniem przy użyciu XP. Dlaczego zawodzą? Chcę tylko usłyszeć kilka opinii o awariach XP.