title: Architektura aplikacji na iPada z bardzo dużymi plikami

text: Pracuję w aplikacji na iPada. Musi zawierać bardzo duże pliki. Mógłbym umieścić je w aplikacji, ale przesunęliby ją znacznie ponad 20 MB, co oznacza, że nie będzie można jej pobrać bezprzewodowo – tylko przez iTunes. Czy jest sposób na obejście tego bez zbytniego bólu dla mnie? Nie mam serwera ani nic takiego.


title: Studentworker - bycie superbohaterem?

text: Kilka tygodni temu dostałem nową pracę jako student-pracownik w agencji internetowej. Praca to 15-20 godzin tygodniowo. Mimo że jestem nowy w firmie, czuję się jak w domu i lubię pracować z moimi współpracownikami. Na początek zostałem przydzielony do pracy nad wewnętrznym narzędziem w firmie, aby poznać ich systemy i platformę programistyczną. Termin realizacji tego projektu upływa w tym tygodniu i jestem na czas. Ale dzisiaj (środa w południe) otrzymałem maila od mojego szefa z prośbą o zrobienie nowego projektu, którego termin jest wyznaczony na piątek rano. Samo nowe zadanie będzie trudne do ukończenia na czas, a poza tym muszę na czas ukończyć inne zadanie. Moje pytanie brzmi: jak mam sobie poradzić z moim szefem oczekującym, że będę superbohaterem? **EDYTUJ:** Porozmawiam z szefem o opóźnieniu jednego z projektów. Ale innym problemem jest to, że nowe zadanie będzie trudne do wykonania na czas (piątek rano). Nie miałem nic do powiedzenia na temat terminu - właśnie dostałem maila z informacją o terminie. Jestem nowy w firmie i chcę zostać, ale nie chcę zaczynać źle z szefem.


title: Strukturyzacja odpowiedzi XML

text: Projektuję odpowiedź XML dla aplikacji zużywającej się do przyjęcia i ważę dwa różne projekty. Obecnie mam następujący projekt (gdzie element Product może się powtarzać): <Response> <AccountType> <ProductType> <Products> <Produkt> <ProductID /> <ProductStatus /> <ProductName /> </Product> <Produkt> <ProductID /> <ProductStatus /> <ProductName /> </Product> </Products> </Response> Alternatywny projekt to: <Response> <AccountType> <ProductType> <Product> <ProductID /> <ProductStatus /> < ProductName /> </Product> <Product> <ProductID /> <ProductStatus /> <ProductName /> </Product> </Response> W pierwszym projekcie mam główny element o nazwie Products, pod którym każdy element Product istnieje i może powtarzać w ramach Produktów. Drugi projekt jest nieco bardziej płaski - produkt znajduje się pod głównym węzłem odpowiedzi. Która z tych dwóch opcji jest bardziej optymalna do odczytywania i przetwarzania przez zużywającą aplikację?


title: Dlaczego Object.clone() jest w stanie "zobaczyć" pola zdefiniowane w podklasach?

text: Zastanawiałem się, w jaki sposób Object.Clone() może uzyskać dostęp do pól pól, które są faktycznie zdefiniowane w podklasach, a nie do rzeczywistej implementacji tej funkcji. Martwi mnie to, że nie widzę logiki zezwalającej klasie bazowej (nawet jeśli jest "specjalna") na dostęp do pól zdefiniowanych w podklasach - czy to nie łamie całej koncepcji dziedziczenia obiektów? Rozważ to: class Test implementuje klonowalne { private String pole testowe; public Test() { } public Test clone() rzuca CloneNotSupportedException { return (Test)super.clone(); } } Tutaj wywołanie `Test.clone()` skopiuje również `pole_testowe`. Jeszcze dziwniej robi się dla mnie sytuacja, w której `Test` jest deklarowany jako klasa abstrakcyjna - wywołanie `clone()` pozwoli mi (w pewien sposób) uzyskać instancję klasy abstrakcyjnej.


title: Używanie DAO do oddzielenia naszego ORM od reszty aplikacji

text: Używamy MySQL z Sequelize.js jako ORM. Zastanawiamy się, czy warto zastosować warstwę abstrakcji DOA. Oto nasze opcje: 1. Korzystanie z modeli Sequelize w całej aplikacji. 2. Aby streścić Sequelize, budując warstwę, która konwertuje modele Sequelize na modele Backbone, dzięki czemu zamiast tego używamy Backbone w pozostałej części aplikacji. Czy w tym przypadku ważna jest abstrakcja, czy też normalne jest używanie modeli z ORM w innych warstwach?


title: Jak sprawnie przetestować program?

text: Wiem, że pisanie przypadku testowego jest jednym ze sposobów na wykonanie testów na poziomie programowania, ale jak przetestować jakiś nieostrożny błąd? czyli jak zmniejszyć? Na przykład „buttonA” powinien wykonać „ActionA”, ale czasami, po prostu ludzki błąd, „buttonA” wykonuje „AkcjęB”. I wymaga to testu na ludziach, wydaje się, że nie może zautomatyzować procesu testowania, jakieś wskazówki, aby to zrobić? Dziękuję.


title: Dlaczego nigdy nie robisz tyle, ile planowałeś?

text: Zawsze zaczynam dzień myśląc: „Z łatwością załatwię to do końca dnia” i ustalam, co wygląda na realistyczny cel. Więc dlaczego nigdy go nie uderzyłem? Zadanie zawsze kończy się 3x dłużej z powodu nieprzewidzianych błędów, zmian w ostatniej chwili itp. Czy to tylko ja? Nie wydaje mi się, żebym lepiej przewidywał, co można zrobić w ciągu jednego dnia.


title: Czy istnieje zasób kanoniczny na ERP?

text: Od jakiegoś czasu chciałem nauczyć się ERP. To, co chciałbym zrobić, to skonfigurować system, a następnie przećwiczyć prowadzenie firmy, wykonując takie czynności, jak generowanie faktur, składanie zamówień zakupu, tworzenie miesięcznych rachunków i śledzenie środków trwałych. Następnie spójrz na dalsze ulepszanie systemu poprzez dodanie niestandardowego kodu. Czy istnieje książka, która jest de facto standardem opisującym najlepsze praktyki, metodologie projektowania i inne przydatne informacje na temat ERP? Co w tej książce czyni ją wyjątkową?


title: Wskazówki dotyczące szybkiej pracy

text: Jakie są wskazówki, które pomogą szybciej projektować i konstruować aplikacje?


title: Termin dla klasy z wieloma interfejsami

text: Powiedzmy, że mam klasę, która implementuje wiele interfejsów. Przekazuję tę samą instancję, używając innego interfejsu, w zależności od tego, czym interesuje się konsument. Staram się zapamiętać, jak to się nazywa. Wiem, że jest na to wymyślna nazwa - myślałem, że to "partycjonowanie interfejsu", ale nie znajduję żadnych trafień. Przydałaby się oficjalna nazwa i być może link do strony wyjaśniającej, co to jest. Na wypadek, gdybym nie wyjaśnił się wystarczająco dobrze, oto przykład z prawdziwego świata. Mam klasę, nazwijmy ją `ContextManager`, która jest odpowiedzialna za zapewnienie dostępu do ustawień konfiguracyjnych, zmiennych sesji, informacji o użytkownikach i innych narzędzi. Zamiast przekazywać obiekt jako `ContextManager`, mogę przekazać go jako `IConfigurationManager` w jednym miejscu, a jako `IUserManager` w innym. Uniemożliwia to klientowi dostęp do rzeczy, na których nie powinien się przejmować, i pozwala mi na ponowne użycie kodu w klasie. Chcę tylko wiedzieć, jak się nazywa?


title: Jaki język programowania jest najbardziej odpowiedni do obsługi danych nieustrukturyzowanych?

text: Próbuję zautomatyzować stosowanie metadanych do dużej ilości tekstu, ale nie jestem pewien, w jakim języku ułatwiłoby to to zadanie (jeśli taki istnieje). Jaki język programowania jest najbardziej odpowiedni do obsługi tekstu nieustrukturyzowanego? Czemu? Jeśli odpowiedź brzmi „to zależy”, jakie są przykłady tego, dlaczego używałbyś jednego języka zamiast innego?


title: Jak przechowywać dane w języku gudżarati w SQLite?

text: Zajmuję się tworzeniem aplikacji na Androida dla rolników Gujarat. Więc ta aplikacja powinna być również w gudżarati. Czy jest jakiś sposób, abym mógł przechowywać moje dane w gudżarati w SQLite?


title: Czy szacujesz wszystkie historyjki użytkownika w iteracji zerowej?

text: Czy po utworzeniu i ustaleniu priorytetów naszego rejestru produktów mamy krótko oszacować wszystkie historie w rejestrze produktów? Zakładam, że muszą być, aby stworzyć wykres spalania produktu, jednak jeśli masz wiele historii, może to początkowo zająć dużo czasu. Dodatkowo, czy historyjka użytkownika powinna mieć kryteria akceptacji po dodaniu do rejestru, czy te kryteria są dodawane, gdy historia jest przenoszona z rejestru produktu do rejestru sprintu? Bez nich trudniej byłoby oszacować.


title: Często używa się programowania liniowego?

text: Czytałem o programowaniu liniowym i jego zawartości i zastanawiam się, czy ten sposób programowania jest powszechny na rynku? Często słyszę o programowaniu obiektowym, ale nie o programowaniu liniowym. Chciałbym posłuchać dyskusji na ten temat.


title: dodać gromadzenie danych do aplikacji użytkowej i opublikować ją partnerom?

text: Od jakiegoś czasu pracuję nad aplikacją użytkową, a kiedy jesteśmy w końcowej fazie, szef prosi o dodanie zachowania użytkowników i śledzenia lokalizacji i wyraźnie powiedział, że publikuje je programistom zewnętrznym, aby z nich skorzystały. Wygląda na to, że się na to zdecydował, czy jest coś, co mogę/powinnam z tym zrobić? Wyjaśnij: jeśli jesteś programistą aplikacji, który został poproszony o dodanie gromadzenia danych użytkowników aplikacji i ich publikowania, czy jest coś, co powinieneś powiedzieć przeciwko temu?


title: Czy powinienem upublicznić moją implementację opublikowanego algorytmu?

text: Moja firma ma problem A, powiedzmy, rozpoznawanie twarzy. Znajdujemy fajny algorytm, taki jak ten. Wdrażamy to i wracamy do domu szczęśliwi. Problem polega na tym, że po powrocie do domu nie mogę spać, bo zastanawiam się, czy powinniśmy upublicznić wdrożenie. W końcu algorytm był publiczny. Ktoś przeprowadził intensywne badania i wykonał połowę (lub więcej) pracy za nas. Czuję, że powinniśmy pomóc i upublicznić nasze wysiłki. Ale wtedy nasz produkt komercyjny nie byłby zbyt _komercyjny_ , po prostu wyobraź sobie nasz baner: > Hej kliencie, kup nasze oprogramowanie grunt master 6000, to tylko $1,000.00! > A tak przy okazji, tutaj możesz pobrać główne algorytmy za darmo! Czy istnieje jakaś licencja na prace pochodne z tych akademickich prac badawczych? Czy moim obowiązkiem jest upublicznienie moich wdrożeń? Czy to zależy ode mnie? Czy mogę zarabiać na algorytmie?


title: Co oznacza „zautomatyzowana kompilacja”?

text: Próbuję dodać ciągłą integrację do projektu. Według Wikipedii, jednym z głównych elementów CI są zautomatyzowane kompilacje. Jednak jestem zdezorientowany, co to dokładnie oznacza, ponieważ artykuły dotyczące CI i automatyzacji kompilacji wydają się nie zgadzać. **Szczególne niejasności: co oznacza „zautomatyzowane budowanie” _w kontekście:_** * projektu używającego interpretowanego języka, takiego jak Python czy Perl? * budowanie ze źródła na maszynie użytkownika końcowego? * aplikacja, która ma zależności, których nie można po prostu wstępnie skompilować i rozprowadzić, np. baza danych w RDBMS lokalnie na komputerze użytkownika?


title: ResourceSerializable: alternatywa dla ORM i ActiveRecord

text: Kilka upartych powodów, dla których nie lubię tradycyjnych wzorców ORM i ActiveRecord: * **Pracują tylko z bazą danych.** Czasami mam do czynienia z obiektami z API i innymi obiektami z bazy danych. Wszystkie implementacje, które widziałem, na to nie pozwalają. _Proszę mnie o to poinformować, jeśli się mylę._ * **Są kruche.** Zmiany w bazie danych prawdopodobnie zakłócą Twoje wdrożenie. Niektóre implementacje mogą pomóc to zmniejszyć, ale kilka z tych, które widziałem, nie pomaga. * **Na ich wygląd ma wpływ baza danych.** Jeśli chcę przełączyć się na używanie API, będę musiał przeprojektować obiekt, aby działał (prawdopodobnie). * **Wydaje się naruszać wzorzec pojedynczej odpowiedzialności.** Wiedzą, kim są i jak działają, ale wiedzą też, jak są stworzeni, zniszczeni i uratowani? Wydaje się trochę za dużo. **A co z podejściem, które jest nieco bardziej znane w PHP: implementacja interfejsu?** W php 5.4, będziemy mieli interfejs `JsonSerializable`, który definiuje dane jako `json_encode`d, aby użytkownicy przyzwyczaili się do tego typu rzeczy. Co by było, gdyby istniał interfejs „ResourceSerializable”? To wciąż jest ORM z nazwy, ale z pewnością nie według tradycji. interface ResourceSerializable { /** * Zwraca identyfikator, który identyfikuje zasób. */ funkcja identyfikator zasobu(); /** * Zwraca „typ” zasobu. */ funkcja typ_zasobu(); /** * Zwraca dane do serializacji. */ funkcja resourceSerialize(); } _Rzeczy mogą być źle nazwane, przyjmę sugestie._ **Uwagi:** * **`ResourceId` będzie działać dla API i baz danych.** Dopóki klucz podstawowy w bazie danych jest taki sam jak zasób ID w API, nie ma konfliktu. Wszystkie interfejsy API, z którymi pracowałem, mają unikalny identyfikator zasobu, więc nie widzę tam żadnych problemów. * **`ResourceType` to grupa lub typ powiązany z zasobem.** Możesz użyć tego do mapowania zasobu na wywołanie API lub tabelę bazy danych. Jeśli `ResourceType` był `person`, mógłby mapować `/api/1/person/{resourceId}` i tabelę `persons` (lub `people`, jeśli jest wystarczająco sprytna). * **resourceSerialize() zwraca dane, które mają być przechowywane.** Klucze identyfikują parametry API i kolumny tabeli bazy danych. * **Wydaje się to również łatwiejsze do przetestowania niż implementacje ActiveRecord/Orm.** Nie przeprowadzałem zbyt wielu automatycznych testów na tradycyjnych implementacjach ActiveRecord/ORM, więc to tylko przypuszczenie. Ale wydaje mi się, że pomaga mi tworzenie obiektów niezależnie od biblioteki. Nie muszę używać `load()`, aby uzyskać istniejący zasób, mogę go po prostu utworzyć i ustawić wszystkie właściwe właściwości. Nie jest to takie proste w implementacjach ActiveRecord/Orm, z którymi miałem do czynienia. **Wady:** * **Do jego serializacji potrzebny jest inny obiekt.** Oznacza to również, że ogólnie masz więcej kodu, ponieważ musisz użyć większej liczby obiektów. * **Musisz mapować typy zasobów na wywołania API i tabele bazy danych.** To jeszcze więcej pracy, ale niektóre implementacje ORM i ActiveRecord i tak wymagają mapowania obiektów na nazwy tabel. **Czy widzisz inne wady?** **Czy wydaje Ci się to wykonalne?** **Jak byś to ulepszył?** _Uwaga: prawie zapytałem o to na StackOverflow, ponieważ może to być zbyt niejasne dla ich standardów , ale nadal nie jestem zaznajomiony z programrs.stackexchange.com, więc pomóż mi ulepszyć moje pytanie, jeśli nie odpowiada ono tutaj standardom._


title: Czy istnieje formalny antywzór opisujący scenariusz?

text: Część kodu jest napisana w celu generowania arkuszy kalkulacyjnych programu Excel (Office Interop). * Kod działa bardzo słabo. * Podsystem przeznaczony jest do generowania plików w nocy. Wydajność nie jest problemem w nocy. * Funkcja jest tworzona, aby wybrać właściwy plik spośród 100 różnych dostępnych plików w zależności od wybranego zestawu parametrów. * Ponieważ istnieją fizyczne pliki, dodawany jest system archiwizacji do tworzenia kopii zapasowych tych plików (nie ma powodu do archiwizacji. Pliki te powinny być generowane w locie). * Ten system nie zawiera pliku konfiguracyjnego, zamiast tego ma zakodowaną na stałe funkcję „selektora serwera”, która po prostu odzwierciedla serwer, na którym działa kod. * Zaplanowane zadanie jest niezbędne do obsługi i uruchomienia tej usługi. Sprowadza się to do jednego problemu. Oryginalny kod działa zbyt słabo, aby można go było uruchomić w środowisku produkcyjnym. Gdyby problem z wydajnością został rozwiązany, podsystem, a następnie system archiwizacji, „funkcja fabryczna próbnika plików”, zakodowany punkt awarii oraz konserwacja zaplanowanego zadania i dodany punkt awarii nie muszą istnieć. Jest to „kaskadowa awaria”, jeśli chcesz. Pierwotny problem doprowadził do większej ilości złego kodu, większej liczby złych rozwiązań i niepotrzebnych kosztów ogólnych. Czy istnieje formalny anty-wzorzec lub ogólny termin, który to opisuje?


title: Czy powinienem oczekiwać pytań z prawdziwego świata od agencji rekrutacyjnej?

text: Zacząłem kodować prawie rok temu. Przez "kodowanie" mam na myśli HTML(5), CSS(3), a tylko kilka razy zaimplementowałem trochę AJAX i JavaScript. Prowadzę rozmowę kwalifikacyjną na stanowisko, które wymaga ode mnie znajomości HTML, CSS, JS, JQuery i AJAX. Czuję się pewnie w obszarze tematycznym HTML5/CSS3 i trochę w porządku z javascriptem. Czy agencja będzie ode mnie oczekiwać napisania kodu podczas rozmowy kwalifikacyjnej? Mam przykładową stronę internetową, która zawiera migawki z poprzednich projektów, które zostały do nich wysłane. Trochę się denerwuję, więc wszelkie wskazówki i rekomendacje są mile widziane.


title: Czy kurs PMP lub CEH (Certified Ethical Hacker) byłby bardziej przydatny dla młodszego programisty internetowego ASP.Net?

text: Dopiero niedawno przeniosłem się do tworzenia stron internetowych Asp.net, z całkiem sporą częścią na Asp.net MVC. Zastanawiam się nad wzięciem udziału w kursach, aby jeszcze bardziej rozbudować swój profil. Mam dotykową decyzję między podjęciem PMP lub CEH. Czy kurs przyniesie więcej korzyści mojej obecnej karierze, a może w nadchodzących 1-2 latach? Dziękuję.


title: Jak obsługiwać ukryte foldery we wdrożonej witrynie?

text: Nasz zespół ds. bezpieczeństwa w pracy wykonał skanowanie bezpieczeństwa naszej witryny, która wkrótce ma zostać wdrożona, i jeden z znalezionych elementów to „Wykryto ukryty katalog”. Pojawia się w 3 różnych folderach, aspnet_client, skryptach i zawartości. Oprogramowanie zaleca wyrzucenie 404 zamiast 403 lub całkowite usunięcie folderów. Po pierwsze, czy foldery są rzeczywiście potrzebne? Jak mogę określić, które foldery w moim projekcie Visual Studio są rzeczywiście potrzebne do rzeczywistego działania witryny (bez usuwania folderów pojedynczo i próby uzyskania dostępu do witryny)? Jaki jest właściwy sposób obsługi tego/rozwiązania alertu skanowania bezpieczeństwa? Czy muszę dodać specjalne reguły routingu w routeconfig.cs, gdy uzyskuje się dostęp do tych ścieżek? Edytuj, powinienem zauważyć, że jest to usługa WebApi/REST, a nie zwykła witryna MVC. (Dlatego użycie sekcji konfiguracji CustomErrors nie będzie działać)


title: Jak radzisz sobie z pomiarem pokrycia kodu w JavaScript?

text: Aby zmierzyć pokrycie kodu dla testów jednostkowych JavaScript, należy zinstrumentować kod, uruchomić testy, a następnie wykonać przetwarzanie końcowe. Obawiam się, że w rezultacie otrzymujesz kod do testów jednostkowych, który nigdy nie zostanie uruchomiony w środowisku produkcyjnym. Ponieważ JavaScript nie jest kompilowany, to co testujesz powinno być dokładnie tym, co wykonujesz. Więc oto moje pytanie, jak sobie z tym radzisz? Jedną z myśli, którą miałem, było uruchomienie testów jednostkowych na kodzie produkcyjnym i użycie tego, aby mój test zakończył się niepowodzeniem. Następnie utworzyłbym cień mojego kodu produkcyjnego z oprzyrządowaniem i ponownie uruchomiłbym moje testy jednostkowe; to dałoby mi statystyki pokrycia kodu. Czy ktoś natknął się na metodę, która jest nieco bardziej wdzięczna niż ta? **EDYTUJ** Nie chcę używać wtyczek do przeglądarek, ponieważ muszę używać przeglądarki, aby przeprowadzić testy jednostkowe.


title: Jaka jest prawdziwa korzyść z metamodelowania?

text: Po przeczytaniu kilku tekstów o meta-modelowaniu nadal nie odnoszę praktycznych korzyści. Czasami myślę, że to tylko interesująca gra umysłowa, ale nie ma żadnego użytecznego narzędzia. Jasne, rozsądnie jest wyjaśnić swoje słownictwo związane z modelowaniem: niektórzy mogą powiedzieć _klasa_, podczas gdy inni mówią _jednostka_ lub _koncepcja_ , ale jest to tylko prosta dokumentacja terminologii związanej z modelowaniem. Meta-modelowanie, jak rozumiem, jest bardziej złożone, ponieważ próbuje sformalizować i abstrakcyjne modelowanie. Dobrymi przykładami są formalne porównanie Keet'a koncepcyjnych języków modelowania danych (UML, ERM i ORM) w środowisku akademickim oraz Meta Object Facility (MOF) w przemyśle. Dla mnie MOF wygląda równie niepraktycznie jak CORBA, którą również stworzyła firma OMG. Teoretycznie można by użyć meta-modelowania do przekształcania i integrowania modeli w różnych językach modelowania, ale czy ktoś faktycznie to robi?


title: Pytania i wątpliwości dotyczące używania Java/Tomcat i Apache

text: Muszę używać Javy, ponieważ potrzebuję jednej biblioteki zaplecza. Czy nadal uważa się za dobrą praktykę konfigurowanie Apache jako serwera frontowego i posiadanie za nim Tomcata? Dużo czasu poświęcam na konfigurację mod_jk. Ponadto, czego ludzie zwykle używają do tworzenia CMS lub szablonów stron internetowych w takiej konfiguracji? Chciałem użyć Drupala, ale poinformowano mnie, że skoro będę musiał skonfigurować mod_jk i przeskoczyć przez dodatkowe obręcze konfigurujące go, może to nie być dobre podejście. Czy moglibyście zasugerować kilka wspólnych rozważań lub dobrych podejść w takiej sytuacji? Dzięki, Alex


title: Jak poradzić sobie z wywiadem „zły kod”?

text: Wywiad dotyczący „złego kodu” to taki, w którym rozmówcy pokazywany jest fragment „złego kodu” i proszony o poprawienie go lub wskazanie rzeczy, które są w nim niewłaściwe. Mam problem z tymi wywiadami, ponieważ zabiera mi trochę czasu, aby przeczytać kod, dowiedzieć się, co robi i wskazać wady. W sytuacji, gdy jest presja czasu, mam tendencję do zawieszania się i widzę, że kod „powinien” działać, nawet jeśli nie działa. Jaki jest dobry sposób radzenia sobie z tego rodzaju wywiadem i, bardziej ogólnie, jakie są dobre techniki _szybkiego_ czytania i rozumienia kodu?


title: Aplikacja internetowa Clojure: EC2 czy GAE?

text: Zajmuję się tworzeniem aplikacji internetowej napisanej w Clojure z wykorzystaniem frameworka Compojure. Moje pytanie brzmi, czy powinienem wdrożyć na Amazon EC2 czy Google App Engine? Przeczytałem ten artykuł na temat uruchamiania kodu Clojure na GAE, ale nadal jestem trochę zaniepokojony ograniczeniami GAE. Będę uruchamiał kod Clojure w piaskownicy, co oznacza, że może będę musiał majstrować przy politykach bezpieczeństwa JVM. Z EC2 będę oczywiście miał pełną kontrolę nad wszystkim. Minusem jest to, że oznacza to większy wysiłek z perspektywy administratora systemu. Nie jestem pewien, która opcja ma większy sens fiskalny. Początkowo nie spodziewam się zbyt dużego ruchu i podejrzewam, że będę działać w pobliżu „bezpłatnej” warstwy/przydziałów w obu usługach. W przeszłości odniosłem wiele sukcesów w pracy z EC2, ale jednocześnie chciałbym zdobyć trochę doświadczenia z Google App Engine (z którego nigdy nie korzystałem). Jaki jest twój głos: Amazon EC2 czy Google App Engine?


title: Stworzenie przewodnika po standaryzacji rozwoju dla programistów wewnętrznych/dostawców

text: Niedawno zostałem zatrudniony przez dużą międzynarodową korporację do kierowania rozwojem mobilnym w ich zespole sprzedaży/wsparcia. W firmie liczącej blisko 10 000 osób jestem, przynajmniej w Ameryce, jedynym programistą mobilnym. Testują wody i faza 1 (tymczasowa rekrutacja) poszła im wystarczająco dobrze. Teraz rozważają rozszerzenie działalności na innych programistów dla swoich innych działów sprzedaży/zespołu wsparcia, a ja otrzymałem zadanie asystowania/kierowania pisaniem przewodnika standaryzacyjnego dla programowania iOS. Jestem wielkim zwolennikiem dawania ludziom swobody pracy w sposób, w którym czują się najbardziej komfortowo, ale jednocześnie byłem twórcą i odbiorcą dużych kul aplikacji błotnych. Ucząc się przez doświadczenie, mam kilka standardów, których przestrzegam religijnie, takich jak komentowanie, czasami prawie każdą linijkę - tylko krótkie rzeczy, ale wystarczające, aby ktoś inny wiedział, co się dzieje i za pomocą znaku #pragma - OPIS, aby zablokować podobnie myślące metody, wcięcia, nazywanie klas z prefiksem, aby uniknąć konfliktów przestrzeni nazw itp. Więc myślę, że to, czego szukam, to nie mówić innemu programiście, jak powinien iterować przez tablicę, ale raczej podstawową standaryzację, aby każdy mógł wskoczyć do kogokolwiek innego projekt i odnalezienie się przy niewielkiej krzywej uczenia się. Chciałbym zobaczyć, jakich innych środków używają ludzie do utrzymania kontroli nad grupą programistyczną.


title: Praktyki i szacunki Agile w świecie rzeczywistym

text: W idealnym świecie mówimy klientowi, że postępujemy zgodnie ze zwinną metodologią, w której pozwalamy na zwiększenie/zmniejszenie zakresu wraz ze zmianą wymagań i rozliczanie za godzinę za każdą iterację. W rzeczywistości oszacowania należy dostarczyć przed rozpoczęciem projektu i zawsze istnieje presja, aby osiągnąć tę liczbę oszacowań, zachowując jednocześnie elastyczność przy zmianach zakresu. Zastanawiam się, jakie prawdziwe praktyki zwinne ludzie zastosowali do rozliczania/szacowania opartego na wodospadzie de facto, w którym czasami utknęliśmy. zaufania, czy są jakieś inne techniki przejścia klienta na agile. *uwaga: w mojej „rzeczywistej” sytuacji prowadzę niedawno założoną firmę deweloperską, która nie ma luksusu zmuszania klientów do korzystania z naszej metody i procesu. Wiele razy musimy zgiąć się, aby użyć ich, ale postrzegam to jako obciążenie, z jakim borykają się wszystkie firmy, gdy zaczynają. Zastanawiam się, jak najlepiej sobie z tym poradzić.


title: Czy w aplikacji płatnej można używać „niekomercyjnego” interfejsu API REST?

text: Jestem zainteresowany integracją wyników API wiadomości innych firm z moją płatną aplikacją. Interfejsy API byłyby bardzo małą częścią aplikacji (np. aplikacja nie tylko odsprzedaje interfejsy API). Zauważyłem, że wiele interfejsów API, takich jak Yahoo, ma „niekomercyjne” warunki, takie jak: > NIE WOLNO: Sprzedawać, wynajmować, udostępniać, przenosić lub udzielać podlicencji na Yahoo! Interfejsy API lub kody dostępu lub dostępu do nich lub uzyskiwać dochody z użytkowania lub udostępniania usługi Yahoo! Interfejsy API, czy to w celu uzyskania bezpośredniego zysku komercyjnego lub pieniężnego, czy > w inny sposób, chyba że Dokumenty API wyraźnie zezwalają na inaczej lub Yahoo! > daje uprzednią, wyraźną, pisemną zgodę... (ze strony Yahoo Local Search API) Czy to uniemożliwia korzystanie z API jako części jakiejkolwiek aplikacji, której używanie kosztuje? Na przykład, jeśli pobieram opłatę za wejście do mojej witryny, a następnie wyświetlenie niektórych treści z tego interfejsu API, czy to jest w porządku? Jeśli pozwolę Ci zobaczyć zawartość z interfejsu API za darmo, a następnie obciążę Cię za zrobienie czegoś innego w witrynie, czy to w porządku? Oczywiście nie oczekuję konkretnej porady prawnej. Zamiast tego chciałbym wiedzieć o: (1) dobrym referencji na ten temat, która może odpowiedzieć na moje pytanie (2) „odpowiedzi przez przykład”, tj. mi. przykład rzeczywistej aplikacji, która robi coś podobnego


title: Czy metoda powinna robić jedną rzecz i być w tym dobra?

text: „Extract Till You Drop” to coś, co przeczytałem na blogu Wujka Boba, co oznacza, że metoda powinna robić tylko jedną rzecz, która jest w tym dobra. **Co to za jedna rzecz?** Kiedy przestać wyodrębniać metody? Załóżmy, że mam klasę logowania z następującymi metodami: public string getAssistantsPassword() public string getAdministratorsPassword() Pobierają one odpowiednie hasła kont w bazie danych. Następnie: public bool isLogInOk() Metoda porównuje wywołane lub wybrane hasło i sprawdza, czy podane przez użytkownika hasło znajduje się w bazie danych. Czy to jest przykład „Wyodrębnij do upuszczenia”? **Kiedy dowiesz się, że robisz za dużo ekstrakcji?**


title: Dlaczego mamy używać krótkich funkcji do sekcjonowania naszego kodu?

text: Widziałem rosnący trend w świecie programowania mówiący, że dobrą praktyką jest rozdzielanie bloków kodu na ich własne funkcje. Oczywiście, jeśli ten blok kodu jest wielokrotnego użytku, powinieneś to zrobić. To, czego nie rozumiem, to ten trend używania wywołania funkcji jako zasadniczo komentarza, za którym ukrywasz swój kod, jeśli kod nie nadaje się do ponownego użycia. Do tego służy zwijanie kodu. Osobiście nienawidzę też czytać takiego kodu, ponieważ wydaje mi się, że ma ten sam problem, co instrukcja GOTO - staje się kodem spaghetti, w którym jeśli próbuję nadążać za przebiegiem programu, ciągle skaczę i nie mogę logicznie podążać kod. O wiele łatwiej jest mi podążać za kodem, który jest liniowy, ale ma jeden komentarz do sekcji kodu oznaczających to, co robi. W przypadku składania kodu jest to w zasadzie dokładnie to samo, z wyjątkiem tego, że kod pozostaje w ładnym liniowym stylu. Kiedy próbuję wyjaśnić to moim kolegom, mówią, że komentarze są złe i bałaganu – czym różni się komentarz na górze bloku złożonego kodu od wywołania funkcji, która nigdy nie zostanie wywołana więcej niż raz? Czym różni się nadużywanie funkcji od nadużywania komentarzy? Czym różni się częste korzystanie z funkcji od problemów z poleceniami GOTO? Czy ktoś może mi wyjaśnić wartość paradygmatu programowania?


title: Czy można dzielić długie funkcje i metody na mniejsze, nawet jeśli nie zostaną wywołane przez nic innego?

text: Ostatnio staram się podzielić długie metody na kilka krótkich. **Na przykład:** Mam funkcję `process_url()`, która dzieli adresy URL na komponenty, a następnie przypisuje je do niektórych obiektów za pomocą ich metod. Zamiast implementować to wszystko w jednej funkcji, przygotowuję tylko adres URL do podziału w funkcji `process_url()`, a następnie przekazuję go do funkcji `process_components()`, która następnie przekazuje komponenty do funkcji `assign_components()`. Na początku wydawało się to poprawiać czytelność, ponieważ zamiast ogromnych „Boskich” metod i funkcji miałem mniejsze, o bardziej opisowych nazwach. Jednak przeglądając kod, który napisałem w ten sposób, stwierdziłem, że nie mam pojęcia, czy te mniejsze funkcje są wywoływane przez jakiekolwiek inne funkcje lub metody. **Kontynuacja poprzedniego przykładu:** ktoś patrzący na kod może pomyśleć, że funkcja `process_components()` jest abstrakcyjna w funkcji, ponieważ jest wywoływana przez różne metody i funkcje, podczas gdy w rzeczywistości jest wywoływana tylko przez `process_url()`. Wydaje się to nieco błędne. Alternatywą jest pisanie długich metod i funkcji, ale zaznaczanie ich sekcji komentarzami. Czy opisana przeze mnie technika podziału funkcji jest zła? Jaki jest preferowany sposób zarządzania dużymi funkcjami i metodami? **AKTUALIZACJA:** Moim głównym zmartwieniem jest to, że przekształcenie kodu w funkcję może sugerować, że może być wywoływana przez wiele innych funkcji. **ZOBACZ TAKŻE:** dyskusje na reddit w /r/programming (zapewnia inną perspektywę niż większość odpowiedzi tutaj) i /r/readablecode.


title: Jak uniknąć zapychania kodu IF

text: Muszę dodać nowy rodzaj płatności do istniejącej bazy kodów. Oznacza to, że będę miał kilka metod wyglądających tak: if (stary typ płatności) przetwarza stary typ płatności inny przetwarza nowy typ płatności Teraz, gdyby można było to ustalić wcześniej, miałbym tę metodę wskazywać na interfejs implementujący wspólną metodę Pay, a następnie ten interfejs byłby zaimplementowany przez jedną z dwóch klas. Niestety, wiem tylko, jaką metodę klient wybierze w czasie wykonywania, co oznacza, że potrzebuję sposobu, aby określić, której gałęzi użyć. Czy istnieje inny sposób, poza rozproszeniem „jeśli” w kodzie?


title: Czy zbyt wiele instrukcji if-else do walidacji jest złych?

text: Z książki Professional Enterprise .Net, która ma 5 gwiazdek na Amazon, w co wątpię po przeczytaniu. Oto klasa Borrower (w C#, ale jest dość podstawowa; każdy może ją zrozumieć), która jest częścią aplikacji Mortgage, którą zbudowali autorzy: public List<BrokenBusinessRule> GetBrokenRules() { List<BrokenBusinessRule> brokenRules = new List<BrokenBusinessRule>( ); if (Wiek < 18) brokenRules.Add(new BrokenBusinessRule("Wiek", "Pożyczkobiorca musi mieć ukończone 18 lat")); if (String.IsNullOrEmpty(FirstName)) brokenRules.Add(new BrokenBusinessRule("Imię", "Pożyczkobiorca musi mieć imię")); if (String.IsNullOrEmpty(LastName)) brokenRules.Add(new BrokenBusinessRule("LastName", "Pożyczkobiorca musi mieć nazwisko")); if (CreditScore == null) brokenRules.Add(new BrokenBusinessRule("CreditScore", "Kredytobiorca musi mieć ocenę kredytową")); else if (CreditScore.GetBrokenRules().Count > 0) { AddToBrokenRulesList(brokenRules, CreditScore.GetBrokenRules()); } if (KontoBankowe == null) brokenRules.Add(new BrokenBusinessRule("KontoBankowe", "Pożyczkobiorca musi mieć zdefiniowane konto bankowe")); else if (BankAccount.GetBrokenRules().Count > 0) { AddToBrokenRulesList(brokenRules, BankAccount.GetBrokenRules()); } // ... więcej reguł tutaj ... return brokenRules; } Pełna lista kodu na snipt.org . Wprawia mnie w zakłopotanie fakt, że książka ma dotyczyć profesjonalnego projektowania korporacyjnego. Może jestem trochę stronniczy, ponieważ autor wyznaje w rozdziale 1, że tak naprawdę nie wiedział, czym jest decoupling, ani co oznacza SOLID, aż do 8 roku swojej kariery programistycznej (a myślę, że napisał książkę w roku 8.1). nie ma eksperta, ale nie czuję się komfortowo z: 1. Zbyt wiele stwierdzeń, jeśli inaczej. 2. Klasa zarówno służy jako jednostka _i_ posiada walidację. Czy to nie śmierdzący projekt? (Być może będziesz musiał obejrzeć całą klasę, aby uzyskać jakiś kontekst) Może się mylę, ale nie chcę wyłapywać złych praktyk z książki, która ma uczyć projektowania korporacyjnego. Książka jest pełna podobnych fragmentów kodu i teraz naprawdę mnie to denerwuje. Jeśli to _jest_ zły projekt, jak można uniknąć używania zbyt wielu instrukcji if else. Oczywiście nie oczekuję, że będziesz przepisywać klasę, po prostu przedstawię ogólny pogląd na to, co można zrobić.


title: Styl dla przepływu sterowania z kontrolami walidacyjnymi

text: Piszę dużo kodu w ten sposób: int myFunction(Person* person) { int personIsValid = !(person==NULL); if (personIsValid) { // zrób coś; może być długa int myresult = cokolwiek; zwróć mójWynik; } else { return -1; } } Może to być dość nieuporządkowane, zwłaszcza jeśli w grę wchodzi wiele sprawdzeń. W takich przypadkach eksperymentowałem z alternatywnymi stylami, takimi jak ten: int netWorth(Person* person) { if (Person==NULL) { return -1; } if (!(osoba->żyje)) { return -1; } int aktywa = osoba->aktywa; if (aktywa==-1) { return -1; } int pasywa = osoba->pasywa; if (zobowiązania==-1) { return -1; } zwrot aktywów - pasywa; } Interesują mnie tutaj komentarze na temat wyborów stylistycznych. [Nie przejmuj się zbytnio szczegółami poszczególnych oświadczeń; interesuje mnie ogólny przepływ kontroli.]


title: Czy dobrą praktyką jest napisanie metody, która coś pobiera i sprawdza wartość?

text: Czasami muszę napisać takie metody: string GetReportOutputDirectoryAndMakeSureExist() { string path = Path.Combine ( ... ) //jakakolwiek logika if(!Directory.Exists(path)) Directory.Create(path); ścieżka powrotna; } lub string GetAndVerifyExistenceOfReportConfigurationPath() { string path = Path.Combine ( ... ) //niezależnie od logiki, aby znaleźć konfigurację if(!File.Exists(path)) throw new Exception("Nie znaleziono konfiguracji raportu"); ścieżka powrotna; } lub Klient GetCustomerAndVerifyActive(int id) { Klient klient = Db.GetCustomerById(id); if(!customer.IsActive) wyrzuć nowy wyjątek("Klient nie jest aktywny"); klient powrotny; } Czy to dobra praktyka? Powiedziano mi, że zwykle nie jest dobrym pomysłem, aby metoda robiła więcej niż jedną rzecz lub aby metoda miała skutki uboczne (takie jak tworzenie katalogu). Ale jeśli podzielę na przykład ostatnią metodę na GetCustomer(id) i VerifyActive(customer), będę musiał wykonać: var customer = GetCustomer(id); ZweryfikujAktywny(klient); kolejno w kilku miejscach i myślę, że liczy się to jako naruszenie DRY. Czy to dobry pomysł? Masz pomysł, jak pomóc z długimi nazwami metod?


title: Jak przeprowadzić czystą refaktoryzację kodu If Else bez pozostawiania żadnych wolnych bloków?

text: if(warunek1) {Oświadczenie1A; Oświadczenie1B; } else if(warunek2) { Oświadczenie2; } else if(warunek3) { Wyrażenie3; } else { Oświadczenie1A; Oświadczenie1B; }             zwrócić; Chciałbym dokonać refaktoryzacji tego kodu, aby nie powielać instrukcji. **Zawsze** muszę sprawdzić warunek1 przed jakimkolwiek innym warunkiem. (Więc nie mogę po prostu zmienić kolejności warunków). Nie chcę też pisać `&&!warunek1` po każdym innym warunku. Rozwiązałem to w ten sposób if(warunek1) { } else if(warunek2) { Oświadczenie2; zwrócić; } else if(warunek3) { Wyrażenie3; zwrócić; } Oświadczenie1A; Oświadczenie1B; zwrócić; Nie sądzę jednak, aby warunek pustki if był łatwo zrozumiały dla innych (nawet dla mnie po pewnym czasie). Jakie jest lepsze podejście?


title: Do jakiego momentu należy dokonać refaktoryzacji?

text: Jak myślisz, do jakiego momentu programista powinien dokonać refaktoryzacji kodu? Zasadniczo posiadanie metody def zrób_coś end Kawałki kodu byłyby przydatne, ale zwiększają kod spaghetti do punktu, w którym musisz zapamiętać ścieżkę więcej niż 8-10 metod. Więc nie byłoby łatwiej mieć nie więcej niż 3 metody kodu spaghetti, mimo że metoda jest dłuższa niż się wydaje


title: Podejścia do sprawdzania wielu warunków?

text: Jaka jest najlepsza praktyka sprawdzania wielu warunków, w dowolnej kolejności? W omawianym przykładzie należy sprawdzić cztery różne warunki w dowolnej kolejności i nie wyświetlać poprawnego komunikatu o błędzie. Poniższe przykłady używają składni podobnej do C. ## Opcja 1: Sprawdź wszystko na raz Ta metoda nie jest preferowana, ponieważ przyczyny niepowodzenia warunku nie są łatwe do rozpoznania. if (A && B && C && D) { // kontynuuj tutaj... } else { return "A, B, C lub D nie powiodło się"; } ## Opcja 2: Warunki zagnieżdżone W przeszłości używałem zagnieżdżonych instrukcji warunkowych, tak jak to jest tutaj. To może być naprawdę mylące. if (A) { if (B) { if (C) { if (D) { // kontynuuj tutaj... } else { return "D nie powiodło się" } } else { return "C nie powiodło się"; } } else { return "B nie powiodło się"; } } else { return "A nie powiodło się"; } ## Opcja 3: Fail-early To jest aktualna metoda, której używam, którą lubię nazywać _fail-early_. Gdy tylko zostanie osiągnięty „zły” stan, powraca. if (!A) { return "A nie powiodło się"; } if (!B) { return "B nie powiodło się"; } if (!B) { return "C nie powiodło się"; } if (!D) { return "D nie powiodło się"; } // kontynuuj tutaj... # Opcja 4: Zbieranie błędów Ostatnie podejście, jakie przychodzi mi do głowy, to rodzaj _zbierania_ błędów. Jeśli warunki do testowania są całkowicie oddzielne, można użyć tego podejścia. Błędy ciągów = ""; if (!A) { błędy += "A nie powiodło się\n"; } if (!B) { błędy += "B nie powiodło się\n"; } if (!C) { błędy += "C nie powiodło się\n"; } if (!D) { błędy += "D nie powiodło się\n"; } if (errors.isEmpty()) { // kontynuuj tutaj... } else { zwróć błędy; } Jakie są najlepsze praktyki sprawdzania wielu warunków? Pod względem oczekiwań idealnie zachowuje się jak w przykładzie 4, w którym zwracane są szczegóły wszystkich awarii.


title: Unikaj powtórzeń kodu w oświadczeniach o warunkach

text: Programuję od ponad 15 lat. Uważam się za bardzo dobrego programistę, ale rozumiem (jak każdy z nas) są rzeczy, nad którymi muszę popracować. Jedną z tych rzeczy jest powtarzanie kodu podczas radzenia sobie z warunkami. Podam ogólną próbkę: if(warunek1) { //wykonaj logikę if(warunek2) { //wykonaj logikę if(warunek3) { //Wykonaj logikę } else { //MetodaA(parametr) } } else { / /MethodA(param) } } else { //MethodA() } Teraz nie mogę tego ułatwić, wykonując następujące czynności: if(warunek1 && warunek2) { } else { } Nie mogę tego zrobić, ponieważ muszę wykonać trochę logiki, jeśli warunek1 jest prawdziwy i zanim przetestuję warunek2. Czy istnieje sposób na uporządkowanie bloków if…else, do których, jeśli musisz wywołać metodę w każdym innym bloku, nie powtarzasz się?


title: Wyeliminuj zduplikowany kod w zagnieżdżonych IF bez tworzenia funkcji

text: Powiedzmy, że mamy dwa if, które są od siebie zależne: if var is { if var is array { //Zrób coś z var } else { //Rozwiąż problem } } else { //Rozwiąż problem dokładnie tak samo jak powyżej } //Kontynuuj wykonanie z założeniem, że var jest w odpowiednim stanie Jak mogę dokonać refaktoryzacji, aby usunąć zduplikowany kod bez użycia goto lub funkcji/metod?


title: Refaktoryzacja na wiele metod — czy jest to uważane za czyste, czy nie?

text: Tak więc obserwowałem, jak mój kolega narzekał trochę na projekt, który odziedziczył po kimś, kto jest, powiedzmy, niezbyt doświadczonym programistą (stażysta zostawiony sam sobie w projekcie). W pewnym momencie pojawił się zduplikowany kod, około 7-8 linii kodu zduplikowanych (a więc łącznie 14-16 linii) w metodzie powiedzmy 70-80 linii kodu. Dyskutowaliśmy o kodzie, a on zauważył sposób na refaktoryzację tego, aby usunąć duplikację, po prostu zmieniając nieco strukturę. Powiedziałem świetnie, a potem powinniśmy również przenieść kod do osobnej metody, aby duża metoda stała się trochę bardziej czytelna. Powiedział „nie, nigdy nie stworzyłbym metody dla zaledwie 7-8 linijek kodu”. Pomijając problemy z wydajnością, jakie są **Twoje** dane na ten temat? Czy skłaniasz się ku używaniu większej liczby metod (które w c# padach kodują z około 3 liniami) lub większych metod, gdy ten konkretny kod prawdopodobnie nie będzie używany nigdzie indziej? Jest to więc kwestia wyłącznie czytelności, a nie ponownego wykorzystania kodu. Twoje zdrowie :)


title: Jak zrefaktoryzowałbyś zagnieżdżone instrukcje IF?

text: Krążyłem po blogosferze programistycznej, kiedy natknąłem się na ten post o GOTO: http://giuliozambon.blogspot.com/2010/12/programmers-tabu.html Tutaj pisarz opowiada o tym, że „trzeba dojść do wniosku, że tam są sytuacje, w których GOTO tworzą bardziej czytelny i łatwiejszy w utrzymaniu kod”, a następnie pokazuje przykład podobny do tego: if (Check#1) { CodeBlock#1 if (Check#2) { CodeBlock#2 if (Check#3 ) { CodeBlock#3 if (sprawdzenie#4) { CodeBlock#4 if (sprawdzenie#5) { CodeBlock#5 if (sprawdzenie#6) { CodeBlock#6 if (sprawdzenie#7) { CodeBlock#7 } else { reszta programu } } } } } } } Następnie autor proponuje, aby użycie GOTO znacznie ułatwiło czytanie i utrzymanie tego kodu. Osobiście mogę wymyślić co najmniej 3 różne sposoby na spłaszczenie tego i uczynienie tego kodu bardziej czytelnym bez uciekania się do łamania przepływów GOTO. Oto moje dwa ulubione. 1 - Zagnieżdżone małe funkcje. Weź każdy if i jego blok kodu i zamień go w funkcję. Jeśli test logiczny się nie powiedzie, po prostu wróć. Jeśli przejdzie, wywołaj następną funkcję w łańcuchu. (Chłopcze, to brzmi jak rekurencja, czy mógłbyś to zrobić w pojedynczej pętli ze wskaźnikami do funkcji?) 2 - Zmienna Sentinal. Dla mnie to najłatwiejsze. Po prostu użyj zmiennej blnContinueProcessing i sprawdź, czy nadal jest prawdziwa w twoim sprawdzaniu if. Następnie, jeśli sprawdzenie się nie powiedzie, ustaw zmienną na false. Na ile różnych sposobów można zrefaktoryzować ten typ problemu z kodowaniem, aby zredukować zagnieżdżanie i zwiększyć łatwość konserwacji?


title: Tworzenie niektórych metod w większości zawiera wywołania metod, podczas gdy inne wykonują pracę „najniższego poziomu”

text: Więc pomyślałem o tym i nie wiem, czy jest to uwzględnione w jakiejkolwiek metodologii. Myślę, że zaletą tego stylu kodowania jest to, że na najniższym poziomie kod jest niezwykle testowalny, a testy integracyjne również powinny być bardzo łatwe do zbudowania. Myślę też, że dzięki temu kod byłby bardziej czytelny, a język UML byłby szybciej rozumiany. Oto mój przykład: class CoolObject{ var member1; //potrzebne na przykład w zdarzeniach cyklu życia var member2; //ten sam komentarz //Ta metoda może być na przykład obsługą zdarzeń //Zauważ, że zawiera ona tylko przypisania i wywołania metod. Brak wywołań bibliotek lub rzeczy niższego poziomu [public] metoda high_level(params...){ var local_var1; zmienna lokalna_zmienna2; local_var1 = wywołaj metodę niższy_poziom1(param1,param2); local_var2 = wywołaj metodę lower_level2(param1, local_var1); member1 = wywołaj metodę lower_level3(local_var2); } //Zauważ, że zawiera tylko wywołania bibliotek i przetwarzanie niższego poziomu [prywatna] metoda lower_level1(param1, param2){ return param1 + param2 + libraryXXY123.function142(bieżąca_data); } //Zauważ, że zawiera tylko wywołania bibliotek i metodę przetwarzania niższego poziomu [prywatna] lower_level2(param1, param2){ var return_value; loop over param2{ if(condition){ dodaj param1 do return_value; } } return return_value + libraryASDF123.function3132(system_user); } } Proszę zauważyć, że nie jest to napisane w żadnym konkretnym języku, ponieważ chciałem tylko zilustrować koncepcję. Czy znasz jakieś metodologie, które tego używają lub ostrzegają przed tym? Proszę rozwinąć odpowiedź, ponieważ uważam, że byłby to dobry pomysł i chciałbym, aby to zostało potwierdzone lub odwrotnie.


title: Jak poradzić sobie z „rozgałęzionym” antywzórem grotu strzały?

text: Niedawno przeczytałem to pytanie, które zawiera antywzór strzałki. Mam coś podobnego w kodzie, który próbuję refaktoryzować, z wyjątkiem tego, że rozgałęzia się. Wygląda to mniej więcej tak: if(fooSuccess==true&&barSuccess!=true){ if(mooSuccess==true){ ..... }else if (mooSuccess!=true){ ..... } }else if(fooSuccess!=true&&barSuccess==true){ if(mooSuccess==true){ ..... }inaczej if (mooSuccess!=true){ if(cowSuccess==true){ ..... }w przeciwnym razie (cowSuccess!=true){ ..... } } } ...... W skrócie wygląda to tak if if if zrób coś endif else if if if zrób coś endif endif else if if zrób coś endif endif endif Zarys zapożyczony z artykułu Coding Horror na ten temat A kod przechodzi przez różne kombinacje prawdy i fałszu dla różnych flag. Te flagi są ustawiane gdzieś „na górze” w kodzie w innym miejscu, albo przez dane wejściowe użytkownika, albo przez wynik jakiejś metody. Jak mogę uczynić ten kod bardziej czytelnym? Moim zamiarem jest to, że w końcu będę miał obiekt typu Bean, który będzie zawierał wszystkie opcje, które poprzedni programista próbował przechwycić za pomocą tego antywzorca rozgałęziającego. Na przykład, jeśli w zarysie powyższego kodu naprawdę mamy tylko trzy, mam ustawione wyliczenie wewnątrz tego ziarna: enum ProgramRouteEnum{ OPTION_ONE,OPTION_TWO,OPTION_THREE; wybór logiczny; void setChoice(boolean myChoice){ choice = myChoice; } boolean getChoice(){ return wybór; } } Czy to akceptowalne lekarstwo? A może jest lepszy?


title: Używanie funkcji dla nigdy nie powtarzanego kodu

text: Jakie są najlepsze praktyki używania funkcji do dzielenia dużych bloków kodu na dyskretne fragmenty logiki, gdy te funkcje będą używane tylko raz w okresie istnienia funkcji? Kanonicznym przykładem tworzenia stron internetowych jest inicjalizacja strony głównej. Po załadowaniu strony możesz na przykład sprawdzić niektóre dane uwierzytelniające i uwierzytelnienie, wykonać wywołanie interfejsu API, aby uzyskać dane, i przeanalizować te dane. Oczywiście wszystko to może być napisane w formacie proceduralnym w dużej funkcji o nazwie initialize(). Żadna logika nie zostanie ponownie wykorzystana nigdzie indziej w programie. Kiedy mam do czynienia z takimi scenariuszami, moim początkowym instynktem jest podzielenie każdego kawałka logiki na funkcję dyskretną i po prostu wywołanie funkcji z funkcji initialize(), z kilkoma linijkami kodu w ramach Initialize() wykonujących pewne czyszczenie i zburzyć obowiązki. Miałbym więc coś w rodzaju funkcji authentication(), get_data() i parse_data(), a także być może kilka funkcji pomocniczych dla funkcji głównych. Moim zdaniem sprawia to, że kod jest łatwiejszy do zrozumienia z wysokiego poziomu, testy jednostkowe są bardziej sensowne i pomaga uporządkować myślenie podczas pisania kodu. Jednak ostatnio starłem się z facetem, który zasadniczo myśli odwrotnie. Uważa, że zbyt wiele funkcji prowadzi do „irytującego przeskakiwania”, funkcje nigdy nie powinny być używane, jeśli kod nie będzie ponownie używany, a nadmierne użycie funkcji/klas/modułów/jakiegokolwiek rodzaju modułowości jest równoznaczne z Inżynieria. Byłem zniechęcony jego argumentem i czułem, że prowadzi to do gównianego proceduralnego PHP, który tak często sprawia, że tworzenie stron internetowych staje się koszmarem, ale może jest jakaś zasadność w tym, co mówi?


title: Czy powinienem powtórzyć kod sprawdzania warunków, czy umieścić go w funkcji?

text: Mam kilka wywołań metody, która może lub nie musi być wykonana w zależności od tego, czy niektóre funkcje są włączone, czy nie. W związku z tym umieściłem te wywołania w blokach `if`, sprawdzając włączone statusy. Argumenty metody w każdym z tych wywołań używają długich nazw zmiennych, więc podzieliłem je na różne wiersze, aby zapewnić ich czytelność / zgodność z naszym standardem kodowania długości wiersza. Te duże bloki wywołania metody, w połączeniu z sprawdzaniem warunku, aby sprawdzić, czy powinny zostać uruchomione (pogorszone przez nakaz, że wszystkie bloki `if` umieszczamy w nawiasach klamrowych), są dość hałaśliwe. Mam więc coś takiego: if (FeatureSettings.FeatureXIsEnalbed) { this.TheMethodImCalling( FeatureSettings.ReallyLongFeatureXSettingAName, FeatureSettings.ReallyLongFeatureXSettingBName, ...); } if (FeatureSettings.FeatureYIsEnalbed) { this.TheMethodImCalling( FeatureSettings.ReallyLongFeatureYSettingAName, FeatureSettings.ReallyLongFeatureYSettingBName, ...); } if (FeatureSettings.FeatureZIsEnalbed) { this.TheMethodImCalling( FeatureSettings.ReallyLongFeatureZSettingAName, FeatureSettings.ReallyLongFeatureZSettingBName, ...); } Aby zredukować szum i nadmiarowość w tym kodzie, myślałem o wzięciu struktury blokowej `if` i umieszczeniu jej _wewnątrz_ `TheMethodImCalling`, a następnie przekazaniu wartości `...IsEnabled` wraz z resztą argumentów. Wydaje się to jednak trochę głupie, ponieważ skutecznie wywołałbym metodę i powiedział: „Nic nie rób”. gdy funkcja nie została włączona. Teraz prawdopodobnie mógłbym uczynić kod nieco bardziej czytelnym, przypisując długie ustawienia do krótszych zmiennych tymczasowych lub nawet pól klasy `Arguments`, które następnie przekazałbym do metody, ale to nie rozwiązuje podstawowego pytania: * *Czy powinienem powtórzyć kod sprawdzania warunku, czy umieścić go w funkcji?** Czy jest alternatywa, którą powinienem rozważyć? (Obie opcje wydają się nieco śmierdzące...)


title: Jaki jest lepszy wzorzec (styl kodowania) do walidacji argumentów — przeszkoda (bariera) czy ogrodzenie?

text: Nie wiem, czy są jakieś akceptowane nazwy dla tych wzorców (lub anty-wzorców), ale lubię je nazywać tak, jak ja je tutaj nazywam. Właściwie byłoby to **Pytanie 1:** Jakie są akceptowane nazwy tych wzorców, jeśli w ogóle? Załóżmy, że istnieje metoda, która akceptuje kilka parametrów i musisz sprawdzić, czy dane wejściowe są nieprawidłowe przed wykonaniem właściwego kodu metody: public static void myMethod (String param1, String param2, String param3) ## Hurdle Style Nazywam to tak, ponieważ jest jak płotki biegacz musi przeskoczyć, aby dostać się do mety. Możesz też myśleć o nich jako o barierach warunkowych. { if (param1 == null || param1.equals("")) { // niektóre logowanie w razie potrzeby return; // lub wyrzuć jakiś Wyjątek lub zmień wartość domyślną } if (param2 == null || param2.equals("")) { // Zostawię komentarze na zewnątrz return; } if (param3 == null || param3.equals("")) { return; } // Tu znajduje się aktualny kod metody. } Gdy kontrole dotyczą pewnej małej sekcji w większej metodzie (a sekcji nie można przenieść do mniejszej metody prywatnej), można użyć bloków oznaczonych instrukcjami `break`: { // kod metody przed blokiem myLabel: { jeśli (param1 ... // Resztę pominę dla zwięzłości break myLabel; if (param2 ... break myLabel; ... // kod działający na prawidłowym wejściu idzie tutaj } // 'break myLabel' tutaj zakończy się // kod metody za blokiem } ## Styl ogrodzenia Otacza kod ogrodzeniem, które ma bramkę warunkową, która musi zostać otwarta, aby można było uzyskać dostęp do kodu.Zagnieżdżone ogrodzenia oznaczałyby więcej bramek, aby dotrzeć do kodu (jak rosyjska lalka) . { if (param1 != null && !param1.equals("")) { if (param2 != null && !param2.equals("")) { if (param3 != null && !param3.equals("" )) { // Tu znajduje się aktualny kod metody. } else { // trochę logowania tutaj } } else { // trochę logowania tutaj } } else { // trochę logowania tutaj } } Można to również przepisać w następujący sposób. Instrukcje rejestrowania znajdują się tuż obok kontroli, a nie po rzeczywistym kodzie metody. { if (param1 == null || param1.equals("")) { // trochę logowania tutaj } else if (param2 == null || param2.equals("")) { // trochę logowania tutaj } else if (param3 == null || param3.equals("")) { // trochę logowania tutaj } else { // aktualny kod metody jest tutaj. } } **Pytanie 2:** Który styl jest lepszy i dlaczego? **Pytanie 3:** Czy istnieją inne style? > Osobiście wolę _styl przeszkodowy_, ponieważ wygląda bardziej na oczy i > nie wcina się w prawo za każdym razem, gdy pojawia się nowy parametr. Pozwala na przerywany kod między sprawdzeniami i jest schludny, ale > jest też trochę trudny w utrzymaniu (kilka punktów wyjścia). > > Pierwsza wersja _stylu ogrodzenia_ szybko robi się naprawdę brzydka przy dodawaniu > parametrów, ale przypuszczam, że jest również łatwiejsza do zrozumienia. Chociaż druga wersja jest lepsza, może zostać przypadkowo zepsuta przez przyszłego programistę i nie zezwala na kod przerywany między sprawdzeniami warunkowymi.


title: Czy ten wzór jest zły?

text: Zauważyłem, że kiedy koduję, często używam wzorca, który wywołuje metodę klasy i ta metoda wywołuje szereg funkcji prywatnych w tej samej klasie, aby wykonać pracę. Funkcje prywatne robią tylko jedną rzecz. Kod wygląda tak: public void callThisMethod(MyObject myObject) { methodA(myObject); metodaB(mójObiekt); // był mehtodB wcześniej } private void methodA(MyObject myObject) { //zrobienie czegoś } private void methodB(MyObject myObject) { //zrobienie czegoś } Czasami istnieje 5 lub więcej metod prywatnych, w przeszłości niektóre prywatne metody do innej klasy, ale zdarzają się sytuacje, w których powodowałoby to niepotrzebną złożoność. Głównym powodem, dla którego nie podoba mi się ten wzorzec, jest to, że nie jest on zbyt testowalny, chciałbym móc testować wszystkie metody pojedynczo, czasami upubliczniam wszystkie metody, abym mógł pisać dla nich testy. Czy istnieje lepszy projekt, którego mogę użyć?


title: Jak radzić sobie ze złożonymi warunkami?

text: Pracujemy nad projektem, w którym musimy zarządzać tymi warunkami. tj.: Użytkownik może zapisać zamówienie pod następującymi warunkami: * Użytkownik posiada uprawnienie „ZapiszZamówienie” * Zamówienie jest w stanie „wysłane” * Sklep internetowy jest otwarty. Warunek ten jest na przykład - chciałbym zaznaczyć, że mamy trzy warunki z różnych obszarów (rola i uprawnienia, wewnętrzny stan porządku obiektów i stan innego obiektu domeny). W poprzednim projekcie użyliśmy tego kodu: public static bool CanSaveOrder(Order order) { return CurrentPrincipal.HasPermission(Permissions.SaveOrder) && order.State == States.Shipped && OnlineShop.IsOpen(); } Ale czuję, że może istnieć bardziej eleganckie/dynamiczne rozwiązanie. Czytałem coś o „silniku roli biznesowej”. Czy to właściwy sposób na radzenie sobie z tym stanem?


title: wywoływanie metod, jeśli poprzednie wywołanie zakończyło się sukcesem

text: I mój program c# muszę wykonać 5 kroków (zadań) sekwencyjnie. w zasadzie te pięć powinno wykonywać się jedna po drugiej, tylko poprzednie wykonane zadanie jest sukcesem. Obecnie robię to w następującym stylu. Ale to nie jest dobry styl kodu do naśladowania. var isSuccess=false; isSuccess=a.metoda1(); if(isSuccess) isSuccess=a.metoda2(); if(isSuccess) isSuccess=a.metoda3(); if(isSuccess) isSuccess=a.metoda4(); if(isSuccess) isSuccess=a.metoda5(); Jak mogę ponownie rozłożyć ten kod. Jaka jest najlepsza droga, którą mogę podążać?


title: Funkcje jednowierszowe wywoływane tylko raz

text: Rozważmy funkcję bez parametrów ( _edit:_ niekoniecznie), która wykonuje pojedynczy wiersz kodu i jest wywoływana tylko raz w programie (chociaż nie jest wykluczone, że będzie potrzebna ponownie w przyszłości). Może wykonać zapytanie, sprawdzić niektóre wartości, zrobić coś z regexem... cokolwiek niejasnego lub "hacky". Uzasadnieniem tego byłoby uniknięcie trudno czytelnych ocen: if (getCondition()) { // do stuff } gdzie `getCondition()` jest funkcją jednowierszową. Moje pytanie jest proste: czy to dobra praktyka? Wydaje mi się, że to w porządku, ale nie wiem na dłuższą metę...


title: Który styl kodowania jest preferowany do walidacji i powrotu z metody?

text: Który z poniższych jest preferowanym stylem kodowania (w c# .net) public void DoWork(Employee worker) { if(employee == null) return; if(!string.IsNullOrEmpty(pracownik.Nazwa)) return; // Wykonuj pracę } **or** public void DoWork(Pracownik pracownik) { if(employee != null && !string.IsNullOrEmpty(employee.Name)) { // Wykonuj pracę } }


title: Czy używanie podprocedur do logicznego oddzielenia mojego kodu to zły pomysł na programowanie strukturalne?

text: Większość mojego doświadczenia w programowaniu dotyczy OOP, gdzie w pełni zaakceptowałem jego koncepcje, w tym enkapsulację. Teraz wracam do programowania strukturalnego, gdzie mam tendencję do logicznego rozdzielania kodu za pomocą podprocedur. Na przykład, jeśli mam dużą obudowę przełącznika (30 przypadków lub więcej), umieszczę to w jego własnej procedurze, aby główna metoda wyglądała trochę „ładniej”. Ogólnie rzecz biorąc, podprocedury są używane, aby pomóc utrzymać rzeczy w stanie _SUCHYM_ , ale w niektórych przypadkach te logiczne separacje, które tworzę, zwykle są używane tylko raz. Część mojego kodu była sprawdzana i wspomniano, że to zły pomysł. Jego poparcie dla tego twierdzenia jest takie, że zamula wodę i „niepotrzebnie ukrywa” kod. Zamiast tego upiera się, że podprocedura MUSI być użyta więcej niż raz, aby zasłużyć na zrobienie podprocedury z sekcji kodu. Chociaż idea „ukrywania kodu” jest powszechnym miejscem w programowaniu OOP, przyznaje, że ma niewiele lub wcale nie rozumie koncepcji OOP i kiedykolwiek pracował tylko z programowaniem strukturalnym. **Czy jest jakieś poparcie dla jego twierdzenia, czy jest to tylko programowy dogmat?**


title: Zawsze wyciągaj wspólne przypadki i rozgałęziaj osobno?

text: Mieliśmy nieporozumienie podczas przeglądu kodu. Co napisałem: if(unimportantThing().isGood && previousCalculatedIndex != -1) { //Stuff } if(otherThing().isBad && previousCalculatedIndex != -1) { //InneThing().isBad ) { //Stuffystuff } Recenzent nazwał ten brzydki kod. Oczekiwał tego: if( poprzednioWyliczonyIndeks != -1) { if(nieważnaRzecz().jestDobra) { //Rzeczy } if(innaRzecz().jestZła) { //InnaRzecz } } if(jeszczeInnaRzecz().jestZła) { //Stuffystuff } Powiedziałbym, że to dość trywialna różnica, a złożoność dodawania kolejnej warstwy rozgałęzień jest równie zła, jak jeden lub dwa logiczne i. Ale żeby się sprawdzić, czy to naprawdę ciężki grzech kodowania, wobec którego zająłbyś zdecydowane stanowisko? Czy _zawsze_ wyciągasz typowe przypadki w swoich instrukcjach if i rozgałęziasz je osobno, czy też dodajesz logiczne i do kilku instrukcji if?


title: Co oznacza skryptowanie gry (Lua)?

text: Czytałem, że Lua jest często używana do wbudowanych skryptów, aw szczególności gry do skryptów. Trudno mi sobie wyobrazić, jak dokładnie jest używany. Czy możesz opisać, dlaczego i dla jakich funkcji i dla jakich odbiorców jest używany? To pytanie nie dotyczy konkretnie Lua, ale raczej wszelkich wbudowanych skryptów, które służą _celowi podobnemu do skryptów Lua_. Czy jest używany przez użytkowników końcowych do wprowadzania niestandardowych dostosowań? Czy jest używany przez twórców gier, aby przyspieszyć tworzenie logiki gry (poziomy, sztuczna inteligencja, ...)? Czy jest używany do skryptowania kodu frameworka do gier, ponieważ skrypty mogą być szybsze? W zasadzie zastanawiam się, jak głęboko między prostą konfiguracją a logiką frameworka sięga takie użycie skryptów. I ile robi się skryptów. Kilka linii konfiguracyjnych czy spora ilość?


title: Zrekonstruuj plik ze strumienia TCP

text: Mam klienta i serwer oraz trzecie pudełko, które widzi wszystkie pakiety od serwera do klienta (ale nie na odwrót). Teraz, gdy klient zażąda pliku z serwera (przez HTTP), odpowiedź zostanie wyświetlona w trzecim polu. Próbuję tam zrekonstruować plik. Używam `libpcap` do przechwytywania datagramów TCP i próbuję zrekonstruować tam plik. Oto co zrobiłem 1. Nasłuchiwanie pakietów na interfejsie 2. Grupowanie wszystkich pakietów o tym samym numerze ACK 3. Sortowanie grupy według numeru SEQ 4. Wyodrębnianie danych z każdego pakietu, łączenie ich i zapisywanie na dysku Problem oznacza to, że wygenerowany w ten sposób plik nie jest dokładnie taki sam jak oryginalny plik. Ich rozmiary są takie same, ale kiedy otwieram obrazy w przeglądarce obrazów, wyglądają inaczej. czas Czy wszystko tutaj brzmi dobrze? **EDYTUJ** Zrzut szesnastkowy pierwszych 512 bajtów odzyskanego pliku 0000000 009a 0095 0090 008b 0086 0081 007c 0077 0000010 0072 006d 0068 0063 005e 0059 0054 004f 0000020 004a 0045 0040 003b 0037 0032 002d 0028 0000030 0023 001 000a 00019 0014 006 0000040 0400 0000 0000 0000 7276 6375 5420 4352 0000050 0000 0000 6720 7369 0000 0000 0000 0000 0000060 0000 0000 0002 0000 028f 0000 0000 0000 0000070 0001 0000 0000 0000 6173 6d65 1fe7 0057 0000080 0000 0050 0956 004e1 00000 000 0000c 5 130b 0004 edcc 0003 00000a0 cf14 0010 5f2e 0014 a4fe 0013 0000 0000 00000b0 6577 7669 0000 0000 0000 0000 0000 0000 00000c0 0000 0000 0000 0000 0000 0000 2e31 2d32 00000d0 3636 3139 4336 4945 6e20 2069 656e6969 656e 6572 6566 2c52 0000 0000 0000 0000 0000100 0000 3100 322e 362d 3936 3631 4543 2049 0000110 696e 6e20 696f 6974 6e64 436f 6720 696e 0000120 6577 5669 6520 6e63 7265 6665 5265 002c 0000130 0000 0000 0000 7363 6465 0000 0000 0000140 0000 0000 0000 0000 0000 0000 0000 0000 0000150 4742 7352 2d20 6520 6163 7370 7220 6f75 0000160 6f6c 2064 20000 364236 2 3139 2036 4543 2e49 0000 0000180 0000 0000 0000 0000 4200 5247 2073 202d 0000190 6365 7061 2073 7572 6c6f 636f 4220 5247 00001a0 7420 756c 6661 4465 3120 322e 362d 3936 00001b0 3631 4320 4945 002e 0000 0000 0000 0000 0000 73650000 0000 0000 0000 00001d0 0000 0000 0000 0000 0000 0000 0000 0000 * 00001f0 6368 632e 6965 772e 7777 2f2f 703a 7474 0000200 Zrzut heksadecymalny pierwszych 512 bajtów oryginalnego pliku: 0000000 d8ff e0ff 1000 464a 4649 0100 0101 2c01 0000010 432ff01 643 0000 500 0045 0101 0000 5d1c 694c 6f6e 1002 0000030 0000 6e6d 7274 4752 2042 5958 205a ce07 0000040 0200 0900 0600 3 100 0000 6361 7073 534d 0000050 5446 0000 0000 4549 2043 5273 4247 0000 0000060 0000 0000 0000 0000 0000 0000 d6f6 0100 0000070 0000 0000 2dd3 5048 2020 0000 0000 0000 0000080 0000 0000 0000 0000 0000 0000 0000 0000 * 1000000000a 740000 0000 0000 00000b0 5001 0000 3300 6564 6373 0000 8301 0000 00000c0 6c00 7477 7470 0000 ef01 0000 1400 6b62 00000d0 7470 0000 0302 0000 1400 5872 5a59 0000 00000e0 1702 0000 1400 5867 5a59 0000 2b02 0000 00000e6402 0000 60000 602f 0000 7000 6d64 6464 0000 0000110 c302 0000 8800 7576 6465 0000 4b03 0000 0000120 8600 6976 7765 0000 d103 0000 2400 756c 0000130 696d 0000 f503 0000 1400 656d 7361 0000 0000140 0904 0000 2400 6574 6863 0000 4350d04000 0000 0000 0000160 4352 0000 450c 0000 0c08 5462 4352 0000 0000170 5114 0000 0c08 6574 7478 0000 0000 6f43 0000180 7970 6972 6867 2074 63 28 2029 3931 3839 0000190 4820 7765 656c 7474 502d 6361 616b 6472 00001a0 4320 6d6f 6170 796e 6400 7365 0063 0000 00001b0 0000 0000 7312 4752 2042 4549 3643 3931 00001c0 3636 322d 312e 0000 0000 0000 e0 0000 2 0000 0000 0000 0000 31 2e32 0031 0000 0000 0000 0000 0000 0000 00001f0 0000 0000 0000 0000 0000 0000 0000 0000 0000200 Trochę więcej szczegółów: 1. Używam C++ 2. Dane pakietowe są przechowywane jako `std::vector<char>` 3. Zrobiłem zmienić kolejność bajtów podczas odczytu numeru ack i seq number z pakietu za pomocą `ntohl` 4. Nie jestem pewien, czy muszę również zmienić kolejność bajtów dla danych. Próbowałem odwrócić dane z każdego pakietu przed ich połączeniem, nawet to nie działało. Czy czegoś mi brakuje? **EDIT** Oryginalny plik: ![Oryginalny](http://i.stack.imgur.com/rlLU4.jpg) Odzyskany plik: ![Odzyskany](http://i.stack.imgur.com/8blIG .jpg)


title: Fizyczne skutki długotrwałego używania klawiatury – co mówi nauka i jakie czynniki na to wpływają?

text: To pytanie dotyczy ergonomii konkretnej klawiatury przy długich godzinach programowania, chciałbym wiedzieć o ergonomii korzystania z klawiatury w ogóle. Jakie są najważniejsze zagrożenia z tym związane i jak najlepiej je złagodzić? Czy „ergonomiczna” konstrukcja klawiatury ma znaczenie, a jeśli tak, to która konstrukcja jest najbardziej efektywna? Jeśli nie, czy inne czynniki, takie jak podparcie nadgarstków, regularne ćwiczenia lub odpowiednia wysokość krzesła lub biurka, mają znaczenie? Czy masz jakieś bezpośrednie doświadczenia z problemami wynikającymi z używania klawiatury, a jeśli tak, jak je rozwiązałeś? Czy jest jakaś dobra nauka na ten temat, a jeśli tak, to na co ona wskazuje? Zredagowano, aby dodać: Wikipedia sugeruje, że nie ma udowodnionych zalet „ergonomicznych” klawiatur, ale ich cytowanie wydaje się dość stare – czy to wciąż aktualny stan gry?


title: Jak skonfigurować regułę c++ trzech w wirtualnej klasie bazowej?

text: Próbuję stworzyć czystą wirtualną klasę bazową (lub symulowaną czysto wirtualną) mój cel: 1. Użytkownik nie może tworzyć wystąpień BaseClass. 2. Klasy pochodne muszą zaimplementować domyślny konstruktor, konstruktor kopiujący, operator przypisania kopii i destruktor. Moja próba: class Base { public: virtual ~Base() {}; /* kilka czystych funkcji wirtualnych */ private: Base() = default; Podstawa(const Podstawa& podstawa) = default; Podstawa& operator=(const Podstawa& podstawa) = default; } Daje to pewne błędy narzekające, że (po pierwsze) konstruktor kopiujący jest prywatny. Ale nie chcę, aby ten naśladowany konstruktor był wywoływany. Czy ktoś może podać mi prawidłową konstrukcję, aby to zrobić, jeśli jest to w ogóle możliwe?


title: Które miejsca w Internecie są popularne w przypadku komercyjnych ogłoszeń dotyczących produktów Java?

text: W przypadku bibliotek Java (które pisałem w ostatnich latach) nie znalazłem w Internecie zbyt wielu miejsc, w których programiści mogliby ogłaszać nowe wydania. W tej chwili korzystam więc z płatnych reklam (kampanie banerowe). Czy istnieją znane i popularne fora internetowe lub grupy dyskusyjne, które zachęcają do reklamowania produktów dla platformy Java?


title: Jak radzić sobie z manipulacją danymi po zapisaniu rekordu bazy danych spoza mojego programu?

text: Napisałem aplikację webową do zarządzania magazynem. Aplikacja obsługuje kompletację partii, wyznaczanie tras magazynowych, pakowanie, a ostatni element jest obsługiwany przez UPS Worldship w celu „wysyłania” paczek. Po każdej wysyłce lub unieważnieniu Worldship wypisze rekord do mojego postgres db. Potrzebuję sposobu, aby wyraźnie zobaczyć, że rekord został napisany/usunięty, a następnie „zrobić rzeczy”. Prostą odpowiedzią jest posiadanie programu po prostu monitorującego bazę danych, a kiedy widzi rekord napisany, aby wykonać swoje zadanie, ale coś mnie dręczy, że prawdopodobnie istnieje lepszy sposób na to, że nie ma programu odpytującego tabelę i porównując to z tym, co było ostatnio. EDYCJA: Jak zamierzałem podejść do tego ... Tabela jest skonfigurowana z polem stanu. Mój program co pewien czas odczytywałby tabelę dla wszystkich rekordów, które mają status null, jeśli rekordy zostaną znalezione „do rzeczy”, a następnie oznaczy status jako zakończony. TIA


title: randomizowane zarządzanie?

text: Widziałem artykuł kilka miesięcy temu, który wyjaśnia praktykę firmy polegającą na losowym wyborze zarządzania poprzez loterię. Pracownik miał zarządzać swoimi rówieśnikami przez określony czas, aż do następnej loterii kierowniczej. Autor szczegółowo wyjaśnił, dlaczego działa to lepiej niż tradycyjny model eksperta-menedżera. Zupełnie nie pamiętam, gdzie to przeczytałem i nie mogę uzyskać przydatnych wyników od Google. Czy ktoś pamięta, że to widział? Naprawdę chciałbym go ponownie znaleźć. \--bryknięcie


title: Czy nie powinniśmy liczyć znaków kodu i komentarzy zamiast wierszy kodu i komentarzy?

text: Liczenie wierszy kodu i komentarzy jest czasami fałszywe, ponieważ większość tego, co piszemy, może być napisane w jednej lub kilku wierszach, w zależności od ograniczeń liczby kolumn, rozmiaru ekranu, stylu i tak dalej. Ponieważ powszechnie używane języki (powiedzmy C, C++, C# i Java) są wolne, czy nie byłoby sprytniej zamiast tego liczyć znaki? **Edycja:** Nie rozważam programowania zorientowanego na LOC, w którym koderzy próbują sztucznie dopasowywać wymagania, dodając nieistotne komentarze lub używając wielu wierszy, w których wystarczyłoby mniej (lub odwrotnie). Interesują mnie lepsze metryki, niezależne od stylu kodowania, do wykorzystania przez uczciwych programistów.


title: Co zapewnia dobry przepływ pracy JIRA z zespołem programistycznym?

text: Przenoszę mój zespół z klątwy źle zarządzanych dokumentów Excela, indywidualnych list kontrolnych i osobistych wiadomości e-mail, aby zarządzać naszymi problemami z aplikacjami i zadaniami programistycznymi do nowego projektu JIRA. Mój zespół i ja jesteśmy nowicjuszami w JIRA (i ogólnie wydajemy oprogramowanie śledzące). Mój zespół jest w najlepszym razie sceptycznie nastawiony do przejścia, więc staram się ich nie odstraszyć, wprowadzając na początku coś zbyt skomplikowanego. Rozumiem, że jedną z mocnych stron JIRA są dostosowane przepływy pracy, które można utworzyć dla projektu. Przejrzałem dokumentację JIRA i wiele samouczków i nie mam nic przeciwko tworzeniu przepływów pracy, ale potrzebuję kontekstowego, co z tym zrobić. * _Co sprawia, że dany przepływ pracy działa dobrze?_ * _Jak wygląda źle zaprojektowany przepływ pracy?_ * _Jakie są zalety/wady ścisłego przepływu pracy z bardzo określonymi stanami i przejściami do luźniejszego przepływu pracy, z mniejszą liczbą szerzej zdefiniowanych stanów i przejścia_


title: Czy istnieją określone przepływy pracy lub wzorce projektowe, które są powszechnie używane do tworzenia dużych aplikacji do programowania funkcjonalnego?

text: Od jakiegoś czasu eksploruję Clojure, chociaż nie używałem go w żadnych niebanalnych projektach. Zasadniczo po prostu oswoiłem się ze składnią i niektórymi idiomami. Pochodzę ze środowiska OOP, a Clojure jest pierwszym językiem funkcjonalnym, w który bardzo się przyjrzałem, naturalnie nie czuję się tak dobrze z funkcjonalnym sposobem robienia rzeczy. To powiedziawszy, czy istnieją jakieś konkretne przepływy pracy lub wzorce projektowe, które są wspólne z tworzeniem dużych aplikacji funkcjonalnych? Bardzo chciałbym zacząć używać programowania funkcyjnego „na serio”, ale obawiam się, że przy moim obecnym braku wiedzy zaowocuje to epicką porażką. „Gang of Four” jest takim standardem dla programistów OO, ale czy jest coś podobnego, bardziej ukierunkowanego na paradygmat funkcjonalny? Większość zasobów, które znalazłem, ma świetne bryłki programowania, ale nie cofają się, aby dać szerszy, bardziej architektoniczny wygląd.


title: Zachowanie Javascript zależy tylko od przeglądarki lub przeglądarki + systemu operacyjnego?

text: Ogólnie rzecz biorąc, w przypadku aplikacji JavaScript kompatybilność jest określana w kategoriach typów przeglądarek i obsługiwanych przez nią wersji przeglądarek. Struktury/biblioteki, takie jak ExtJs, również wspominają o wersjach przeglądarek, z którymi są kompatybilne. **Czy to oznacza, że jeśli moja aplikacja javascript może działać w wersji Google Chrome 10+, to każdy system operacyjny, na którym można zainstalować Google Chrome 10+, będzie mógł uruchomić moją aplikację javascript bez żadnych usterek?** A może rodzaj działania system ma również wpływ na wykonanie Javascript? Powodem zadawania tego pytania jest ocena zakresu testowania aplikacji JavaScript przed podjęciem jakichkolwiek zobowiązań wobec użytkownika końcowego. Z góry dziękuję za wszelkie wskazówki.


title: Jak większość programów do synchronizacji monitoruje zmiany w plikach?

text: Czy programy do synchronizacji, takie jak Dropbox, zazwyczaj śledzą zmiany plików, porównując bajt po bajcie, używając skrótów lub używając `diff`/przechowywanie lokalnych dzienników zatwierdzenia, takich jak kontrola wersji, czy co?


title: Idea głównego twierdzenia o wyszukiwaniu binarnym

text: Ten link naprawdę dostarczył pewnych informacji na temat idei, że wyszukiwanie binarne implikuje problemy z optymalizacją, podając główne twierdzenie. Nie jestem do końca przekonany, czy rozumiem sugerowane tam główne twierdzenie. Czy są jakieś proste wyjaśnienia dla pomysłów wyrażonych w tym samouczku?


title: Programowanie par, gdy kierowca i obserwator mają różne poziomy umiejętności i doświadczenie

text: Wiem, że programowanie w parach to zwinna technika tworzenia oprogramowania, w której dwóch programistów pracuje razem na jednej stacji roboczej. Jeden, kierowca, pisze kod, podczas gdy drugi, obserwator, przegląda każdy wiersz kodu podczas wpisywania. Ale zastanawiam się, że strategia nadal działa w tym przypadku. Na przykład * jeśli mają bardzo różny poziom umiejętności programowania. * jeśli jeden nigdy nie doświadczył w dziedzinie problematycznej, podczas gdy inny miał. * Czy nadal jest w porządku, jeśli mają niski poziom umiejętności programowania? Czy możesz zaproponować strategię programowania w parach w powyższym przypadku?


title: Który wzorzec projektowy byłby najlepszy w tym przypadku?

text: Obecnie mam klasę o nazwie PolicyProvider z następującym (skróconym) interfejsem: public interface IPolicyProvider { List<Policy> GetRenewalPolicies(Client client, int financialYear); } Cel jest dość oczywisty - co roku ubezpieczenie odnawia się dla klienta, a klient dostanie szereg nowych polis. Chodzi o to, że polityka zmienia się z roku na rok. Dlatego też konkretna implementacja klasy musi być zmieniana co roku (lub poprawiana z dużą ilością brzydkich małych „jeśli” oceniających rok finansowy). Widzę, że z czasem stanie się to przerażające. W takim przypadku, jaki wzorzec projektowy jest najbardziej odpowiedni?


title: Co powiesz podczas przeglądu kodu, gdy druga osoba zbuduje zbyt skomplikowane rozwiązanie?

text: Któregoś dnia sprawdziłem kod, który napisał ktoś z mojego zespołu. Rozwiązanie nie było w pełni funkcjonalne, a projekt był zbyt skomplikowany – co oznacza, że przechowywał niepotrzebne informacje, budował niepotrzebne funkcje i zasadniczo kod był niepotrzebnie skomplikowany, jak pozłacanie i próbował rozwiązać problemy, które nie istnieją. W tej sytuacji pytam "dlaczego tak to zrobiono?" Odpowiedź brzmi: druga osoba miała ochotę zrobić to w ten sposób. Następnie pytam, czy którakolwiek z tych funkcji była częścią specyfikacji projektu, czy może przydać się użytkownikowi końcowemu, lub czy jakiekolwiek dodatkowe dane zostałyby przedstawione użytkownikowi końcowemu. Odpowiedź brzmi nie. Więc sugeruję, aby usunął całą niepotrzebną złożoność. Odpowiedź, którą zwykle otrzymuję, brzmi „no cóż, to już zrobione”. Uważam, że nie jest to zrobione, jest zabugowane, nie robi tego, czego chcą użytkownicy, a koszt utrzymania będzie wyższy niż w przypadku prostszego sposobu, który sugerowałem. Podobny scenariusz to: Kolega spędza 8 godzin na ręcznej refaktoryzacji kodu, co mogło zostać wykonane automatycznie w Resharper w ciągu 10 sekund. Oczywiście nie ufam ręcznej refaktoryzacji, ponieważ jest wątpliwej jakości i nie jest w pełni przetestowana. Znowu odpowiedź, którą otrzymuję, brzmi: „no cóż, to już zrobione”. Jaka jest właściwa odpowiedź na tę postawę?


title: DDD — obiekt domeny wywołujący usługę sieciową

text: Czy można wywoływać usługę internetową z obiektu domeny?. Pisząc pytanie, myślę, że nigdy nie powinieneś tego robić, ponieważ jest to kiepski projekt, ale sytuacja jest następująca: Mam obiekt domeny o nazwie Postman, który bardzo ściśle współpracuje z obiektem Message. Ta wiadomość jest dostarczana przez usługę sieciową. Bez Message obiekt Postman nie mógłby wykonywać swojej logiki biznesowej. Rozumiem, że ten kod nie pachnie dobrze, ale ponieważ listonosz zależy od wiadomości, wydaje się logiczne, aby zadzwonić do usługi sieciowej w celu uzyskania wiadomości. Nie ma innego sposobu na otrzymanie wiadomości bez usługi sieciowej.


title: Czy mogę używać select2 na mojej stronie?

text: Pracuję nad projektem zajmującym się obsługą klienta. Ta strona faktycznie sprzedaje produkty (więc jest komercyjna) i zapewnia obsługę klienta. Tak więc w tym projekcie/stronie miałem zamiar użyć select2 . Licencja Select2: > To oprogramowanie jest objęte licencją Apache w wersji 2.0 („Apache > Licencja”) lub Powszechnej Licencji Publicznej GNU w wersji 2 („Licencja GPL”). > Możesz wybrać jedną z licencji regulujących korzystanie z tego oprogramowania tylko pod > warunkiem, że akceptujesz wszystkie warunki Licencji Apache > lub Licencji GPL. Czy mogę to wykorzystać na stronie? Zapytaj mnie, czy wymagane są również inne informacje.


title: Jaki jest najlepszy sposób konstruowania dokumentów CSS?

text: Normalnie zaczynam pracę nad projektem na stronie, robię podstawowy szkielet html, a następnie zaczynam dostosowywać style za pomocą CSS. Powoli dodawałbym po prostu jedną regułę CSS po drugiej, bez „zorganizowanej struktury” lub grupowania w regułach CSS. A pod koniec projektu patrzę na dokument CSS i ohydę, którą stworzyłem. Często spędzam trochę czasu na szukaniu miejsca w dokumencie, w którym dodałem określony styl. Czy istnieje jakiś rodzaj „zasady kciuka”, której można użyć przy układaniu i porządkowaniu dokumentów CSS? I nie mówię tylko o dodawaniu komentarzy...


title: Jak sprawić, by aplikacja internetowa oparta na chmurze była dostępna wewnętrznie w przypadku awarii Internetu?

text: Mam aplikację Java Web wspieraną przez bazę danych. Oba są hostowane w Amazon EC2. Jeśli Internet nie działa, muszę pozwolić użytkownikom wewnętrznym na kontynuowanie pracy i aktualizację hostowanej usługi, gdy Internet będzie ponownie dostępny. czy to możliwe? Jak zaprojektowałbym takie rozwiązanie.


title: Dlaczego zwykle pojawia się odwołanie do Javy, gdy ludzie mówią o C#?

text: Nie znam się na C#, ale od kilku miesięcy zajmuję się programowaniem w Javie. Zawsze słyszałem, czym są C i C++, ale byłem trochę ciekaw, skąd pochodzi C#. Jestem trochę zdezorientowany co do języka C#, ponieważ chociaż jest to jeden z języków „C” (C, C++, C#), z drugiej strony wszyscy moi profesorowie wydają się zgadzać z Javą, a nie z innymi. Jeśli ktoś może wyjaśnić, to byłoby świetnie :)


title: BitBucket – na czym polega haczyk? (TANSTAAFL, prawda?)

text: Możliwości BitBucketa i ceny (do 5 użytkowników za darmo) sprawiły, że zacząłem się zastanawiać, na czym polegał… w końcu nie ma czegoś takiego jak darmowy lunch. Co BitBucket czerpie z mojego bezpłatnego udziału, poza przystojnym mężczyzną, który może swobodnie umieszczać w swoich materiałach promocyjnych (zgodnie z TOS)?


title: Jak zatrudnić dobrego programistę C#, jeśli nie znam C#?

text: Jestem programistą C++. Wiem, jak działa Windows na poziomie natywnym, ale nie jestem wielkim ekspertem od C# i .NET. Teraz potrzebuję programisty C# w moim zespole (wszyscy moi programiści to C++). Jak mogę zatrudnić świetnego programistę C#, jeśli nie znam C# na dobrym poziomie? Jak zadawać pytania, jak sprawdzić, czy odpowiedzi są świetne, czy zawierają głupie błędy?


title: Oprócz Waterfall, jakie są inne metodologie tworzenia oprogramowania opartego na planach?

text: Właśnie przeczytałem Równoważenie Zwinności i Dyscypliny. Pomijając kiepski tytuł, kontrastowało to z zespołem projektowym opartym na planach, który zatrudniał PSP/TSP, i zespołem zwinnym korzystającym z programowania ekstremalnego. Kiedy autorzy podali przykład metodologii opartej na planach, użyli osobistego procesu oprogramowania/zespołowego procesu oprogramowania. Chociaż gotowe do użycia, są to metodologie oparte na planach, są one również zaprojektowane do wykorzystania jako ramy procesu i ostatecznie określają tylko rodzaje rzeczy do zrobienia, a nie sposoby ich wykonywania, co czyni je potencjalnie użytecznymi nawet w zwinnym środowisku. Można być zwinnym i nadal stosować się do zasad PSP, a nie znam TSP na tyle, aby powiedzieć na pewno, ale rozumiem, że jest bardzo podobny. W pewnym momencie książki wymieniają szereg metodologii i klasyfikują je pod względem zwinności. Metody takie jak Scrum, Lean, Crystal i XP są na szczycie. Dno (od najbardziej do najmniej elastycznego) składa się z Rational Unified Process, Team Software Process, Feature-Driven Development, CMMI, Software CMM, Personal Software Process i Cleanroom. Watts Humphrey, w PSP: Proces samodoskonalenia dla inżynierów oprogramowania, poświęca rozdział definicji procesu, aw szczególności modyfikacji procesu oprogramowania osobistego. Wspólnym tematem jest to, że procesy są nakazowe (mówią, co robić), a nie opisowe (jak to zrobić). Przypuszczam, że z TSP jest bardzo podobnie. CMMI był również używany w połączeniu z metodami zwinnymi, a SEI ma na ten temat książkę (której jeszcze nie czytałem). Feature-Driven Development jest często reklamowany jako zwinne podejście do zarządzania projektami, jednak autorzy uznają je za mniej zwinną metodologię. RUP to iteracyjny framework. Chociaż nie jestem do końca zaznajomiony z nim, fakt, że jest to framework, pozwala mi pogrupować go z SW-CMM, CMMI i PSP/TSP, dzięki czemu można go wdrożyć jako metodologię zwinną lub opartą na planach. Jedynym innym przykładem, z którym się zgadzam w tej książce, jest inżynieria oprogramowania do pomieszczeń czystych. Kluczowymi elementami Cleanroom są stosowanie metod formalnych, statystyczna kontrola jakości i statystycznie solidne testowanie. Nie rozumiem, dlaczego nie można ich użyć w zwinnej (iteracyjnej/przyrostowej) metodzie, z dodatkowym narzutem czasu i kosztów. Żeby wyjaśnić, czego szukam, rodzina metod zwinnych obejmuje konkretne implementacje abstrakcyjnego pomysłu w postaci Scrum i Extreme Programming. Realizują one koncepcje rozwoju iteracyjnego i przyrostowego, reagując na zmiany, ludzi (osoby i zespoły), częste dostarczanie działającego oprogramowania, współpracę z klientem i tak dalej. Wyraźnie określają role, artefakty, spotkania, timeboxy i inne praktyki, a „robić Scrum” lub „robić Extreme Programming” oznacza wziąć pakiet. Mimo to pozwalają na dostosowywanie i tworzenie nowych procesów (ale wtedy nie „robisz Scrum” ani „robisz XP”). Jednak nie znalazłem „zrobić X” metodologii opartych na planach — większość pracy wydaje się być skierowana na frameworki, które mogą być zwinne lub oparte na planach. Tak więc moje pytanie: jakie są przykłady bardziej opartych na planach metodologii tworzenia oprogramowania? Szereg struktur procesów (PSP/TSP, SW-CMM, CMMI, RUP) umożliwia również rozwój oparty na planach lub zwinny, ale żadne nie są opisowe. Ale czy istnieją naprawdę metodyki oparte na planach, które są na przykład bezpośrednimi odpowiednikami Scrum i Extreme Programming?


title: Jak zorganizować aplikację ASP.NET MVC 3 z potencjalnie setkami widoków, ale tylko z kilkoma punktami wejścia?

text: **Założenia:** * Minimalistyczna aplikacja ASP.NET MVC 3 do wysyłania wiadomości e-mail, gdzie widok reprezentuje zawartość wiadomości e-mail. * Ponad 500 typów e-maili. NIE chciałbym mieć w swoim kontrolerze ponad 500 akcji odpowiadających każdemu typowi wiadomości e-mail. * Typy wiadomości e-mail są przechowywane w wyliczeniu o nazwie MailType, więc możemy mieć: * MailType.ThankYouForYourPurchase, MailType.OrderShipped, itp. * Nazwa widoku jest taka sama jak nazwa mailType: * MailType.OrderShipped miałby odpowiedni widok: OrderShipped .cshtml * Niektóre widoki będą bezpośrednio używać Entity, podczas gdy inne będą używać ViewModel. Tak więc, biorąc pod uwagę, że mam ponad 500 typów e-maili, jaki jest najlepszy sposób/wzorzec uporządkowania mojej aplikacji? Oto co myślałem, **Controller:** public class MailController : Controller { public ActionResult ViewEmail(MailType mailType, int customerId) { string viewName = mailType.ToString(); var model = _mailRepository.GetViewModel(mailType, customerId); return View(viewName, model); } public ActionResult SendEmail(MailType mailType, int customerId) { ... } } **MailRepository Class:** public class MailRepository { private readonly CustomerRepository _customerRepository; prywatny tylko do odczytu OrderRepository _orderRepository; //udawaj, że używamy wstrzykiwania zależności public MailRepository() { _customerRepository = new CustomerRepository(); _orderRepository = nowe OrderRepository(); } obiekt publiczny GetViewModel(MailType mailType, int customerId) { switch (mailType) { case MailType.OrderShipped: return OrderShipped(customerId); case MailType.ThankYouForYourPurchase: return ThankYouForYourPurchase(customerId); } return _customerRepository.Get(customerId); } public Order OrderShipped(int customerId) { //Możliwe 30 wierszy do zbudowania modelu... return _orderRepository.GetByCustomerId(customerId); } public Customer ThankYouForYourPurchase(int customerId) { return _customerRepository.Get(customerId); } } Ale to doprowadziłoby do tego, że moja klasa MailRepository stałaby się bardzo duża, chyba że jakoś ją zepsułem...


title: Narzędzie, które może przeprowadzać semantyczne wyszukiwanie w treści kodu C

text: Szukam narzędzia, które może przeprowadzić wyszukiwanie semantyczne w treści kodu C. Przykładowe zapytanie: "podaj mi wszystkie odwołania do pola y w strukturze x zdefiniowanej w pliku z.h". Wolałbym narzędzie typu open source, oparte na wierszu poleceń. Zaletą jest obsługa C++. Czy istnieje inne narzędzie niż cscope? cscope nie zachowuje typu tagów. Na przykład w hostapd istnieje ponad 900 odniesień do tagu „ifname”. Jednak interesuje mnie tylko pole ifname określonej struktury. cscope nie może filtrować tagów według typu.


title: Czy UTF-16 należy uznać za szkodliwy?

text: Zamierzam zadać pewnie dość kontrowersyjne pytanie: „Czy jedno z najpopularniejszych kodowań, UTF-16, powinno być uważane za szkodliwe?” Dlaczego zadaję to pytanie? Ilu programistów zdaje sobie sprawę z tego, że UTF-16 jest w rzeczywistości kodowaniem o zmiennej długości? Rozumiem przez to, że istnieją punkty kodowe, które reprezentowane jako pary zastępcze, przyjmują więcej niż jeden element. Wiem; wiele aplikacji, frameworków i interfejsów API używa UTF-16, takich jak String Java, String C#, API Win32, biblioteki Qt GUI, biblioteka ICU Unicode itp. Jednak przy tym wszystkim istnieje wiele podstawowych błędów w przetwarzaniu znaków z BMP (znaków, które powinny być zakodowane przy użyciu dwóch elementów UTF-16). Na przykład spróbuj edytować jeden z tych znaków: * 𝄞 (U+1D11E) _SYMBOL MUZYKI G CLEF_ * 𝕥 (U+1D565) _MATEMATYCZNY PODWÓJNY STRZAŁEK MAŁY T_ * 𝟶 (U+1D7F6) _MATEMATYCZNY CYFRA JEDNOSTKOWA ZERO_ * 𠂊 (U +2008A) _Han Character_ Możesz pominąć niektóre, w zależności od zainstalowanych czcionek. Wszystkie te postacie są poza BMP (Basic Multilingual Plane). Jeśli nie widzisz tych znaków, możesz również spróbować spojrzeć na nie w odwołaniu do znaków Unicode. Na przykład spróbuj utworzyć nazwy plików w systemie Windows, które zawierają te znaki; spróbuj usunąć te znaki za pomocą „backspace”, aby zobaczyć, jak zachowują się w różnych aplikacjach, które używają UTF-16. Zrobiłem kilka testów i wyniki są dość złe: * Opera ma problem z ich edycją (usunięcie wymagane 2 naciśnięcia na backspace) * Notatnik nie radzi sobie z nimi poprawnie (usunięcie wymagane 2 naciśnięcia na backspace) * Edycja nazw plików w oknach dialogowych Windows w uszkodzonych (usuń wymagane 2 naciśnięcia na backspace) * Wszystkie aplikacje QT3 nie radzą sobie z nimi - pokaż _dwa_ puste kwadraty zamiast jednego symbolu. * Python koduje takie znaki niepoprawnie, gdy są używane bezpośrednio `u'X'!=unicode('X','utf-16')` na niektórych platformach, gdy X w znaku poza BMP. * Python 2.5 unicodedata nie może uzyskać właściwości takich znaków, gdy Python skompilowany z ciągami Unicode UTF-16. * StackOverflow wydaje się usuwać te znaki z tekstu, jeśli są edytowane bezpośrednio jako znaki Unicode (znaki te są wyświetlane za pomocą kodów ucieczki HTML Unicode). * WinForms TextBox może generować nieprawidłowy ciąg, gdy jest ograniczony MaxLength. Wydaje się, że takie błędy są niezwykle łatwe do znalezienia w wielu aplikacjach korzystających z UTF-16. Więc... Czy uważasz, że UTF-16 powinien być uważany za szkodliwy?


title: Wyjaśnienie generatora liczb pseudolosowych

text: Zostałem poproszony o utworzenie generatora liczb pseudolosowych przy użyciu następującego algorytmu: > Generator wygeneruje każdą liczbę całkowitą od `1` do `N-1` dokładnie raz >> Algorytm dla `N=2^n` > > * Zainicjuj liczbę całkowitą „R” tak, aby była równa „1” za każdym razem, gdy wywoływana jest procedura tabel >, a następnie przy każdym kolejnym wywołaniu dla liczby losowej: > * ustaw „R=R*5” > * zamaskuj wszystko oprócz najniższego -uporządkuj `n+2` bity produktu i umieść > wynik w R > * ustaw `p=R/4` > Co oznacza algorytm, gdy mówi maskowanie wszystkich bitów oprócz `n+2` niższego rzędu produktu?


title: Co jest lepsze niż outputdebugstring do debugowania systemu Windows?

text: Tak więc, zanim przyjechałem do mojego obecnego miejsca pracy, funkcja Windows OutputDebugString była zupełnie niespotykana, wszyscy dodawali komunikaty debugowania do list ciągów i zapisywali je do pliku lub robili wyskakujące okienka z komunikatami (niezbyt przydatne do debugowania problemów z rysowaniem). Teraz wszyscy (wszyscy z nas 6) są jak "Co mogę powiedzieć o tym OutputDebugString?" a ja mówię: „z dużą mocą wiąże się wielka odpowiedzialność”. Czuję się tak, jakbym przekazał moim kolegom cichy, ale zabójczy zapach kodu. Idealnie nie mielibyśmy błędów do debugowania, prawda? Idealnie byłoby, gdybyśmy mieli ponad 0% pokrycia kodu, co? Więc jeśli chodzi o drobne debugowanie (nie kompletne przepisanie 3-milionowego behemotu Delphi), jaki jest lepszy sposób na użycie kodu uruchomionego debugowania niż po prostu dodanie OutputDebugString w całości?


title: REST i przekierowanie odpowiedzi

text: Rozwijam usługę RESTful. Oto mapa aktualnego zestawu funkcji: POST /api/document/file.jpg (tworzy zasób) GET /api/document/file.jpg (pobiera zasób) DELETE /api/document/file.jpg (usuwa zasobów) Jak dotąd robi wszystko, czego można oczekiwać. Mam szczególny przypadek użycia, w którym muszę skonfigurować przeglądarkę tak, aby wysyłała żądanie POST przy użyciu kodowania danych wieloczęściowych/formularza w celu przesłania dokumentu, ale po zakończeniu chcę przekierować je z powrotem do formularza. Wiem, jak wykonać przekierowanie, ale nie jestem pewien, jak klient i serwer powinni negocjować to zachowanie. Rozważam dwa podejścia: 1. Na serwerze sprawdź kodowanie `multipart/form-data` i, jeśli jest obecne, przekieruj do strony odsyłającej po zakończeniu żądania. 2. Dodaj identyfikator URI usługi `/api/document/file.jpg/redirect`, aby przekierować do strony odsyłającej po zakończeniu żądania. Szukałem ustawienia nagłówka X (X-myapp-redirect), ale nie możesz powiedzieć przeglądarce, których nagłówków użyć w ten sposób. Zarządzam kodem zarówno po stronie klienta, jak i serwera, więc jestem elastyczny w zakresie rozwiązań tutaj. Czy jest tu jakaś najlepsza praktyka?


title: Na ile podmiot powinien sam dbać o wartości swoich właściwości?

text: Rozważmy następujący przykład klasy, która jest jednostką używaną przez Entity Framework. - InvoiceHeader - BilledAmount (właściwość, dziesiętna) - PaidAmount (właściwość, dziesiętna) - Saldo (właściwość, dziesiętna) Próbuję znaleźć najlepsze podejście do aktualizowania salda na podstawie wartości dwóch innych właściwości (BilledAmount i PaidAmount ). Jestem rozdarty między dwiema praktykami: 1. Aktualizowanie kwoty salda za każdym razem, gdy BilledAmount i PaidAmount są aktualizowane (poprzez ich ustawiacze) 2. Posiadanie metody UpdateBalance(), którą wywołujący będą uruchamiać na obiekcie, gdy jest to właściwe. Zdaję sobie sprawę, że mogę po prostu obliczyć Saldo w jego getterze. Jednak tak naprawdę nie jest to możliwe, ponieważ jest to pole encji, które należy zapisać z powrotem do bazy danych, gdzie ma rzeczywistą kolumnę i gdzie obliczona kwota powinna zostać utrwalona. Moim innym zmartwieniem związanym z automatycznym podejściem do aktualizacji jest to, że obliczone wartości mogą się nieco różnić od tych, które zostały pierwotnie zapisane w bazie danych, ze względu na zaokrąglenia wartości (starsza wersja oprogramowania używała zmiennoprzecinkowych, ale teraz dziesiętnych). Tak więc załadowanie, powiedzmy, 2000 jednostek z bazy danych może zmienić ich status i sprawić, że ORM uwierzy, że uległy zmianie i zostaną utrwalone z powrotem w bazie danych przy następnym wywołaniu metody SaveChanges() w kontekście. Spowodowałoby to masę aktualizacji, którymi tak naprawdę nie jestem zainteresowany, lub mogłoby spowodować problemy, gdyby zmieniły się metody obliczania (pobrane jednostki utraciłyby swoje stare wartości i zastąpiłyby je świeżo przeliczonymi, po prostu przez wczytanie). Następnie weźmy przykład jeszcze dalej. Każda faktura zawiera pewne powiązane szczegóły faktury, które również zawierają BilledAmount, PaidAmount i Balance (uproszczam moją rzeczywistą sprawę biznesową ze względu na przykład, więc załóżmy, że klient może zapłacić każdą pozycję faktury osobno, a nie za całość ). Jeśli uznamy, że podmiot powinien zadbać o siebie, każda zmiana danych podrzędnych powinna również spowodować zmianę sum faktury. W całkowicie zautomatyzowanym podejściu prosta implementacja polegałaby na przeglądaniu każdego szczegółu faktury w celu ponownego obliczenia sum nagłówka za każdym razem, gdy zmieni się jedna właściwość. Prawdopodobnie byłoby to w porządku dla samego rekordu, ale gdyby wiele jednostek zostało pobranych jednocześnie, mogłoby to spowodować znaczne obciążenie, ponieważ wykonywałby ten proces za każdym razem, gdy pobierany jest nowy rekord szczegółów faktury. Prawdopodobnie gorzej, jeśli szczegóły nie są jeszcze załadowane, może to spowodować, że ORM będzie je leniwie wczytywać, tylko po to, aby ponownie przeliczyć salda. Do tej pory korzystałem z metody Update(), głównie z powodów, które wyjaśniłem powyżej, ale zastanawiam się, czy to było słuszne. Zauważyłem, że muszę dość często wywoływać te metody w różnych miejscach mojego kodu i jest to potencjalne źródło błędów. Ma to również szkodliwy wpływ na powiązanie danych, ponieważ gdy zmienią się właściwości szczegółu lub nagłówka, inne właściwości są nieaktualne i nie można wywołać metody. Jakie jest zalecane podejście w tym przypadku?


title: Skąd pochodzi Objective-C? C++ czy C?

text: Jestem bardzo zdezorientowany tym językiem programowania, Objective-C, o którym słyszałem, że jest używany do tworzenia aplikacji na iOS. Wiem, że wykorzystuje zasady OOP. Czy byłoby łatwiej, gdybym znał C++? A co z jego nazwą? czy jest to połączenie języka programowania C i zasad OOP, których używam w C++?


title: Czy istnieje zasadniczy powód oddzielania systemów plików i systemów wersjonowania?

text: Zrobiłem trochę pracy patrząc na Next3 i ext3cow oraz kilka innych systemów plików, które zapewniają migawki i/lub wersjonowanie plików. Wydaje mi się jednak trochę dziwne, że systemy plików działają tylko częściowo z kontrolą wersji. Czy istnieją **podstawowe** powody, by trzymać te dwa oddzielne? Jak trudne byłoby na przykład zbudowanie wersji systemu plików ext3, która zawiera interfejs podobny do git do zarządzania wersjami plików?


title: Czy w przypadku wstrzykiwania zależności istnieje prosta nazwa odpowiednika wstrzykiwanego obiektu?

text: W samouczkach i książkach nigdy nie widziałem ani jednego słowa opisującego obiekt, do którego wstrzykiwany obiekt jest wstrzykiwany. Zamiast tego używane są inne terminy, takie jak „punkt wstrzyknięcia”, które nie oznaczają obiektu zawierającego wstrzyknięty obiekt. I nic, co przychodzi mi do głowy, nie brzmi dobrze, może z wyjątkiem „celu wtrysku” – ale nigdy nigdzie tego nie czytałem. Czy jest na to jedno słowo lub proste wyrażenie, czy też przypomina „Tego, Którego Imienia Nie Wolno Wymawiać” z ostatniej serii książek fantasy?


title: Mały projekt, ale chcę wykorzystać wzorce projektowe, aby zrobić to dobrze

text: Mam nadchodzący projekt, bardzo mały system, ale taki, który musi zostać rozszerzony w przyszłości. Oto jak zaprojektowałem to do tej pory. Jest trójwarstwowy: prezentacja, biznes i dane. Dla warstwy prezentacji będą formularze webowe ASP.NET z kontrolkami użytkownika (.ascx). W kontrolkach użytkownika znajdują się kontrolki walidatora .NET. W warstwie biznesowej pojawi się model domeny, prawdopodobnie obiekt oparty na Active Record dla _każdego_ typu podmiotu biznesowego (np. Class Trainee, Class Course itp.). Obiekty te będą zawierać odpowiednie dane (dane wprowadzone przez użytkownika lub DB) we właściwościach, ale będą również miały zachowanie, takie jak CalculateCost(), Validate() i Save(). Gdy strona przekazuje dane wejściowe do obiektu biznesowego w celu przetworzenia, obiekt sprawdzi poprawność danych wejściowych. Wszelkie błędy walidacji będą przechowywane w kolekcji w obiekcie. Jeśli dane są poprawne, można wywołać metodę Save() obiektu biznesowego. Save() wywoła obiekt odwzorowujący dane, który przekształca dane obiektu biznesowego w obiekt DTO, a następnie obiekt odwzorowujący dane przekazuje obiekt DTO do bramy danych tabeli. Brama danych tabeli pobiera DTO i wykonuje z nim operacje CRUD. Wszelkie dane, które mają zostać zwrócone z bazy danych, są przekształcane w obiekt DTO, przekazywane do programu odwzorowującego, a następnie zwracane do odpowiedniego obiektu biznesowego. Czy poleciłbyś powyższe podejście w przypadku jakichkolwiek przyszłych małych projektów TDD, które prawdopodobnie zostaną rozszerzone, czy jest to przesada? Wszelkie porady są mile widziane. Nawet jeśli ma powiedzieć „nie mam pojęcia o czym mówisz” :)


title: Codzienne spotkanie Scrum (wykres Burndown)

text: Oto przykład: wcześnie rano drugiego dnia sprintu (podczas stójki) podchodzę do tablicy i widzę, że historia, nad którą pracowałem poprzedniego dnia (pierwszy dzień sprintu) zawiera duże „1 IDEALNY DZIEŃ napisane na nim (oszacowanie). W tej chwili (na początku drugiego dnia Sprintu) historia nie jest ukończona i przypuszczam, że jej ukończenie zajmie pół „PRAWDZIWEGO DNIA”. Pytanie: więc aby śledzić postępy i zaktualizować spalanie już teraz, czy nie powinienem aktualizować tego „1 IDEALNEGO DZIEŃ” na karcie o _coś innego_ (podsumowanie: pierwotne szacunki w 1 idealnym dniu, pozostała praca w 1/2 rzeczywistego dnia) ? Czym byłoby to „coś innego” w tym konkretnym przykładzie?