title: Czy zamknięcia z efektami ubocznymi są uważane za „styl funkcjonalny”?

text: Wiele nowoczesnych języków programowania obsługuje pewną koncepcję **zamknięcia** , tj. fragmentu kodu (bloku lub funkcji), który 1. Może być traktowany jako wartość, a zatem przechowywany w zmiennej, przekazywany do różnych części kod, być zdefiniowany w jednej części programu i wywoływany w zupełnie innej części tego samego programu. 2. Potrafi przechwytywać zmienne z kontekstu, w którym jest zdefiniowana, i uzyskiwać do nich dostęp przy późniejszym wywołaniu (być może w zupełnie innym kontekście). Oto przykład domknięcia napisanego w Scali: def filterList(xs: List[Int], lowerBound: Int): List[Int] = xs.filter(x => x >= lowerBound) Literał funkcji `x => x >= lowerBound` zawiera wolną zmienną `lowerBound`, która jest zamykana (związana) przez argument funkcji `filterList` o tej samej nazwie. Zamknięcie jest przekazywane do biblioteki metody `filter`, która może wywołać je wielokrotnie jako normalną funkcję. Czytałem wiele pytań i odpowiedzi na tej stronie i, o ile rozumiem, termin **zamknięcie** jest często automatycznie kojarzony z **programowaniem funkcjonalnym** i stylem programowania funkcjonalnego. Definicja programowania funkcji na Wikipedii brzmi: > W informatyce programowanie funkcjonalne to paradygmat programowania, który > traktuje obliczenia jako ocenę funkcji matematycznych i unika > danych stanu i zmiennych. Kładzie nacisk na zastosowanie funkcji, w przeciwieństwie do imperatywnego stylu programowania, który kładzie nacisk na zmiany w stanie. i dalej > [...] w kodzie funkcjonalnym, wartość wyjściowa funkcji zależy tylko od > argumentów, które są danymi wejściowymi funkcji [...]. Wyeliminowanie skutków ubocznych może > znacznie ułatwić zrozumienie i przewidywanie zachowania programu, > co jest jedną z kluczowych motywacji do rozwoju programowania funkcjonalnego. Z drugiej strony, wiele konstrukcji domknięć dostarczanych przez języki programowania umożliwia domknięciu przechwytywanie zmiennych nielokalnych i zmienianie ich po wywołaniu domknięcia, co powoduje efekt uboczny w środowisku, w którym zostały zdefiniowane. W tym przypadku domknięcia implementują pierwszą ideę programowania funkcyjnego (funkcje są jednostkami pierwszej klasy, które można przesuwać jak inne wartości), ale pomijają drugą ideę (unikając efektów ubocznych). Czy to użycie **zamknięć z efektami ubocznymi** jest uważane za styl funkcjonalny, czy też domknięcia są uważane za bardziej ogólną konstrukcję, której można używać zarówno w funkcjonalnym, jak i niefunkcjonalnym stylu programowania? Czy jest jakaś literatura na ten temat? **WAŻNA UWAGA** Nie kwestionuję przydatności efektów ubocznych ani posiadania zamknięć z efektami ubocznymi. Nie interesuje mnie też dyskusja na temat zalet/wad zamknięć z efektami ubocznymi lub bez. Interesuje mnie tylko, czy stosowanie takich domknięć jest nadal uważane za styl funkcjonalny przez zwolenników programowania funkcyjnego, czy przeciwnie, odradza się ich stosowanie w przypadku używania stylu funkcjonalnego.


title: Dobra strategia implementacji zadań przetwarzania słuchacza dostarczonych przez bazę danych

text: Załóżmy następujący scenariusz koncepcyjny: baza danych jest stale zapełniana „toną” zadań o nazwie `PleaseSendAnEmail`. Planista/słuchacz w tle ma za zadanie obsłużyć te zadania. Oczywiście zasady są takie, że konkretna poczta nie powinna być wysyłana więcej niż raz, a obsługa powinna być jak najszybsza. Możliwymi statusami zadania są: „Nowe”, „W toku” (fakultatywnie w odniesieniu do poniższych strategii), „Ukończone” i „Niepowodzenie”. Różne strategie dla słuchacza (przedstawiam jedną iterację procesu dla każdego): **Rozwiązanie jednowątkowe:** * Zapytanie o jedno zadanie o statusie „Nowe”. * Wysyłanie zadania do pracownika `EmailSender`. * Kiedy pracownik wykonał pracę, przekazując status do `Complete` Plusy tego rozwiązania: Bezpieczeństwo ! Wady: Powoli, bardzo wolno. **Rozwiązanie wielowątkowe:** * Wysyłanie zapytań do kilku zadań naraz, których status to „Nowe”. * Istnieje wiele instancji roboczych `EmailSender`: Wysyłanie do nich wszystkich zadań * Gdy tylko pracownik obsłuży jedno wystąpienie, odpowiadający mu status jest ustawiany na `Zakończono`. * W międzyczasie pracownicy przetwarzają, przetwarzane jest nowe zapytanie, a następnie zadania są wysyłane do kolejek pracowników itd. Całość jest asynchroniczna. Plusy: Wow! Szybko! Wady: Potencjalne warunki wyścigu, ponieważ to samo aktualnie przetwarzane zadanie może zostać ponownie pobrane przez następne zapytanie, ponieważ przetwarzanie przez bieżący pracownik może jeszcze nie zostać zakończone => Można wysłać więcej niż jedno wystąpienie wiadomości e-mail! Zły! **Rozwiązanie wielowątkowe ze statusem`InProgress`:** * Wysyłanie zapytań do kilku zadań naraz o statusie „Nowe”. * Natychmiastowa aktualizacja tych zadań ze statusem „W toku”. * Istnieje wiele instancji roboczych `EmailSender`: Wysyłanie do nich wszystkich zadań * Gdy tylko pracownik obsłuży jedno wystąpienie, odpowiadający mu status jest ustawiany na `Zakończono`. * W międzyczasie pracownicy przetwarzają, przetwarzane jest nowe zapytanie, a następnie zadania są wysyłane do kolejek pracowników itd. Całość jest asynchroniczna. Plusy: wielowątkowość i bezpieczeństwo! Nie więcej e-maili niż oczekiwano! Wady: Zwiększenie dostępu do bazy danych...oznaczenie statusu jako "W toku"...możliwa rywalizacja o bazę danych z ogromną liczbą zdarzeń. **Rozwiązanie wielowątkowe, które pozwala uniknąć zapytań, gdy co najmniej jeden pracownik nadal przetwarza:** * Wysyłanie zapytań do kilku zadań jednocześnie o statusie „Nowy”. * Istnieje wiele instancji roboczych `EmailSender`: Wysyłanie do nich wszystkich zadań * Gdy tylko pracownik osiągnie jedno zadanie, odpowiadający mu status jest ustawiany na `Zakończone`. * W międzyczasie pracownicy przetwarzają, przetwarzane jest nowe zapytanie, a następnie zadania są wysyłane do kolejek pracowników itd. Całość jest asynchroniczna. Plusy: Wielowątkowość, bezpieczeństwo! Nie ma potrzeby włączania statusu blokowania jako „W toku”! Minusy: Jeśli z jakiegoś powodu wysłanie jednej wiadomości e-mail zajmie 8 sekund, opóźni to następne zapytanie! Wiele zadań może być postrzeganych jako bezczynne, oczekujące na następne zapytanie... Którego rozwiązania powinienem użyć? Czy jest jakieś inne skuteczne rozwiązanie?


title: Kaskadowe „usunięte” rekordy, które tak naprawdę nie są usuwane

text: Po prostu próbuję uzyskać kilka pomysłów na to, co ludzie robią w tym scenariuszu. Mamy systemową bazę danych (SQL Server 2008 R2), która zawiera tabele, a każda tabela ma pole, które możemy nazwać „Usuniętym”. Zasadniczo jest to pole bitowe, jeśli jest to 1, rekord jest usuwany, jeśli jest to 0, nie jest usuwany. Pole to nie może mieć wartości null, a jego wartością domyślną jest oczywiście 0. Nie możemy pozwolić na rzeczywiste usuwanie w bazie danych, więc aby obejść ten problem, ustawiamy pole bitowe (Deleted) na true. W naszej aplikacji otrzymujemy zapytania, które wyglądają tak: `SELECT blah FROM MyTable WHERE .. AND Deleted=0` Zasadniczo filtrujemy dla rekordów, więc otrzymujemy tylko nieusunięte wiersze. Nasz problem dotyczy powiązanych rekordów, które muszą być kaskadowe. Co ludzie wolą, czy powinniśmy robić to w kodzie po stronie serwera, aby po usunięciu rekordu usuwał on (ustawia pole usuniętego bitu na wartość true) dla wszystkich powiązanych rekordów? A może powinien to być wyzwalacz, który musi sprawdzić to pole i ustawić pole bitowe dla wszystkich powiązanych rekordów na 1? A może jesteśmy na złej ścieżce?


title: Unikaj powtarzania kodu w operacjach CRUD

text: Tworzę aplikację PHP i robię w zasadzie ten sam kod do, powiedzmy, tworzenia obiektu na podstawie formularza wypełnionego przez użytkownika. Obiekty są różnych klas, ale proces jest w większości taki sam: pobierz dane z formularza, zastosuj walidację, zapisz/zwróć błąd. Czy istnieje sposób na zautomatyzowanie tego procesu? Pytam również dlatego, że zamierzam napisać publiczne API i użyć tego samego kodu do wykonywania tych operacji, a nie tylko kopiować/wklejać. Pomyślałem o stworzeniu pewnego rodzaju wzorca Factory Method, który odbiera typ i dane z formularza (lub dowolnej tablicy), tworzy instancję i ustawia dane, testując później walidację (każdy obiekt wie, jak sprawdzać swoje własne pola). I to dla każdej z pozostałych operacji CRUD. Czy to wykonalne/dobra praktyka? Czy mam po prostu powtórzyć podobny kod? Czy jest na to inny sposób? Dla przypomnienia, używam już ORM (Doctrine). Mimo to uważam, że wiele funkcji `create` z prawie tym samym kodem (kilka `set*`) jest czymś zbyt powtarzalnym.


title: Jak stworzyć algorytm wyznaczania tautologii Boole'a?

text: Więc teraz zgłębiam kilka tematów na kursie dowodowym i przyszło mi do głowy, aby spróbować stworzyć solwer tautologii logicznej. Chciałbym algorytm, który jest bardziej wydajny niż brutalna siła. Stwierdzenie problemu: podano ciąg znaków '(', ')', '[i]', '[lub]', ! oraz fragmenty tekstu oznaczające nazwy zmiennych (które z definicji nie mogą zawierać znaków nawiasów w nawiasach klamrowych ani znaków !), które muszą być otoczone parą nawiasów Słowa 'PRAWDA' i 'FAŁSZ' są również zastrzeżone określają czy łańcuch logiczny jest prawidłowy -uformowane, a jeśli tak, to czy jest to tautologia np.: `(alfa)[i](beta)` jest dobrze uformowana, a nie tautologią, ponieważ if: alpha = false i beta = true jest kontrprzykładem np: `(alpha) [lub]!(alfa)` jest dobrze uformowana i jest tautologią, ponieważ `((X)[lub]!(X))` jest z definicji tautologią np.: `((alfa)[lub]((beta)[lub ]!(beta)))` jest dobrze sformułowany, ponieważ `(beta)[lub]!(beta)` jest prawdziwe, a `((alfa)[lub](TRUE))` jest zawsze prawdziwe, np.: `((alfa[ i](beta))` nie jest dobrze sformułowany Niektóre pomysły, które miałem na to, aby rozpocząć od utworzenia drzewa w nawiasach. Ponieważ każde zdanie będzie ujęte w nawias, zanim będzie można je zastosować do [lub], [i], lub Operator [!], co mogę zrobić, to podzielić łańcuch na oddzielne bloki najwyższego poziomu ujęte w nawiasy (cla use1)(klauzula2), aby wygenerować 2 węzły drzewa wskazujące na węzeł wysokiego poziomu Każdy węzeł zawiera informację, czy ma ! dołączony do jego frontu, a jeśli ma węzły poniżej, jaki operator służy do ujednolicenia tych dwóch węzłów To drzewo można szybko wygenerować w celu zredukowania instrukcji do pojedynczych literałów i łatwej weryfikacji czy instrukcja jest poprawnie sformułowana (czy istnieje taka sama liczba of ( as ) i czy każde [or] i [and] ma dwie instrukcje otaczające i parę hermetyzujących nawiasów wokół tych dwóch instrukcji.Teraz moim planem było systematyczne czołganie się do węzłów, które mają wartość (!) i dystrybucję nie za pośrednictwem praw DeMorgana.Jeśli kiedykolwiek będę zmuszony do zrobienia czegoś zgodnie z liniami (x i !x), natychmiast znalazłem sprzeczność i mogę przerwać.Nadal nie jestem jednak całkowicie jasny, co musi się wydarzyć na tym etapie


title: Po co trzymać zawijające zamknięcie w każdym pliku js, jeśli można je dodać po połączeniu?

text: W tej chwili każdy plik javasrcipt w naszym projekcie zawiera wrapper do zamykania. Przed wdrożeniem wszystkie pliki są łączone i minimalizowane. I zadaję sobie pytanie, czy naprawdę potrzebujemy tych wszystkich zamknięć LUB jednego zamknięcia dodanego po konkatenacji wykona zadanie. Widzę tylko jeden powód, aby tego nie robić - zmienna, którą udostępniamy między plikami, zostanie umieszczona w globalnej przestrzeni nazw. Ale nie ma konfliktu, więc nie widzę żadnego problemu. Prawdziwe pytanie brzmi, jakie mogą być inne wady? Lub ogólniej, jakie podejście jest lepsze - jedno zamknięcie czy wiele?


title: Ruby Shoes do niebanalnych aplikacji

text: Przyglądałem się Ruby Shoes do tworzenia GUI z Ruby. Jak dotąd tworzenie prostych aplikacji było całkiem niezłe. Jednak jestem bardzo zaniepokojony możliwością pisania za jego pomocą aplikacji na dużą skalę. Na przykład, jak mógłbym użyć wzorca MVP z tym frameworkiem? Na razie nie udało mi się sprawić, by obawy prezentacji przeciekły do widoku z powodu braku jakiegoś „wiązania danych”. Mam kod, który wygląda tak: Shoes.app do @view = SampleView.new @presenter = SamplePresenter.new @view @label = para @view.sample_property button "Update sample_property" do @presenter.update_sample_property end end Tutaj wywołanie do `@presenter.update_sample_property` aktualizuje `@view.sample_property`, ale etykieta nie jest odpowiednio aktualizowana. Aby to zadziałało, musiałbym sprawić, by `@presenter.update_sample_property` zwracał ciąg, a następnie wywołać `@label.text = return_value`, ale myślę, że to naruszyłoby zasadę MVP polegającą na braku logiki prezentacji w widoku . Jestem przyzwyczajony do pracy w .Net ze wzorem MVP, więc nie wiem, czy wzór stosuje się poprawnie do butów, tak jak próbowałem to zrobić. Czy są tam jakieś zasoby do tworzenia nietrywialnych aplikacji z butami? Zwłaszcza używając wzorca MVP lub czegoś podobnego? EDYCJA: Rzuciłem okiem na pudełko po butach, aby zobaczyć, co inni osiągnęli dzięki frameworkowi. Chociaż nie przejrzałem tego zbyt szczegółowo, na pierwszy rzut oka wydaje się, że wszystkie są prostymi projektami, bez prawdziwych celów. AKTUALIZACJA : W końcu udało mi się wymyślić coś, co mnie satysfakcjonuje. A tak przy okazji, przeniosłem się na green_shoes, ponieważ wszystko jest napisane w ruby i mogę go uruchomić z wiersza poleceń, a nie z aplikacji Buty. Opakowanie nie jest dla mnie jeszcze problemem.


title: Czy Active Record Ruby on Rails jest przykładem programowania zorientowanego na aspekty?

text: Z Clean Code, o problemach przekrojowych: > Zwróć uwagę, że _troski_, takie jak trwałość, mają tendencję do przekraczania naturalnego obiektu > granic domeny. Chcesz zachować wszystkie swoje obiekty używając ogólnie > tej samej strategii, na przykład używając konkretnego DBMS... Czy Active Record jest przykładem programowania aspektowego? > W AOP, konstrukcje modułowe zwane _aspektami_ określają, które punkty w systemie powinny mieć zmodyfikowane zachowanie w jakiś spójny sposób, aby wesprzeć > konkretną kwestię. Ta specyfikacja odbywa się za pomocą zwięzłego > deklaratywnego lub programowego mechanizmu. Jeśli Active Record jest przykładem AOP, jaki jest „aspekt”? Czy jest to deklaracja klasy, która dziedziczy po Active Record? class Foo < ActiveRecord::Base


title: Python dla aplikacji desktopowej

text: Obecnie mam aplikację .NET, którą chcę przekonwertować na wieloplatformową, ponieważ coraz większa liczba moich użytkowników chce mieć wersję na komputery Mac. Ponieważ wydaje się, że to forum nie lubi pytań „jakie języki są odpowiednie dla tych wymagań”, skupię się na tym pytaniu na Pythonie jako wybranym języku. Czy Python będzie dobrze spełniał poniższe wymagania? Wady? * Aplikacja komputerowa - wielu moich użytkowników nie ma połączenia z Internetem, w którym korzystają z oprogramowania, więc aplikacja internetowa nie będzie działać * Zorientowana obiektowo * Przechowuje dane w relacyjnej bazie danych oraz pliki konfiguracyjne * Silnik raportowania, najlepiej za pomocą szablonów * Łączność sieciowa - Niektórzy użytkownicy konfigurują wiele stacji roboczych udostępniających jeden plik danych * Obsługa komunikacji przez port szeregowy RS-232, odczyt i zapis * Obsługa przechwytywania wideo * Odtwarzanie WAV i innych plików dźwiękowych * Prosta instalacja aplikacji - zbyt wielu moich użytkowników nie jest bardzo komputerowymi sprytny, więc im łatwiejsza instalacja, tym lepiej * Możliwość zaimplementowania wersji demonstracyjnej lub ograniczonego czasowo modelu licencjonowania, który rozważałem w Javie, ale waham się, czy jestem na łasce Oracle, a wiele osób ma obawy dotyczące bezpieczeństwa JVM. Rozważałem również projekt Mono, aby utrzymać aplikację w .NET, ale ich narzędzie MoMA pokazuje tysiące nieobsługiwanych elementów. Naprawdę wolę mieć tylko jedną bazę kodu do utrzymania, zamiast jednej dla Windows i jednej dla Mac. Python wydaje się być tym, do czego wracam. Jeśli chodzi o mnie, większość mojego doświadczenia dotyczyła VB, VB.NET, C# i Java z kilkoma parami w PHP/Javascript/HTML. Całe moje doświadczenie z komputerami stacjonarnymi dotyczyło systemu Windows.


title: Edytor notacji muzycznej — Refaktoryzacja logiki tworzenia widoku w innym miejscu

text: _Pozwólcie, że na wstępie powiem, że znajomość podstawowej teorii muzyki i notacji muzycznej może być pomocna w uchwyceniu problemu._ Obecnie tworzę edytor notacji muzycznej i tabulatury (w JavaScript). Ale doszedłem do punktu, w którym główne części programu są mniej więcej tam. Cała funkcjonalność, którą zamierzam dodać w tym momencie, naprawdę zbuduje fundament, który stworzyłem. W rezultacie chcę dokonać refaktoryzacji, aby naprawdę utrwalić mój kod. Do renderowania notacji używam interfejsu API o nazwie VexFlow. Zasadniczo przekazuję części stanu edytora do VexFlow, aby zbudować graficzną reprezentację partytury. _(EDIT: Poniższy diagram jest nieaktualny, gdy zacząłem przerabiać strukturę, zobacz aktualizację na dole postu dla nowego diagramu) _ Oto przybliżony i uproszczony diagram UML przedstawiający zarys mojego programu: Zasadniczo „Part” ma wiele „Measure”, które mają wiele „Note”, które mają wiele „NoteItem” (tak, jest to semantycznie dziwne, ponieważ akord jest reprezentowany jako „Note” z wieloma „NoteItem” s, poszczególne wysokości lub pozycje progów). Wszystkie relacje są dwukierunkowe. Jest kilka problemów z moim projektem, ponieważ moja klasa `Measure` zawiera większość logiki widoku całej aplikacji. 1. Klasa przechowuje dane o wszystkich obiektach VexFlow (graficzna reprezentacja wyniku). Zawiera graficzny obiekt Staff oraz notatki graficzne. (Czy nie powinny one być umieszczone w innym miejscu programu?) 2. Podczas gdy `VexFlowFactory` zajmuje się faktycznym tworzeniem (i pewnym przetwarzaniem) większości obiektów VexFlow, `Measure` nadal „kieruje” tworzeniem wszystkich obiektów i w jakiej kolejności mają być tworzone zarówno dla VexFlowStaff, jak i VexFlowNotes. Nie szukam konkretnej odpowiedzi, ponieważ potrzebujesz znacznie głębszego zrozumienia mojego kodu. To tylko ogólny kierunek. Oto moja myśl: utworzyć klasy `MeasureView`/`NoteView`/`PartView`, które zawierają podstawowe obiekty VexFlow dla każdej klasy, oprócz jakiejkolwiek nieistotnej logiki jej tworzenia? ale gdzie miałyby być zawarte te poglądy? Czy mam utworzyć `ScoreView`, który jest równoległą graficzną reprezentacją wszystkiego? Aby `ScoreView.render()` przeskakiwał kaskadowo w dół `PartView` i wywoływał `render` dla każdego `PartView` i kaskadowo w dół do każdego `MeasureView` itd. Znowu nie mam pojęcia, w jakim kierunku iść. im więcej o tym myślę, tym więcej sposobów na wyjście wydaje mi się wpadać do głowy. Starałam się być tak zwięzła i uproszczona, jak to tylko możliwe, jednocześnie przekazując swój problem. Zapraszam do zadawania mi pytań, jeśli coś jest niejasne. Próba sprowadzenia skomplikowanego problemu do sedna to nie lada walka. **AKTUALIZACJA:---------------------------------------------- ----------------------------** Więc poszedłem dalej i zacząłem refaktoryzację z moim pomysłem od góry. Oto zaktualizowany diagram @JW01 Rozumiem, dlaczego relacje dwukierunkowe są potencjalnie złe (trudne w utrzymaniu, zwiększona złożoność), jednak uważam, że zwiększona elastyczność jest warta zachodu i zaimplementowałem ją w sposób, który można utrzymać. Każda notacja "kontener" (`Score`, `Część`, `Measure`, `Note` \- wszystkie zawierają jakieś dzieci) dziedziczy po `Container` (ta relacja nie jest pokazana na diagramie, ponieważ program, którego używam jest gówniany i wygląda na bardzo niechlujny). Metoda `Container.addItem(item)` łączy w sobie metody klasy `Traversable` i właściwość `parent` dodawanego elementu. Wydawało mi się to całkiem sprytne i łatwe do zrozumienia. Zasadniczo każdy przedmiot, który zostanie umieszczony w kontenerze, zyskuje rozszerzoną funkcjonalność. Jak wspomniałem w poprzednim komentarzu, być może zechcę wyciągnąć z tego ładne API danych muzycznych, które pozwoliłoby na łatwe tworzenie "wtyczek". Ruch w obu kierunkach byłby szczególnie pomocny w przypadku takiej funkcjonalności. Dodatkowo te klasy są małe i łatwe w utrzymaniu i mało prawdopodobne, aby się zmieniły. Rozumiem jednak, że im mniej rzeczy zależy od tych relacji, tym lepiej. Więc zdecydowanie najlepiej, jeśli wydzielę tę funkcję przechodzenia do użytku z modułem `Selection`. Zauważyłem, że moje klasy `View` robią teraz bardzo dużo. Budowanie, renderowanie, formatowanie i obsługa kliknięcia. Prawdopodobnie rozsądnie byłoby wykluczyć abstrakcyjny moduł View składający się z ViewBuilder, ViewFormatter, ViewRenderer, ClickBehavior?


title: Jaka jest różnica między indeksowaniem drzewa b i drzewa r?

text: Zauważyłem w MySQLWorkbench, że możesz wybrać sposób przechowywania indeksów przed dalszym opracowywaniem projektu. Typy przechowywania to: 1. BTREE 2. RTREE 3. HASH Badając to, znalazłem pewne informacje, które były prawie dla mnie przesadzone, więc szukam praktycznych informacji o tym, jaka jest między nimi różnica i/lub dlaczego powinieneś wybierz jeden nad drugim. Ponadto nigdy wcześniej nie wybierałem typu przechowywania, więc zakładam, że MySQL wybiera domyślny typ przechowywania (BTREE?)


title: W jaki sposób bazy danych zorientowane na dokumenty implementują referencje?

text: W świecie relacyjnym mamy klucze obce, które odwołują się do innych podmiotów. Ale w jaki sposób bazy danych zorientowane na dokumenty, takie jak MongoDb, CouchDb, RavenDb, implementują referencje między podmiotami? **Aktualizacja.** Przykład dotyczący usługi StackExchange. Mamy encję Pytanie i jej tagi. Każdy tag jest osobną jednostką, więc ma swoje właściwości (na przykład opis). Jak mogę odwołać się do tagów dla niektórych pytań?


title: Algorytm sprawdzania rozwiązań dla gry

text: Na razie mówię ściśle w pseudokodzie. Chciałbym tylko zobaczyć, czy jestem na dobrej drodze. Gra, o której mówię, jest podobna do aplikacji o nazwie FLOW. W tej grze otrzymujesz planszę nxn (zawsze kwadrat) i musisz wypełnić każde miejsce na planszy. Podobnie, gdy inicjowana jest gra planszowa, będzie zawierała obiekty takie jak poniżej... Plansza - 1 2 3 1 0 0 0 0 0 2 3 0 0 0 0 0 W tym przykładzie obiekty to 1 2 i 3 Rozwiązanie byłoby następujące... Plansza - 1 2 3 1 1 2 3 1 1 2 3 1 1 1 1 1 Cały cel polega na wypełnieniu gry planszowej poprzez połączenie obiektu początkowego z obiektem końcowym. Mam na myśli to, co następuje... CheckSolution (1d reprezentacja stanu plansz, int totalcolors) { // Przejdę przez kolory, 0 nie jest kolorem - puste. // Jeśli tablica ma 0 w tablicy, automatycznie zwróciłbym fałszywe rozwiązanie. // Następnie wywołałbym DepthFirstSearch dla koloru. // -- Ustawiłbym licznik na to, aby zliczał # kolorów, jeśli nie jest równa sumie # tego konkretnego koloru, zwróciłbym false. // W przeciwnym razie rozwiązanie jest poprawne. } Czy to brzmi rozsądnie? Lub jest lepszym sposobem na zaimplementowanie narzędzia do sprawdzania rozwiązań.


title: W którym momencie programowanie wielowątkowe staje się wolniejsze niż problem?

text: Obecnie staram się zaprojektować silnik na poziomie podstawowym. Nie mogę jednak zdecydować, czy wątek wejściowy powinien być mieszany z wątkiem renderującym, czy jakimkolwiek innym wątkiem. Czy uczynienie z niego dodatkowego wątku ze wszystkimi blokadami, których będzie wymagał, będzie wolniejsze? Jeśli jest taki sam lub szybszy, czy byłby przynajmniej nieznacznie szybszy? [Rozważ powyższe tylko przykład koncepcji.]


title: Czy to jest wariant wzorca Module?

text: Jak nazywa się ten wzór? Czy to jest wariant wzorca Module? Pamiętam, że ten wzorzec ma pewną wadę i wiąże się z użyciem pamięci. var module = function() { this.Alert = function() { alert("Jestem osobą publiczną"); } function iamPrivate() { alert("nie można wywołać, ponieważ jestem prywatny"); } } var inst = new module(); inst.Alert();


title: Czy istnieje termin na tę praktykę kodowania?

text: Jedną z przypadkowych złożoności wprowadzania funkcji do istniejącego systemu jest to, że programista często musi dotknąć kilku obszarów kodu, które nie sąsiadują bezpośrednio ze sobą. Na dłuższą metę, patrząc na fragment kodu, może być niejasne, że odnosi się on do innego fragmentu znalezionego gdzie indziej. To zarówno brzydki projekt, jak i zagrożenie konserwacyjne. Jedną z właściwości nadrzędnego kodu w mojej książce jest jego zdolność do utrzymywania koncepcji zlokalizowanej w jednym miejscu. Czasami jest to wbudowane w architekturę z góry, co ułatwia podłączanie nowych funkcji do systemu. W językach skryptowych, w których wszystkie klasy pozostają otwarte na rozszerzenie w czasie wykonywania, łatwo jest myśleć o języku jako o własnej platformie i nie iść drogą formalizowania sposobu podłączania. Aplikacja napisana w języku skryptowym może zaakceptować moduł, w którym moduł sięga do różnych komponentów systemu i zmienia je – dodając aspekty do funkcji, okablowanie w zdarzenia i tak dalej. Zasadniczo, ponieważ architektura nie została odpowiednio zaprojektowana do rozbudowy, używamy systemu wtyczek dla biednych ludzi i często to wystarcza. W efekcie eliminujemy potrzebę bezpośredniej modyfikacji kilku spotów i zamiast tego podkręcamy system, być może w podobnych miejscach, ale w sposób zautomatyzowany. Na tym się skupiam. Nadal musimy modyfikować rzeczy, które są rozproszone w naszym systemie, ale robimy to w taki sposób, aby cała zmiana była zlokalizowana w jednym pliku (module). Czy istnieje wzorzec/termin projektowy dla praktyki polegającej na prostym lokalizowaniu całego kodu (nawet jeśli ma on macki) w jednej fizycznej lokalizacji (własnym pliku)? Nie jestem pewien, czy jest to wzorzec wtyczki lub wzorzec rozszerzalności, ponieważ w wielu przypadkach system skryptowy mógł nie być zaprojektowany z myślą o rozszerzalności; jednak nadal można zlokalizować zmianę. Czy nazwałoby to po prostu modułowość? Naprawdę szukam wspólnego terminu, którego mógłbym użyć, aby właściwie przekazać koncepcję bez wyjaśnienia.


title: Nazwa do odkażania we właściwym czasie?

text: Ostatnio mieliśmy na naszej stronie problem polegający na tym, że ktoś próbował wstrzyknąć SQL za pomocą pliku cookie (nazwiemy go `lastID`). NOC był wściekły i zły, że plik cookie jako wektor ataku może zostać zignorowany. Poprosili programistę, aby utworzył klasę do zarządzania plikami cookie, która będzie oczyszczać „lastID” (i ewentualnie inne pliki cookie), aby sprawdzić, czy jest to numeryczne. Uważam jednak, że to źle. Problem nie polegał na tym, że `lastID` nie było liczbowe, ale na to, że zapytanie, które go używa, było podatne na wstrzyknięcie. Zajmuję się przeglądem zmian w kodzie i chcę zwrócić uwagę na fakt, że wymuszenie numeracji `lastID` nie jest szczególnie przydatne, a może nawet niepożądane. Czy istnieje termin lub pojęcie opisujące oczyszczanie we właściwym czasie (tj. oczyszczanie w czasie zapytania, a nie w czasie pobierania plików cookie) lub „nadmierne oczyszczanie” (np. zmuszanie `lastID` do wartości liczbowej), którego mogę użyć do opisania tego, co jest dzieje się / powinno się zdarzyć w mojej recenzji? Wydaje mi się, że obowiązuje tu druga część Prawa Postela: > Bądź ... liberalny w tym, co akceptujesz


title: Najbardziej czytelny sposób formatowania długich, jeśli warunki?

text: W miarę możliwości należy unikać długich, krętych warunków „if”, ale czasami wszyscy je piszemy. Nawet jeśli jest to bardzo prosty warunek, zawarte w nim stwierdzenia są czasami po prostu bardzo rozwlekłe, więc cały warunek staje się bardzo długi. Jaki jest najbardziej czytelny sposób ich formatowania? if (FoobarBaz::quxQuux(corge, grault) || !garply(waldo) || fred(plugh) !== xyzzy) { thud(); } lub if ( FoobarBaz::quxQuux(corge, grault) || !garply(waldo) || fred(plugh) !== xyzzy ) { thud(); } lub jeśli (FoobarBaz::quxQuux(corge, grault) || !garply(waldo) || fred(plugh) !== xyzzy) { thud(); } lub thudable = FoobarBaz::quxQuux(corge, grault); głośny ||= !garply(waldo); głośny ||= fred(wtyczka) !== xyzzy; if (thudable) { thud(); } lub inne preferencje?


title: Wiele programów obsługi wyjątku i obsługa wyjątków w interfejsie użytkownika

text: Powiązane z: Czy program obsługi onError jest lepszy niż wyjątki? **Przesłanka** Piszę fragment kodu biblioteki, który wykonuje określone zadania, aby oddzielić wątpliwości, zdecydowaliśmy, że nie powinien on pisać do dziennika ani bezpośrednio na wyświetlaczu, ale zamiast tego udostępniać mechanizm rejestracji zdarzeń, który umożliwia zainteresowany kod klienta słuchać wydarzeń z jej cyklu życia. Na razie w porządku. Mamy obsługę zdarzeń do dziennika i obsługę zdarzeń do wyświetlania, są one informowane o wystąpieniu zdarzenia i niezależnie zapisują do dziennika/wyświetlania. Tak więc mamy do tej pory (pseudo kod) class MyLib(List<MYLibEventHandler> odbiorniki) class Display implementuje MYLibEventHandler class Log implementuje MYLibEventHandler **Pytanie** Pojawiło się pytanie - jak informować klientów o wyjątkach? Jednym ze sposobów patrzenia na to jest to, że wyjątek może być postrzegany jako kolejne wydarzenie. To coś zewnętrznego, co się dzieje, a klienci chcą wiedzieć, kiedy to nastąpi. Możemy więc po prostu dodać kolejne zdarzenie dla wyjątków, które otrzyma obiekt wyjątku. (możemy ponownie zgłosić wyjątek, aby umożliwić innym konstrukcjom try/catch obsłużyć go, ale dziennik / ekran tak naprawdę nie _obsługują_ wyjątku, są po prostu powiadamiani o tym, że mogą zrobić z nim, co chcą. tak naprawdę nie mogę się z tego wybudzić) Z drugiej strony pachnie źle. Wyjątek nie jest normalnym zdarzeniem, jest przerwą w przepływie, więc możemy powiedzieć, że nasz „główny” przechwyci wszystkie wyjątki i przekaże je jawnie do instancji `Display` i `Log`, poza mechanizmem wysyłania zdarzeń. To również pachnie, ponieważ mamy już listę słuchaczy, ale jawnie wywołujemy dziennik i wyświetlacz, aby obsłużyć wyjątek. (Być może nie powinienem się niepokoić, że kod robi coś „wyjątkowego” podczas przekazywania „wyjątku”, ale nadal pachnie, że muszę dwukrotnie śledzić klientów) Więc utknąłem z zapachem kodu bez względu na to, co wybierać. Czy istnieje wzorzec projektowy do obsługi wielu odbiorników/programów obsługi dla tego samego wyjątku? try catch jest strukturą "pojedynczy słuchacz" / "hierarchiczną", nie wydaje się właściwym narzędziem dla szerokiego scenariusza typu "wysyłanie". Może jakiś wzorzec AOP? Moja próba odpowiedzi na to jest taka, że jeśli mam zdalny serwer z wieloma klientami, a serwer musi komunikować, że wystąpił wyjątek serwera, nie byłoby żadnych pytań, ponieważ klient nie może naprawdę "spróbować / złapać" wyjątku. Najprawdopodobniej zostanie wysłany jako zdarzenie (np. w Akka as a Try object). Nawet w RMI wyjątek jest wysyłany bardziej jako „zdarzenie” i dopiero wtedy wyzwala lokalnie `RemoteException`. Czy istnieje znany wzorzec projektowy do obsługi wielu niezależnych odbiorników tylko do odczytu dla wyjątku (np. odbiorniki, które nie mogą i nie odzyskają sprawności po wyjątku, muszą tylko wiedzieć, że to się stało) Być może w tym przypadku wysłanie wyjątek jako wydarzenie (a następnie jego ponowne zgłoszenie) jest właściwą drogą?


title: Czy to prawda: stosowanie metodyki Agile skutkuje mniejszym planowaniem?

text: Jestem trochę nowy w zwinnym środowisku, ponieważ zawsze brałem udział w projektach, o których wcześniej mówiono, że są zwinne, podczas gdy tak nie było. Teraz jestem naprawdę w zwinnym projekcie i widzę porażkę - jeśli to wpadka - zwinnej metodyki, brak wstępnego planowania. Widzę, że nasz BA rozmawia z kluczowymi użytkownikami, zbiera dane, które są właściwie tylko szkicem, czego tak naprawdę chcą. Następnie najpierw musimy dokonać refaktoryzacji wielu rzeczy, ponieważ rzeczywiste potrzeby są nieco inne. Następnie jest druga faza, kiedy zdajemy sobie sprawę, że potrzebują większego systemu, którego się spodziewaliśmy, po czym musimy dokonać większej refaktoryzacji i uogólnić wszystko później. Moje pytania brzmią: **Czy tak powinno być? Czy na podstawie informacji robimy to w dobry sposób? A jeśli odpowiedź brzmi tak, to czy niskie koszty planowania pokrywają się z wyższymi kosztami refaktoryzacji i przepisywania? Że tak powiem: opłacalne?**


title: Czy powinienem opracować interfejs FileHandler do obsługi różnych plików?

text: Moje doświadczenie w dużej mierze polegało na testowaniu manualnym i zacząłem uczyć się core java, aby móc pracować z Selenium. Chcę napisać kilka metod wielokrotnego użytku, takich jak odczytywanie/zapisywanie danych z csv, excel, word itp. Stworzyłem klasę o nazwie - FileHandler i stworzyłem do tego metodę. Stąd ta klasa zajmuje się wszelkiego rodzaju plikami - csv, excel itp. Ale idąc za koncepcjami OOPs (i jeśli dobrze je zrozumiałem) powinienem stworzyć interfejs i implementacje dla tego interfejsu, a zamiast bezpośrednio zajmować się konkretną implementacją Powinienem pracować z odniesieniem do interfejsu typu. tj. interfejs publiczny FileHandler { } public class ExcelHandler implementuje FileHandler { } public class WordHandler implementuje FileHandler { } Moje pytanie - czy to właściwe podejście w moim scenariuszu, czy powinienem po prostu stworzyć jedną klasę do obsługi wszystkich operacji wejścia/wyjścia na plikach? Chociaż jeszcze nie wiem, co dzieje się w interfejsie, ponieważ metody takie jak - getExcelData (String filePath, String workSheet, String wiersz, kolumna String) byłyby specyficzne tylko dla odniesienia typu - ExcelHandler i nie ma większego sensu utrzymywanie ich w interfejsie.


title: Jak uniknąć ogromnych funkcji składających się z wyliczeń i przypadków if-else lub przełączeń, gdy mamy do czynienia z odpowiedzią serwera w iOS?

text: w mojej aplikacji mam typ żądania powiązany z różnymi wywołaniami API, które wykonuję do serwera REST. gdy odpowiedź z serwera przychodzi tą samą metodą delegata dla odpowiedzi silnika WWW, muszę sprawdzić typ API w obiekcie żądania przekazanym jako parametr do metody delegata, a następnie wykonać odpowiednią akcję. Problem polega na tym, że istnieje około 10-12 różnych typów żądań API. Tak więc przypadek przełącznika, który sprawdza różne wyliczenia związane z typami API, podejmuje na ich podstawie działania. Jak pozbyć się tego przełącznika 'wieża'?


title: Jak pracować w środowisku z „zabójcą postaci”

text: Trudno to wytłumaczyć, więc zacznę od mojego pochodzenia. Jestem w rozwoju od około 8 lat (6 komercyjnych), mam tytuł magistra w OO Info Systems, mam prawdziwą pasję do rozwoju i jeszcze rok temu spędzałem większość czasu ucząc się nowych rzeczy i tworząc pomocne aplikacje dla zespołu . Pracuję w dużej firmie zajmującej się bankowością inwestycyjną i ten nowy deweloper, który pracował dla jednego z większych banków inwestycyjnych, dołącza do zespołu, dużo więcej doświadczenia ode mnie, bardziej profesjonalny itp.. itd. Początkowo pomagałem mu, gdy on zaczął (ALOT), moja postawa do niedawna to wysiłek zespołowy, w którym wszyscy pomagają sobie nawzajem, ale myślę, że uważał to za słabość. Byłem wielkim serem aż do jego przybycia, az perspektywy czasu iw obecnych czasach on jest teraz. Pokłóciliśmy się, ponieważ ja podążam ścieżką obiektową i skupiam się na dobrym projekcie/dokumentacji itp... podczas gdy on woli nie robić dokumentacji i trochę nienawidzi zasad OO, woli stworzyć fajny interfejs niż dobry kod, bez żadnych komentarzy , nie lubi testów jednostkowych, nie lubi interfejsów/abstraktów/dziedziczenia itp. Problemem jest to, w czym jest dobry, to zadowolenie kierownictwa i muszę przyznać, że zasługuje na uznanie. Teraz, po 6 miesiącach, zawsze starał się mnie prześcignąć, wziąć moje pomysły na kod i sam je nazwać, snajpera za moimi plecami itp. iw końcu zdobył przychylność programistów i zaczął mnie coraz częściej krytykować. Jestem teraz w punkcie, w którym jestem bardzo zestresowany, ponieważ wszyscy stali się bardzo krytyczni wobec mojego kodu, ale kiedy on lub ktoś inny popełni błąd lub błąd, szybko o tym zapominam. Ergo ciśnienie jest u mnie bardzo duże. Nie jestem przyzwyczajony do tej sytuacji i zastanawiałem się, czy ktoś się z tym spotkał i ma radę, jak sobie z tą sytuacją poradzić? Lub może podzielić się podobnym doświadczeniem, które może być przydatne


title: Czy lepiej mieć jedną metodę, która przyjmuje wartość logiczną jako parametr, czy dwie metody o różnych nazwach?

text: Piszę klasę fabryczną dla Selenium Web Driver i natknąłem się na wybór, którego nie mogłem rozgryźć, który jest czystszy. Posiadanie dwóch metod z tym samym parametrem. GetWebDriver(przeglądarka ciągów) GetRemoteWebDriver(przeglądarka ciągów) lub dodanie parametru logicznego GetWebDriver(przeglądarka ciągów, bool isRemote) Myślę, że w tym przypadku pierwsza opcja może być lepsza, ponieważ najprawdopodobniej nie ma powodu, aby rozszerzyć ją na więcej niż wartość logiczna wyborów, a zatem dwie metody. Z drugiej strony widzę, że drugi parametr jest lepszy, gdy istnieje więcej niż dwa wybory lub prawdopodobnie wiele rozszerzeń w drugim parametrze w przyszłości. Który byś wybrał dla Cleaner Code i dlaczego?


title: Najlepsze podejście do przesyłania wiadomości w czasie zbliżonym do rzeczywistego z serwera do klienta przez router?

text: Tworzę aplikację, która musi działać na tysiącach systemów klienckich, którymi kontroluję (Linux), które są podłączone za zwykłymi urządzeniami NAT do publicznego Internetu. Każde z tych urządzeń klienckich musi odbierać rzadko wiadomości z usługi w chmurze (1 lub 2 dziennie) i średnio musi otrzymywać te wiadomości w czasie krótszym niż 500 ms. Mam pełną kontrolę zarówno nad systemami serwerowymi, jak i klienckimi, aby zainstalować dowolny system operacyjny, języki programowania czy aplikacje. Jednak nie będę mieć kontroli nad routerem i siecią pomiędzy. W przeciwnym razie mógłbym po prostu wywołać usługę sieciową działającą na urządzeniach „klienckich” w celu wysłania wiadomości. Rozważałem uruchomienie Node.js w usłudze w chmurze, z gniazdami javascript na kliencie otwartymi 24x7. Z tego, co mi powiedziano, Node może obsłużyć dziesiątki tysięcy otwartych połączeń, co czyni go idealnym serwerem do tego celu. Urządzenia NAT przekroczą limit czasu otwartego połączenia, więc mogą być wysyłane dane fikcyjnego utrzymywania aktywności. A jeśli połączenie zostanie zerwane, klient po prostu odnawia gniazdo. Inne opcje obejmują Erlang lub nawet proste gniazdo c z długim odpytywaniem. Jednak mam trudności z badaniem tego problemu pod kątem innych podejść. Jakie byłoby najlepsze podejście? Biorąc pod uwagę brak ograniczeń dotyczących języka lub programowania.


title: Praca w zespole multidyscyplinarnym; z określonym zestawem umiejętności - zarządzanie czasem?

text: Pomyślałem, że zamieszczę to tutaj, aby zachować anonimowość kogoś, z kim zbyt niedawno mówiłem na imprezie społecznościowej dla programistów. Wśród handlu _"historiami wojennymi"_ przedstawił następujący dylemat.. (szczegółowe pytania poniżej) > W tej chwili pracuję w start-upie - z garstką programistów. Tak naprawdę kontaktuję się tylko z front-end developerem, moim menedżerem. To jest idealne, gdy robię programowanie specyficzne dla front-endu - ale generalnie jestem bardziej przystosowany do pracy z back-endem, dlatego czasami jestem wzywany do tworzenia back-endu. > > Niedawno podjąłem się projektu, w którym wymagania nie były zbyt jasne, nie było zarządzania jako takiego, ponieważ mój zwykły menedżer był na urlopie > w fazie rozwoju - i pojawiły się pewne przeszkody. > (Techniczne; parsowanie plików i formaty itp.) Zamiarem było, aby > programista front-end został ukończony przez mojego menedżera po jego powrocie. >> Mimo przeszkód projekt został ukończony. Znaleziono kilka błędów, ale zostały one w dużej mierze wyeliminowane przed przekazaniem urządzenia późnym wieczorem w piątek >. Mój kierownik wrócił z kilkoma sugestiami, z których niektóre sam zrobił >, i poprosił, aby zostały zrobione o 11 rano w poniedziałek. Praca wymagana > dla tych zmian to: > > * Restrukturyzacja bazy danych (aby uwzględnić nowe dane) > * Refaktoryzacja kodu (aby uwzględnić powyższe + bardziej złożony parser plików) > > > Aby uwzględnić testowanie, szacuję, że jest to dobre 12 godzin pracy. > Burza mózgów, rozwój, różne poprawki (była lista około 7 punktów) > a następnie testowanie. Teraz miałem zobowiązania w weekend, więc utknąłem w niedzielę w nocy, pracując do wczesnych godzin, aby to zrobić. > > W planach jest zatrudnienie kierownika projektu, ale to tylko jeden przykład > w którym zabrałem swoją pracę do domu (często dobrowolnie, przyznam). wysysając część > satysfakcji z tego, co robię. Moim zdaniem prowadzi to również do kodu spaghetti > i błędów - których byłem już świadkiem. * **Mówiąc realistycznie, w jaki sposób równowaga między życiem zawodowym a prywatnym ma się rozwijać w takich okolicznościach, jak powyższe?** * **Czy brak satysfakcji może ostatecznie być problemem produktywności?** * **Co możesz to zrobić, gdy dostaniesz nierealistyczne zadanie, ale sytuacja jest taka, że jest to „zrób albo zgiń”?** (Być może, gdy zadanie zostało przydzielone przez kogoś bez pełnego zrozumienia technicznego?) Naprawdę chciałbym to zrobić posłuchaj opinii innych ludzi na ten temat, ponieważ zgaduję, że może to być dość interesujący (i powszechny) problem. Taki, który wymaga sporej dyplomacji. (Opublikuję moją odpowiedź jako odpowiedź, **nie przyjmę jej jednak** )


title: Zwinne naprawianie błędów — jaki jest preferowany proces testowania?

text: Gdy błąd zostanie naprawiony, programista ustawia swój status na „rozwiązany”, a błąd jest ponownie przypisywany do osoby, która go utworzyła. W naszym przypadku jest to zazwyczaj właściciel produktu - nie mamy dedykowanych testerów. Ale jaki jest dobry proces kontrolowania, jak/kiedy PO testuje oprogramowanie? Czy powinien otrzymać najnowszą wersję po naprawieniu/zaewidencjonowaniu każdego błędu? A co z każdym porankiem? A może powinien otrzymać kompilację dopiero pod koniec iteracji (lub pod jej koniec), aby uwzględnić wszystkie nowe funkcje i poprawki błędów tej iteracji? Nawiasem mówiąc, używamy TFS.


title: Jak luźno łączyć moduły w architekturze zorientowanej na usługi

text: Opracowujemy kompleksowe rozwiązanie i wybraliśmy architekturę zorientowaną na usługi, aby rozluźnić podsystemy. Jednak teraz mamy problem. Kiedy klient coś zamawia, **Podsystem zamówień** jest odpowiedzialny za otrzymanie tego zamówienia i jego zarejestrowanie. Istnieje jednak kilka innych modułów, które są również odpowiedzialne za proces rejestracji zamówienia, a każdy moduł powinien coś z tym zrobić: 1. Moduł Księgowość Klienta powinien sprawdzać saldo klienta i uniemożliwiać rejestrację zamówienia, jeśli na koncie klienta nie ma wystarczającej ilości pieniędzy. 2. Moduł Asset Management powinien zwiększać/zmniejszać aktywa klienta 3. Rule Engine powinien dynamicznie stosować do niego pewne reguły biznesowe (takie jak zapobieganie konkretnemu klientowi, powiadamianie operatora itp.) 4. CRM powinien przeglądać historię klienta i dawać dobrych klientów trochę rabatu 5. ... W tej chwili robimy to w ten sposób: public void ZarejestrujZamówienie(Zamów zamówienie) { RuleEngineService.ApplyBusinessRules(order); // tutaj jakiś kod CrmService.GiveDiscountIfApplicable(order); // tu jakiś kod CustomerAccountingService.CheckBalance(order); // tu jakiś kod AssetManagementService.ChangeAssetCount(order); // tu trochę kodu } Oznacza to, że jeśli dodamy kolejny podsystem (moduł), który musi coś zrobić na zamówienie, musimy **rekompilować** kod naszego OMS (Order Management System), aby go obsługiwać. Również jesteśmy w pewnym stopniu połączeni z innymi podsystemami i jeśli jeden z nich zawiedzie, proces rejestracji nie powiedzie się. Jednym ze sposobów uczynienia tego fragmentu kodu dynamicznym i luźno powiązanym jest użycie **interfaces** lub **contracts** , na przykład: public void RegisterOrder(Order order) { // Znajdowanie listy wszystkich IOrderProcessors. // Zapętlenie każdego, wywołanie orderProcessor.Process(order); } Ma jednak dwa problemy: 1. Nie możemy używać interfejsów przez SOAP i HTTP (nie mamy dostępu do plików DLL innych podsystemów) 2. Muszą one działać w określonej kolejności (silnik reguł pierwszy ) Co powinniśmy tutaj zrobić? Jakie są znane wzorce i praktyki?


title: Wybór odpowiedniego projektu do wyboru miesiąca/daty

text: Mam wymaganie, które na pozór wygląda bardzo prosto (i może dziwnie), ale pewne drobne szczegóły sprawiają mi kłopoty. Być może przemyślam to. Zajmuję się tworzeniem aplikacji harmonogramu (na WPF) dla urządzenia osadzonego, które jest uruchamiane codziennie. Harmonogram kontroluje, kiedy urządzenie może być włączane i wyłączane. Na przykład wbudowane urządzenie może być wyłączane w każdy weekend i święta, na przykład 4 lipca. Więc poszedłem dalej i zaprojektowałem swoją strukturę danych, aby przechowywać kolekcję dat i godzin na święta. Po pierwsze, nie muszę przechowywać czasu, ale najwyraźniej w C# nie ma innej odpowiedniej klasy, która przechowuje tylko daty. Po drugie, nie muszę też przechowywać lat, ale wtedy nie wiem, czy jest to rok przestępny, czy nie. (Na przykład mogę zaplanować wyłączenie urządzenia co 29 lutego, ale ta data może nie być dostępna w danym roku). Potrzebuję również sposobu, w jaki użytkownicy mogą wybrać miesiąc/dzień. O ile mi wiadomo, nie ma odpowiedniej kontroli interfejsu użytkownika, aby poradzić sobie z moim problemem. Myślę, że muszę poszukać czegoś takiego (poniżej znajduje się photoshop ze standardowej kontrolki kalendarza): ![tutaj wprowadź opis obrazu](http://i.stack.imgur.com/XHyeW.jpg) Jaka byłaby struktura danych/projekt używasz do rozwiązywania takich problemów? Jaki jest dobry projekt interfejsu użytkownika, aby użytkownicy intuicyjnie wybierali miesiąc/datę?


title: W celu C, jakie angielskie słowa mogę koncepcyjnie powiązać z symbolami?

text: Uczę się celu C (na tle języka C#) i mam trudności ze zrozumieniem nietypowych sygnatur metod i szukam skrótu, który sprawi, że krzywa uczenia się będzie mniej stroma. * Jakie angielskie słowa lub wyrażenia mogę skojarzyć z symbolami podczas czytania kodu celu C? Na przykład wywołanie metody wygląda tak: @implementation Calculator -(int) add:(int)a and:(int)b { } @end napisałbym ten kod: Calculator *calculator = [[Calculator alloc] init] ]; int sum = [kalkulator dodaj:10 i:20]; Do tej pory w mojej ściągawce do nauki napisałem: „[” oznacza „robić”” Nie wiem, na jakie krzywe lub wypukłości natknę się, gdy będę kontynuował, ale szukam przydatnego koncepcyjnego odniesienia do celu C Nowicjusz.


title: Jaka jest typowa ścieżka kariery dla Software Development Managera?

text: Jak zwykle wygląda ścieżka kariery menedżera ds. rozwoju oprogramowania, biorąc pod uwagę lata doświadczenia, wykształcenie, przygotowanie zawodowe itd.?


title: Migracja z Pythona 2 do 3

text: Łatwo jest znaleźć pytania pytające, czy należy zacząć od pythona 2 czy pythona 3, i panuje zgoda, że python 2 jest drogą do zrobienia, ponieważ ma więcej bibliotek, a tym samym jest lepiej obsługiwany. Python 3 został uruchomiony w 2008 roku i to pytanie dotyczyło już migracji. Ponieważ było za wcześnie, rozwiązaniem było poczekać. Minęło już 5 lat i sporo bibliotek obsługuje już pythona 3. W chwili, gdy piszę to pytanie, według tej strony 244 pakiety na pypi obsługują pythona 3, podczas gdy 156 nie. Wśród 30 najczęściej pobieranych pakietów, 24 obsługuje Pythona 3 Po tym czuję się wystarczająco bezpiecznie, aby rozpocząć migrację z Pythona 2 do 3, a także unikając mówienia ludziom, aby zaczęli od Pythona 2 Moje powody wyjaśniły, pytanie brzmi: ** Jakie mam obawy masz podczas migracji z Pythona 2 do 3? ** Nie tylko składnia kodu i zamienniki, ponieważ łatwo jest znaleźć narzędzie do konwersji, które wykona 80% pracy, ale ogólne obawy, takie jak: * Czy zmienia się mechanizm środowisk wirtualnych? * Różnice w zakresie budowy, pakowania i dystrybucji * Czy będę miał tylko cPythona? (Wygląda na to, że Jython ma przed sobą długą drogę do osiągnięcia Pythona 3) * Programowanie wielowątkowe/przetwarzanie. Zawsze delikatny temat * Testowanie. Jakieś zmiany? * Jakie typowe rzeczy, które nadal mogę robić w Pythonie 2, ale powinienem przestać i zacząć robić w inny sposób? Czuję, że narzędzie do wymiany kodu zmieni kod, aby po prostu „uruchamiać”, ale nie użyje poprawnej lub lepszej opcji, jeśli sama opcja wiąże się z dużymi zmianami ps: To pytanie zostało zadane przy przepełnieniu stosu, ale zostało zamknięte jako zbyt szeroki. W każdym razie czułem, że jest tutaj właściwe miejsce


title: Jak zapewnić jeden standard kodowania w .NET z obsługą narzędzi?

text: Prawdopodobnie podstawowa sytuacja jest wszystkim znana. Uzgodniliście pewne standardy kodowania w swoim zespole i teraz nadszedł czas, aby upewnić się, że wszyscy ich przestrzegają. Niektórzy robią to za pomocą ciężkiego programowania sparowanego, inni utrzymują listę standardów kodowania i dokonują ręcznego przeglądu. Inni używają nawet statycznego narzędzia do analizy kodu z programu Visual Studio, aby upewnić się, że standardy kodowania są egzekwowane. Jakie są twoje najlepsze praktyki, aby zapewnić standardy kodowania? Jakich narzędzi używasz - czy są jakieś niezbędne narzędzia, które każdy programista powinien znać? Jak zintegrować standaryzację kodu z narzędziami programistycznymi? Dziękuję Ci! Stefan


title: Czy istnieją biblioteki JavaScript typu open source dotyczące wielu kart przeglądarki i stanu klienta dla nowszych przeglądarek?

text: W najnowszych przeglądarkach pojawiło się kilka nowych funkcji HTML5, które umożliwiają udostępnianie stanu między kartami, oknami przeglądarki, oknami tej samej domeny itp. Tak więc prawdopodobnie trochę łatwiej jest napisać aplikację internetową, która przechowuje dużo stanu na klienta, a także inteligentnie zarządza stanem między kartami i/lub oknami. Obecnie istnieją biblioteki, takie jak Backbone.js, które mogą pomóc w zarządzaniu stanem w pojedynczej karcie lub w jednym oknie. Czy jest jeszcze coś, co pomaga w zarządzaniu wieloma kartami (lub oknami) stanem globalnym, stanem specyficznym dla karty i zdarzeniami między kartami bez polegania na serwerze, aby zsynchronizować je wszystkie?


title: utrzymanie/migracje danych w systemach opartych na obrazach

text: Aplikacje internetowe zazwyczaj posiadają bazę danych. Kod i baza danych współpracują ze sobą. Dlatego frameworki, takie jak Ruby on Rails i Django, tworzą pliki migracji. Oczywiście, są też serwery napisane w Self, Smalltalk lub innych systemach opartych na obrazach, które borykają się z tym samym problemem: Kod nie jest napisany na serwerze, ale w osobnym obrazie programisty. Jak te systemy radzą sobie ze zmieniającym się schematem, zmienianiem klas/prototypów. W którą stronę idą migracje? Przykład: Jak przebiega proces przejścia nowego atrybutu od pomysłu programisty do kodu serwera i wszystkich obiektów? Znalazłem podręcznik Gemstone/S rozdział 8, ale tak naprawdę nie mówi on o procesie przesyłania kodu na serwer.


title: Kiedy *nie* używać Unicode?

text: Unicode wydaje się, że obecnie staje się coraz bardziej wszechobecny, jeśli jeszcze nie jest, ale muszę się zastanowić, czy istnieją jakieś domeny, w których Unicode nie jest najlepszym wyborem do implementacji. Czy są jakieś języki lub skrypty, w których Unicode nie będzie działał dobrze lub w ogóle nie będzie działał? Czy istnieją jakieś techniczne powody, aby korzystać z zupełnie innego systemu (poza pracą ze starszymi systemami)? Oczywiście założyłbym, że odpowiedzią jest zawsze używanie Unicode. Czy się mylę?


title: Kiedy warto nie używać utf-8?

text: Kiedy warto używać kodowania innego niż UTF-8? Oprócz zajmowania się dokumentami pre-Unicode, to znaczy. A co ważniejsze, dlaczego UTF-8 nie jest domyślny w większości języków? To znaczy, dlaczego często muszę to wyraźnie ustawić?


title: JSON czy XML do analizowania dla aplikacji Windows Store 8?

text: Otrzymuję trochę danych z Gov tracker (http://www.govtrack.us/developers/api) i tworzę aplikację Windows 8 Store. Zacząłem próbować użyć HttpClient, aby uzyskać JSON, a następnie użyć Json2Charp.com przekonwertować go na klasy... Ale potem nie miałem pojęcia, co zrobić z tą gigantyczną klasą i wierszem var contact = JsonArray.Parse(data); nie zadziała.. Więc teraz poprosiłem o to jako XML i używam XML do LINQ, aby powoli uzyskać to, czego potrzebuję ... na przykład ... var things = from x in xdoc.Descendants("person") select new Person { name = x.Element("imię").Wartość }; Ale w tym przypadku iw ogóle jaki jest najłatwiejszy sposób? Czy używa XML dla tej aplikacji Windows 8 i używa JSON do aplikacji JavaScript? (ponieważ zawsze słyszę o tym, jak JSON tak dobrze pasuje do javascript) W tej chwili, ponieważ nie mogłem uruchomić deserializacji JSON, myślę, że XML jest w tym przypadku łatwiejszy?


title: Czy „WinForms” jest powszechnie znanym i akceptowanym substytutem „Windows Forms” w CV?

text: Zawsze staram się ulepszyć moje CV do podstawowych elementów - bez puchu. Chcę zachować jak najwięcej punktów w jednej linii iw tym celu w kilku miejscach użyłem terminu _WinForms_. Chciałem porównać moją wielkość liter z innymi przykładami, ale ten termin nie jest używany na oficjalnej stronie http://www.windowsclient.net; nie pojawia się nawet we wpisie w Wikipedii. Czy mogę rozsądnie oczekiwać, że ktoś, kto szuka programisty .NET, _dostaje_ to? Nawet jeśli szukają programistów internetowych? Czy napisałbyś to tak, jak ja (WinForms)?


title: Jak przenieść zespoły do metodyki programowania Agile

text: Moja grupa ostatnio powiększyła się o kilka zespołów z różnych projektów. Pracujemy zgodnie z metodologią programowania Agile: 2 tygodnie sprintów, dostarczanie każdego sprintu, 2-3 pchnięcia do produkcji w każdym sprintie dla każdego zespołu. Jak „nawrócić” nowo dodane zespoły na tę metodologię i sposób myślenia przy jak najmniejszej traumie i oporach ze strony członków tych zespołów? Uwaga: nie pytam, czy chcą zmienić swoją metodologię, będą musieli działać w ten sposób, aby być zsynchronizowanym z resztą grupy. To jest inne pytanie niż to, ponieważ wszystkie inne zespoły już pracują przy użyciu programowania Agile.


title: Odłącz GUI i logikę programu

text: Mam trochę kodu Windows c++ (czysty winpi c++, bez MFC itp.), dla którego chciałbym zbudować GUI. Mój kod nie wie o GUI systemu Windows, jest całkowicie oddzielony od dowolnego typu interfejsu użytkownika. Pytanie: Jak mogę zbudować interfejs użytkownika wokół istniejącego kodu. Idealnie wyobrażam sobie coś takiego: GUI <\--> Mediator <\--> MyExistingCode Na przykład `MyExistingCode.showmsg(char* msg)` wywołałby `Mediator.MessageBox(0, 0, msg, 0) ;` Utknąłem na tym, jak zaprojektować klasę Mediator (jeśli jest to właściwy sposób na zrobienie tego). Czy mediator jest interfejsem?, klasą abstrakcyjną?, innym? Czy najlepszym rozwiązaniem jest model MVC?


title: Nauka Scali, uczucie zniechęcenia

text: Pochodzę ze środowiska Java i próbuję nauczyć się Scali. W tej chwili czuję się przytłoczony, wydaje mi się, że ze Scali można się jeszcze wiele nauczyć, tak wiele różnych sposobów robienia tego samego. Zastanawiałem się, czy ktoś ma jakieś rady, od czego zacząć i jak długo zajęło mu poczucie, że jest w miarę kompetentny w języku? Nawet małe rzeczy, takie jak wyrażenia pętli for, wydają się naprawdę potężne, ale to tylko kolejny element składni, o którym musisz pamiętać!


title: W jaki sposób stos i sterta są przydzielane dla wątków w tym samym procesie w systemie Windows?

text: Stos dla różnych wątków jest inny. Ale co ze stertą. Jeśli Heap różni się dla różnych wątków, to jak współdzielą obiekty?


title: Czy możliwe byłoby użycie tęczowych tablic do wykrywania słabych haseł użytkowników?

text: Jak rozumiem, w przypadku większości przypadków naruszenia bezpieczeństwa, w których lista zaszyfrowanych haseł jest zagrożona, atakujący używają metody brute-force, aby spróbować znaleźć słabe hasło i niezmiennie zawsze znajdują całkiem sporo (jak w niedawnym naruszeniu Github). O ile się nie mylę w większości przypadków, gdy użytkownik zakłada konto, hasło jest wysyłane, zaszyfrowane (dzięki TLS/SSL), na stronę, która następnie dodaje trochę soli i przechowuje hash + sól. Nawet w najbardziej wyrafinowanych przypadkach (np. gdy używany jest bcrypt), po utworzeniu konta jest jeden moment, w którym serwer ma hasło w postaci zwykłego tekstu. Moje pytanie brzmi: czy nie mógłbyś użyć, w tym momencie, kiedy masz jasne hasło, którego użytkownik próbuje użyć do swojego nowego konta, gigantycznej tęczowej tabeli po stronie serwera, aby sprawdzić miliardy i miliardy słabe hasła w ułamku nanosekundy? Następnie, jeśli wykryjesz, że używane jest słabe hasło, po prostu powiesz użytkownikowi, że jego hasło jest zbyt proste, a użycie „edcrfvtgb1” nie jest mądre. Chodzi mi o to, że jeśli atakującym uda się brute-force słabe hasło _nawet jeśli mają do czynienia z problemem soli_ , serwery nie mogą skorzystać z faktu, że gdy użytkownik tworzy nowe konto, zna hasło w jasne, aby po prostu sprawdzić to w wielkiej tęczowej tabeli, gdy użytkownik tworzy swoje konto? Nie wydaje się to trudne do zaimplementowania i w dzisiejszych czasach widać rozmiary dysków twardych, prawdopodobnie nie jest problemem przechowywanie dużej tęczowej tabeli po stronie serwera. Czy brakuje mi czegoś oczywistego, czy może to pomoże złapać _dużo_ słabych haseł, a tym samym złagodzić niekończący się problem z kontami, który obserwujemy prawie codziennie?


title: asp.net mvc vs wiązanie modelu angular.js

text: Zauważyłem więc ostatnio trend, że twórcy stron internetowych .net używają angular.js po stronie klienta aplikacji i stałem się bardziej ciekawy, gdy bawię się z angular i porównuję to z tym, jak robiłbym rzeczy w asp.net mvc . Podam krótki przykład tego, co naprawdę mnie do myślenia. Niedawno natknąłem się na sytuację w pracy (pracuję w środowisku .net), gdzie musiałem stworzyć tabelę powiązaną z kolekcją obiektów, która miała możliwość dodawania i usuwania wierszy/elementów z kolekcji. Miałem przycisk dodawania, który utworzył nowy obiekt i dołączył wiersz na końcu tabeli, oraz przycisk usuwania w każdym wierszu, aby usunąć określony obiekt/wiersz. Używając asp.net mvc, najpierw wywoływałem ajax do serwera dla każdej operacji, aktualizując model po stronie serwera i odświeżając część strony, aby pokazać wynik w tabeli. To zadziałało, ale nie podobał mi się pomysł wywoływania serwera, aby za każdym razem aktualizował model, więc spróbowałem wymyślić rozwiązanie, aby to zrobić po stronie klienta. Okazało się to nie lada zadaniem, ponieważ musiałem wygenerować html na add z walidacją i wszystkimi oraz poprawnym indeksowaniem, aby powiązanie modelu działało. Pogorszyło się po usunięciu, ponieważ skończyłem z szaloną funkcją zastępującą ciąg znaków, aby odtworzyć indeksy na każdym elemencie, aby spełnić wymagania wiązania (jeśli element inny niż ostatni zostanie usunięty, indeksy nie są już poprawne). Teraz z ciekawości próbowałem odtworzyć to w domu w kątowym (z czym nie miałem żadnego doświadczenia) i zajęło mi to około 10 minut z prostymi funkcjami dodawania i usuwania elementów z modelu po stronie klienta. To tylko jeden przykład, ale wydaje mi się, że jestem w stanie osiągnąć te same wyniki przy znacznie mniejszej liczbie wywołań serwera w angular, ponieważ wiąże się z modelem po stronie klienta. Więc moje pytanie brzmi, czy jest to wyraźna zaleta korzystania z frameworka javascript mvc, czy też w jakiś sposób nie wykorzystuję mocy asp.net mvc i czy mam rację, myśląc, że te operacje powinny być wykonywane na kliencie i nie mają biznesu wymagającego połączeń do serwera?


title: Umieszczanie argumentów na własnych liniach

text: To pytanie dotyczy zarówno parametrów, jak i argumentów, ponieważ widziałem ten styl używany w obu. Zwykle piszę parametry jak to someFunction(arg0, arg1, arg2), ale ostatnio zauważyłem, że wiele osób pisze swoje w ten sposób someFunction( arg0, arg1, arg2 ) // nawias nie musi być w osobnym wierszu I masz tutaj wieloaspektowe pytanie: 1) Czy jest to standardowa praktyka, dobra praktyka, czy też pomijanie każdego argumentu w osobnych kwestiach? 2) Czy mają wyjątki od tego stylu, jak wtedy, gdy jest tylko jeden argument? 3) Jakie są plusy i minusy takiego projektu?


title: Zawijanie mapy instancją lub metodą statyczną

text: Mam obiekt `java.util.Map<String, Object>` który zawiera różne typy wartości. Nie chcę rzucać, gdziekolwiek robię operację. Aby to zrobić, stworzyłem różne klasy, które otaczają tę mapę i te klasy zapewniają różne metody pobierania, które zwracają wartości dla różnych kluczy. Są na to dwie opcje: public class Wrapper1 { private final Map<String, Object> map; public Wrapper1(Map<Ciąg, Obiekt> mapa) { this.map=map; } public MyObject getMyObject() { return (MyObject)this.map.get("jakiśKlucz"); } } public class Wrapper2 { private Wrapper2() { } public static MyObject getMyObject(Map<String, Object> map) { return (MyObject)map.get("someKey"); } } Jak widać, w pierwszym utworze instancję Wrapper1 i uzyskuję dostęp do instancji MyObject metodą instancji. Po drugie, daję mapę do metody statycznej i uzyskuję dostęp do tej samej instancji MyObject. Który wolisz bardziej i dlaczego? Również jeśli jest to zła praktyka, daj mi znać. Dziękuję Ci.


title: Jaki jest sens metody prototypowej?

text: Czytam _Javascript: Dobre części_ i staram się ogarnąć sekcję o _prototypach_. Po małym google doszedłem do wniosku, że jest to dodawanie właściwości do obiektów _po_ deklaracji obiektów. Używając tego skryptu błyszczał z w3schools, zauważyłem, że usunięcie wiersza dodającego właściwość prototype **nie ma żadnego efektu**. Więc jaki jest sens? * * * //Prototypowanie funkcji pracownik(imię, stanowisko,urodzony) { this.name=name; this.jobtitle=nazwa stanowiska; this.born=urodzony; } var fred=nowy pracownik("Fred Flintstone","Caveman",1970); pracownik.prototype.salary=null; // <--- spróbuj usunąć tę linię fred.salary=20000; dokument.napisz(wynagrodzenie);


title: Czy możesz napisać (dynamiczną) stronę internetową używając tylko XHTML i CSS?

text: Jestem bardziej programistą pulpitu niż programistą stron internetowych. Dlatego znam tylko XHTML i CSS, jeśli chodzi o sieć (i C#, jeśli jest to w jakiś sposób przydatne). Mam _little_ doświadczenie z ASP.NET z C#, ale w żaden sposób nie jestem w tym ekspertem. Załóżmy, że chcę napisać małą witrynę internetową, aby wyświetlić podgląd każdego nowego oprogramowania, które tworzę. Czy XHTML i CSS wystarczą, aby to zrobić? Czy _muszę_ nauczyć się języka po stronie serwera? (lub framework do tworzenia stron internetowych?) Jeśli tak, jakieś sugestie? Nie chcę tworzyć czegoś tak niesamowitego jak Facebook czy Stack-overflow. Zwykła strona, coś w rodzaju http://thenewboston.com.


title: Dobór kolorów do aplikacji

text: Jaki jest najlepszy sposób na wybór kolorów dla aplikacji LoB, muszę wystylizować TreeView, listy rozwijane, pola tekstowe i siatkę przestawną, więc potrzebuję kilku kolorów, wypróbowałem Kuler, ale daje tylko 6 kolorów. Więc pytanie brzmi jak to zrobić bez projektanta? PS. To aplikacja Silverlight.


title: Kto zostaje właścicielem produktu?

text: Firma ma pięć strumieni wymagań, z „liderem strumienia” (nazywanym _Menedżerem produktu_ , ale jest to termin wewnętrzny) na strumień i zaległościami na strumień. Gdybyśmy chcieli bliżej przyjrzeć się Scrumowi, tak jak rozumiem, najlepsza praktyka nakazywałaby identyfikację jednego właściciela produktu zarządzającego pojedynczym backlogiem zawierającym wymagania ze wszystkich pięciu strumieni (to wszystko to tylko rzeczy do zrobienia, prawda?), z których praca jest prowadzona przez samoorganizujący się zespół programistów. Czy ktoś może dać jakiś wgląd w to, jak najlepiej zidentyfikować osobę będącą właścicielem produktu oraz jak najlepiej wyjaśnić i „sprzedać” zmodyfikowane podejście obecnym liderom strumienia? NB: Zdaję sobie sprawę, że to bardzo trudne pytanie.


title: Jak nazewnictwo pakietów wpływa na aplikację na Androida po wdrożeniu?

text: Czy istnieją konwencje, których należy przestrzegać podczas nazywania pakietu aplikacji dla aplikacji systemu Android? Koduję w Xamarin Studio, używając .Net, więc daleko mi do tej konwencji nazewnictwa "com.myapp.etc". Czy są jakieś zasady, których należy przestrzegać podczas nazywania pakietu?


title: Czy istnieje kanoniczna książka o programowaniu dynamicznym?

text: W tej chwili na studiach studiuję programowanie dynamiczne i bardzo mnie to interesuje. Chcę zagłębić się i w pełni zrozumieć temat, aby móc pisać dobry kod dynamiczny. Czy istnieje książka, która jest de facto standardem opisującym najlepsze praktyki, metodologie projektowania i inne przydatne informacje na temat programowania dynamicznego? Co w tej książce czyni ją wyjątkową?


title: Funkcjonalność przed projektowaniem, czy po trochu obu?

text: Czy podczas tworzenia stron internetowych opartych na danych zazwyczaj pracujesz nad: A) najpierw funkcjonalnością B) najpierw prezentacją? C) obydwa w tym samym czasie uczę się budować strony css i nie jestem pewien, jakie jest najlepsze podejście. Będą wywołania ajaxowe i aktualizacje, ale jest to całkiem łatwe do zaimplementowania. Dziękuję za poświęcony czas i opinie.


title: Jakieś wskazówki, jak nauczyć się programować z ciężkim ADHD?

text: Mam trudności z nauką programowania z prostych podręczników. Trening wideo wydaje mi się dobrze działać w moich wcześniejszych doświadczeniach z PHP. Z całych sił staram się być skoncentrowanym i przepychać się. W szczególności zamierzam rozpocząć tworzenie gier niezależnych. Przez ostatnie dwa tygodnie starałem się wybrać "właściwy" język i framework do programowania. Zacząłem zapoznawać się z Pythonem, ale do tej pory nie podoba mi się ten język. Ciągle przeglądam tę stronę, aby porównać ten język z tamtym i ciągle się rozpraszam. Poza tym, czy można zostać programistą, gdy masz problemy z koncentracją? Czy ktoś przez to przeszedł, który może polecić jakąś radę?


title: maven kompiluje kandydata do wydania

text: Budujemy aplikacje Java i używamy Mavena do tworzenia migawek i kompilacji wydań (poprzez Hudson). Zwykle budujemy/wdrażamy wersje migawek w naszym środowisku laboratoryjnym, a kiedy jesteśmy zadowoleni, wypuszczamy kompilację i wdrażamy ją do prod. Zastanawialiśmy się, czy powinniśmy również tworzyć kompilacje kandydatów do wydania. Nie jestem pewien, w jaki sposób kompilacja kandydata do wydania faktycznie różni się od kompilacji migawek. Czytałem o celu release:stage w Maven, ale tak naprawdę nie odpowiadał on na pytanie. Czy korzystasz z wersji Release Candidate? Do czego ich używasz i jak przechodzisz od migawki do wydania kandydata do wydania?


title: Jakie są wady korzystania z procedur przechowywanych, usług SSIS i usług SSRS do wdrażania aplikacji biznesowych?

text: Ostatnio zasugerowano, że wiele projektów (w których pracuję) powinno być realizowanych przy użyciu jakiejś kombinacji procedur składowanych (na SQL Sever / T-SQL), SSIS i SSRS. W jednym konkretnym projekcie SSIS otrzyma plik z serwera SFTP. Plik zawiera dzienną cenę dziesięciu akcji. Hurtownia danych będzie przechowywać dzienną cenę każdego towaru od momentu powstania. Na razie ceny sięgają dwudziestu pięciu lat. Procedury składowane będą miały logikę biznesową do obliczania różnych wartości wydajności (tj. zwrotu %) w dowolnych okresach czasu, takich jak zwrot z 5 lat na dzień 31 grudnia 2012 r. Te procedury składowane byłyby używane przez usługi SSRS do tworzenia raportów dla użytkowników końcowych. Jakie są problemy/kwestie przy tym podejściu? Uważam, że blokada dostawcy (Microsoft) jest problemem, ale nie widzę, aby (niestety) wystarczyło, aby zmienić kierunek. Ponadto mam obawy dotyczące całej logiki biznesowej będącej procedurami składowanymi. Jakie są argumenty przeciwko/za umieszczeniem tej logiki biznesowej (tj. obliczanie wskaźników wydajności) w procedurach składowanych w porównaniu z używaniem Javy (lub innego języka programowania OO) z ORM (takim jak myBatis)?


title: DDD: Jak pogodzić ograniczony kontekst z DTO REST/usług internetowych?

text: Dopiero zaczynam się uczyć o DDD i próbuję zrozumieć, jak Bounded Contexts można pogodzić z interfejsami API skierowanymi do klienta, takimi jak REST/WebServices, które używają DTO. Na przykład: Twój system udostępnia publicznie swoje API za pomocą standardowej usługi WebService, z operacjami w stylu CRUD dla obiektów DTO z wieloma polami zdefiniowanymi za pomocą WSDL. Tworzysz Bounded Context, aby obsłużyć logikę biznesową Twojej domeny, używając "nieanemicznego" modelu domeny - tak, że obiekty domeny nie mają po prostu kilku seterów i getterów - zamiast tego mają metody zdefiniowane przy użyciu słownictwa z twojego wszechobecnego języka . Jak pogodzić różnicę między DTO usług sieciowych a kontekstem ograniczonym? Wydaje mi się, że może to znacznie zwiększyć złożoność i zastanawiam się, czy istnieją dobrze zdefiniowane sposoby rozwiązania tego problemu.


title: Wykorzystanie typów unikatowości do implementacji bezpiecznej równoległości

text: Od pewnego czasu interesuję się typami unikatowości jako alternatywą dla monad w czysto funkcjonalnych językach; niestety jest to ezoteryczny obszar badań nad CS, a zasoby internetowe dotyczące programowania z typami unikalności są bardzo nieliczne. Oczywiste jest, w jaki sposób typy unikatowości mogą być używane do implementacji stanowych struktur danych, takich jak referencje („pola”) i tablice, chociaż umyka mi, jak można zaimplementować z nimi inne wspólne stanowe struktury danych. Czy można zaimplementować np. blokowanie z unikalnymi typami? Czy typy unikatowości mogą być używane do udostępniania mutowalnych danych w wątkach? Czy można używać unikalnych typów do budowania prymitywów synchronizacji (takich jak muteksy), czy też konieczne jest przekazywanie wiadomości?


Czy zastępowanie testów jednostkowych testami użytkownika jest niebezpieczne? Współpracownik uważa, że możemy ograniczyć ręczne testowanie użytkowników, które musimy wykonać, dodając więcej testów jednostkowych. Czy to niebezpieczne? Testy jednostkowe wydają się mieć zupełnie inny cel niż testy użytkowników. Czy testy jednostkowe nie informują projektu i pozwalają na wczesne wyłapanie przełomowych zmian? Czy nie jest to fundamentalnie różne od ustalenia, czy jakiś aspekt systemu jest poprawny jako całość? Czy to przypadek zastępowania jabłek pomarańczami?


title: Jak zrefaktoryzować kod, który ma 2 problemy?

text: Powiedzmy, że mam ten kod: if ($this->ship == "e") { $this->price->addLine($this->price->base * $this->price->e, 0, " Eksport"); $this->price->catal += $this->price->base * $this->price->e; } elseif ($this->ship == "d") { $this->price->addLine($this->price->base * $this->price->d, 0, "Krajowa"); $this->price->total += $this->price->base * $this->price->d; } Mam wiele identycznych bloków kodu, takich jak powyżej. Mam też inny kod (inny niż `$this->ship`), który ma podobną strukturę. Zasadniczo, ten kod dodaje `Linię` do pliku PDF, gdzie linia mówi "Krajowy" lub "Eksportuj" wraz z innymi opcjami. Powyższy kod oblicza również cenę dla tej linii i dodaje ją do sumy. **Moje przemyślenia na temat refaktoryzacji:** Chcę usunąć duplikację. Chcę też przestrzegać zasad SOLID, czyli separacji obaw. Widzę, że powyższy kod robi dwie rzeczy (oblicza cenę i dodaje pozycję do pliku PDF). Z pewnością mogę podzielić ten kod na dwie oddzielne funkcje, ale i tak otrzymam zduplikowany kod -- muszę sprawdzić, czy `$this->ship` równa się `e` lub `d` w obu miejscach. To nie dobrze. Jeśli muszę dodać trzecią opcję, muszę zmienić kod w dwóch miejscach. Więc wtedy mogę przenieść mój czek na "e" lub "d" do głównej części kodu, ale nadal mam duplikację, ponieważ będę miał switch($this->ship) { case 'd': $cost = $this ->getShippingCost($this->price->base, $this->price->d);break; przypadek 'e': $cost = $this->getShippingCost($this->price->base, $this->price->e);break; } Otrzymuję te dwie długie linijki kodu dla w zasadzie jednej zmiany znaku. Chociaż może jest to do przyjęcia, nie do końca mi się to podoba. Jeśli muszę zmienić na przykład liczbę parametrów, parametr bazowy itp., będę musiał to zmienić w więcej niż jednym miejscu. Zasadniczo, do tej pory bez względu na to, w jaki sposób kręcę ten kod, kończę gdzieś z duplikacją. Mam na myśli, że jeśli jest to nieuniknione, to chyba w porządku. Ale tutaj przychodzę po radę, aby zobaczyć, czy jest sposób na oddzielenie obaw, usunięcie duplikacji i minimalną liczbę miejsc (najlepiej "jeden"), kiedy muszę coś zmienić. czy można to zrobić?


title: Jak źle jest mieć wiele katalogów, w których można zapisywać przesłane dane zamiast jednego?

text: Używam następującej struktury, aby zapisać obrazy, które użytkownicy przesyłają dla swoich przedmiotów: * Obrazy * User_dir1 * Item_dir1 * Picture_file1 * Picture_file2 * User_dir2 * Item_dir2 * Picture_file3 * Item_dir3 * Picture_file4 Czy mogę kontynuować, jeśli mam tysięcy użytkowników i setki elementów na użytkownika? Mówiąc o wydajności, czy serwer dedykowany Linux będzie miał problemy w przyszłości? Dziękuję!


title: Czy pracodawcy wolą inżynierię oprogramowania od kierunków CS?

text: Uczę się na uniwersytecie, który był jednym z pierwszych, który miał akredytowany program inżynierii oprogramowania. Mój licencjat jest w CS. Pracodawca niedawno zrekrutowany na naszej uczelni i zatrudnił 5 kierunków SE. Żaden z nich nie był CS. Czy pracodawcy preferują kierunki inżynierii oprogramowania? Powodem, dla którego pytam, jest to, że mogę skupić się na wielu różnych obszarach podczas moich studiów magisterskich i naprawdę chcę wziąć udział w zajęciach, które pomogą mi znaleźć świetną pracę. W tej chwili zamierzam użyć CUDA i zrównoleglić zaawansowany ray tracer do projektu dyplomowego lub przeprowadzić badania nad niefotorealistycznym renderowaniem w rzeczywistości rozszerzonej. Zajmowanie się nimi zostawiłoby bardzo mało zajęć SE w moim harmonogramie. Gdybym poszedł drogą inżynierii oprogramowania, prawdopodobnie przeprowadziłbym badania nad programowaniem zorientowanym na dane lub złożonością projektowania oprogramowania. Czasami myślę, że kiedy skończę 40 lat i patrzę wstecz, czy to w ogóle będzie miało znaczenie? Z jakiegoś powodu myślę, że nie.


title: Jakie korzyści dla programisty oferuje język Ruby, których nie ma C#?

text: Jakie korzyści dla programisty ma język Ruby, które nie są dostępne w C# (najlepiej z przykładami kodu)?


title: MVC: Jaka jest różnica między modelem a usługą?

text: Dlaczego w niektórych frameworkach warstwa logiczna nazywana jest „Modelem”, a w niektórych „Usługą”. Czy różnią się od siebie, czy po prostu różnią się konwencjami nazewnictwa? * * * UPDATE 1 Pytam dlatego, że w Zend Framework, klasycznym frameworku MVC, wszyscy używają koncepcji Modelu. Teraz uczę się AngularJS i wygląda na to, że słowo Model zniknęło i zostało zastąpione słowem service. Zauważyłem, że usługa jest bardziej jak singleton, który może być wielokrotnie używany (przykład: klient REST), podczas gdy model jest bardziej związany z manipulacjami danymi pochodzącymi z kontrolera we wzorcu MVC.


title: Trudności menedżerów funkcjonalnych w Scrum

text: Jestem kierownikiem ds. Testów/QA w organizacji, która stopniowo przechodzi na Scrum. Nie pojawiam się na codziennych spotkaniach Scrumowych, ponieważ nie chcę ingerować w samoorganizację zespołu. Problem polega na tym, że jestem zbyt oderwany od tego, co 5 testerów, którzy się do mnie zgłaszają, robi na co dzień. Jak mogę trenować i oceniać tych testerów? A jeśli nie wykonują dobrej pracy lub wykonują zbyt mało pracy, jak mogę wiedzieć o tym na czas i działać zgodnie z tym?


title: Jaka jest korzyść z przeniesienia poczty e-mail do usługi poczty transakcyjnej?

text: Dlaczego tak wiele osób poleca przeniesienie poczty do serwisu transakcyjnego, takiego jak Mandrill, Postmark lub Sendgrid? Czy wysyłanie wiadomości e-mail przez smtp jest rzeczywiście o wiele wolniejsze niż wysyłanie żądania do wspomnianej usługi? Wyobrażam sobie, że ma to coś wspólnego z renderowaniem rzeczywistej wiadomości, ale chciałbym mieć bardziej poinformowany powód.


title: Czy powinienem się martwić „piractwem JavaScript”?

text: Jeśli piszę aplikację JavaScript po stronie klienta (z niewielką interakcją z serwerem), jak mogę uniemożliwić ludziom kopiowanie plików JavaScript do własnej witryny? Czy w ogóle powinienem?


title: Jak mogę przećwiczyć implementację struktur danych i algorytmów?

text: Właśnie skończyłem uczyć się podstaw struktur danych i algorytmów za pomocą Pythona i C, wykonując niektóre ćwiczenia z przeczytanej książki. Uważam, że konieczne jest zaimplementowanie niektórych z tych struktur danych i algorytmów, aby lepiej zrozumieć materiał, którego właśnie się nauczyłem, takie jak czerwono-czarne drzewo i kolejka priorytetów. Czy są jakieś dobre strony internetowe z materiałami do wykorzystania podczas ćwiczeń?


title: Czy realistyczne jest poproszenie zespołu o przyjęcie celu 100% zautomatyzowanego pokrycia testami jako zadania rozciągającego?

text: W środowisku usług finansowych — czy realistyczne jest poproszenie swojego zespołu dziesięciu programistów o przejęcie w 100% zautomatyzowanego celu, jakim jest pokrycie testów jednostkowych i integracyjnych, jako zadanie rozciągające dla starszego systemu Java (>1,5 mln SLOC)? [jako dwuletni cel w przyrostach]


title: Czy trudniej jest zachować moralną etykę w branży IT...?

text: czy trudniej jest zachować moralną etykę w branży IT? czy po prostu ta branża ma swój własny kodeks postępowania?. Mam inny profil z karmą bliską tysiąca. Ten wpis ma charakter osobisty, więc zamieszczam go jako anonimowy. Jestem inżynierem oprogramowania. Zrezygnowałem z pracy w firmie usługowej IT prawie 4 miesiące temu. Mam problem z zaburzeniami nastroju. Pracowałem tam ponad rok. Pracowałem nad jednym projektem od początku do końca i pracowałem nad jedną fazą kolejnego bardzo podobnego projektu. Rzuciłem pracę, ponieważ potrzebowałem elastyczności w godzinach pracy i możliwości pracy z domu, powiedzmy raz w tygodniu lub od czasu do czasu (aby poradzić sobie z moim problemem zdrowotnym). Ta praca była bardzo niską pensją płacącą za moje CV, a praca była bardzo chaotyczna i niesatysfakcjonująca w moim projekcie (nad którym pracowałem od końca do końca) i straciłem nadzieję na lepszą pracę. Nie znalazłem w zespole żadnych mentorów ani wzorów do naśladowania. Ponieważ była to firma usługowa, czułem, że każdego dnia będę nadawał status. To prawda, że z powodu mojego problemu muszę walczyć z dotrzymaniem terminów. Ale pracując w weekendy/późne noce, spotykałem się z nimi. Ale ludzie nie postrzegali tego w takim świetle. I czuję, że z czasem tylko się rozwijam i uczę w zakresie dyscypliny, a mój problem jest jak każdy inny problem zdrowotny, na który ludzie potrzebują zakwaterowania w pracy, ale kwalifikują się do pracy. Byłem szczery w swojej pracy. i biorąc pod uwagę tę elastyczność, mogę wykonywać swoją pracę. Jeśli nie wyróżniasz się, to przynajmniej spełnij oczekiwania. Rzuciłem to, ponieważ będąc w pracy, mój umysł był zawsze zestresowany i nie mogłem wymyślić, jaka byłaby dla mnie lepsza praca jako następna zmiana pracy, więc potrzebowałem czasu, aby to rozgryźć. Pod koniec też czułem się wypalony z projektu i chciałem popracować nad swoim zdrowiem. Na 2 miesiące, zgodnie z planem, zrobiłem sobie przerwę (przerwa od zmartwień zawodowych i planowania kariery, ale spędziłem czas na czytaniu podstawowych rzeczy, których chciałem się nauczyć, takich jak kraj, kultura, religia, duchowość itp.) Daje podstawę do długoterminowego pokoju . Być może mam pewien stopień zaburzenia koncentracji uwagi i czułbym się wykluczony w takich kwestiach. i chciałem spędzić miesiąc z mojego życia, utrwalając taką wiedzę w moim mózgu. potem studiowałem przez miesiąc (przygotowałem się do Google, wziąłem udział w wywiadach na miejscu (i zostałem odrzucony), więc skoncentrowałem się na strukturach danych, przygotowaniu algorytmów wraz z ogólnymi koncepcjami systemu operacyjnego) i odwróciłem uwagę od aplikowania do innych miejsc itp. Teraz, stopniowo, zanim zdałem sobie sprawę, że to 4 miesiące przerwy. Kiedy doradcy pracy dzwonią do mnie, pytają, dlaczego opuściłem poprzednią firmę bez żadnej oferty pracy. Podaję im 3 prawdziwe powody, dla których chciałem pracować dla firmy produktowej, projekt się skończył i szukałem 2 miesięcznej przerwy. Nie lubią tych powodów. a niektórzy nawet nie wysyłają mojego CV do HR, jak sądzę. to mnie zniechęca. Czym jest kodeks postępowania w branży IT? Ludzie nie wykonują swojej części pracy szczerze, zostawiają projekt pomiędzy. stają się nieostrożni w pracy w okresie wypowiedzenia. Czy to jest dopuszczalne? a może otaczają mnie ludzie, którzy dają mi takie sztuczki i to sprawia, że czuję, że w ogóle tak myślą ludzie. jak znajomy dołączył do firmy, pracował tam przez 1 miesiąc, nie podobało się to i odszedł i nie pokazał swojego CV, a inna firma czekała na niego ze swoją ofertą. Zastanawiam się, czy powinienem zacząć pracę nad jakimś projektem open source, który może się liczyć jako praca. Czy też powinienem uciec się do kłamstwa (i odpowiednio zaktualizować swoje CV), tak jak miałem złamanie, gdy miałem dołączyć do nowej firmy i musiałem więc zrobić sobie przerwę, a oferta pracy wygasła lub inny problem zdrowotny (który nie jest długoterminowy, jak zdrowie psychiczne lub coś takiego) lub problem w mojej rodzinie konsultanci otwarcie pytają mnie, czy jestem samotna, czy w związku małżeńskim. a niektórzy nie wykazują zainteresowania, ponieważ jestem singlem (i jestem w wieku umożliwiającym zawarcie małżeństwa, jak w Indiach, kiedy skończyłem studia), więc myślą, że wkrótce wyjdę za mąż, a bycie kobietą prawdopodobnie się zmieni. niektórzy konsultanci otwarcie pytają, czy masz inne oferty pracy pod ręką. Niektórzy twierdzą, że firmy dają i ustalają pensję w zależności od tego, czy jestem zatrudniony, czy nie pracuję. Słucham ludzi, którzy mówią, że łatwo jest negocjować wynagrodzenie, gdy mam pod ręką inne oferty pracy. Czy to bardziej etyczne niż to, co zrobiłem? Mam na myśli, że wynagrodzenie powinno być ustalane na podstawie własnego doświadczenia, kompetencji itp., a nie konkurencyjnych ofert. Czuję, że trudno jest zachować etykę podczas zmiany pracy, awansu zawodowego itp. w tej branży. Zaczynam czuć się sfrustrowany i szukam porady u ludzi, którzy przeszli coś podobnego. Myślę, że specjaliści od oprogramowania na całym świecie mogą to do pewnego stopnia powiązać. Mieszkam w Indiach, więc jeśli ktoś również chce skorzystać z porad dotyczących Indii, proszę, nie wahaj się.


title: Co oferuje HATEOAS w zakresie wykrywalności i rozdzielania oprócz możliwości mniej lub bardziej swobodnej zmiany struktury adresu URL?

text: Ostatnio czytałem o Hypermedia jako silniku stanu aplikacji (HATEOAS), ograniczeniu, które rzekomo sprawia, że internetowy interfejs API jest „naprawdę RESTful”. Sprowadza się to w zasadzie do włączenia linków z każdą odpowiedzią na możliwe przejścia, które możesz wykonać z obecnego stanu. Pozwolę sobie zilustrować, na czym opiera się HATEOAS na moim zrozumieniu - i proszę, popraw mnie, jeśli coś przeoczyłem. / GET: { "_links": { "child": [ { "href": "http://myapi.com/articles", "title": "articles" } ] } } /articles?contains=HATEOAS GET: { "_items": [ { "uri": "http://myapi.com/articles/0", "title": "Dlaczego powinno mnie obchodzić HATEOAS?" }, { "uri": "http://myapi.com/articles/1", "title": "HATEOAS: Problem czy rozwiązanie?" } ], "_links": { "self": { "href": "http://myapi.com/articles", "title": "articles" }, "parent": { "href": "http: //myapi.com/", "title": "home" } } } POST: { "title": "Nowy artykuł", "body": "Treść artykułu", "tags": [ "tag1", " tag2" ] } /articles/0 GET: { "title": "Dlaczego powinno mnie obchodzić HATEOAS?", "body": "Blah blah blah" "tags": [ "REST", "HATEOAS" ], "_links ": { "self": { "href": "http://myapi.com/articles/0", "title": "article" }, "parent": { "href": "http://myapi .com/articles", "title": "articles" } } } Twierdzi się, że HATEOAS zapewnia dwie główne korzyści: 1. Cała usługa jest wykrywalna, zaczynając od głównego URI, dokumentacja nie jest już potrzebna. 2. Klient jest oddzielony od serwera, który może teraz swobodnie zmieniać strukturę URI. Eliminuje to potrzebę wersjonowania interfejsu API. Ale moim zdaniem usługa to znacznie więcej niż struktura URI. Aby efektywnie z niego korzystać, musisz również wiedzieć: * jakich parametrów zapytania możesz użyć i ich możliwych wartości * strukturę JSON/XML/wszelkich dokumentów, które musisz wysłać w swoich żądaniach POST/PATCH/etc * strukturę odpowiedź wysłana przez serwer * możliwe błędy, które mogą wystąpić * ... W oparciu o powyższe, HATEOAS rozwiązuje tylko niewielki ułamek problemów z wykrywalnością i sprzężeniem. Nadal musisz udokumentować powyższe cztery aspekty, a klienci będą nadal silnie związani z serwerem z ich powodu. Aby uniknąć zepsucia klientów, nadal musisz zmienić wersję swojego interfejsu API. Jedyną korzyścią, jaką zapewnia, jest to, że możesz zmieniać strukturę adresu URL w mniej lub bardziej swobodny sposób (przy okazji, co się stało z zasadą „Cool URI nie zmieniają się”?). Czy moje rozumienie jest prawidłowe?


title: URI i reprezentacja zasobów vs zasobów

text: URL to identyfikator URI, który identyfikuje zasób według lokalizacji. _Reprezentacja zasobu_ to widok stanu zasobu. Ten widok jest zakodowany w jednym lub większej liczbie możliwych do przeniesienia formatów, takich jak XHTML, Atom, XML, MP3... Identyfikatory URI kojarzą reprezentacje zasobów z ich zasobami a) Czyli zakładam, że URI identyfikuje _reprezentację zasobów_, a nie _reprezentację zasobów_? b) Czytałem, że relacja między URI a _reprezentacją zasobów_ to _jeden do wielu_. Zakładając, że mówimy o adresie URL, w jaki sposób pojedynczy adres URL może adresować więcej niż jedną _reprezentację zasobów_? Dziękuję Ci


title: Kiedy i jak programista powinien założyć własny biznes?

text: Tytuł mówi wszystko, ale oto wyjaśnienie tego, co chcę wiedzieć: Załóżmy, że programista ma około 5 lat doświadczenia w wielu językach głównego nurtu. Załóżmy również, że programista pracował na różnych stanowiskach, od młodszego programisty, przez starszego inżyniera s/w, po kierownika zespołu. Skąd miałby wiedzieć, że nadszedł czas, aby przestać pracować dla innych i założyć własny biznes. Jak ważne są umiejętności techniczne i wymagania oprócz oczywiście wymagań finansowych. Druga część pytania to, jeśli zdecyduje się na rolę własnej firmy, jak powinien zacząć? Ok, oto więcej informacji: jestem singlem, nie mam żadnych wydatków poza własnymi rachunkami za telefon komórkowy i składkami uniwersyteckimi. Nie płacę też za mieszkanie, ponieważ mamy wspólny system rodzinny (jest to nie tylko powszechne, ale także zauważalne w mojej kulturze i społeczności). Zauważyłem, że większość ludzi przypuszczała, że chcę zbudować nowy _produkt_ lub _stronę internetową_. Chociaż doceniam wasze pomysły na ten temat, czy wy, ludzie, możecie rzucić trochę światła na inny aspekt? A gdybym chciał zbudować nowy, mały sklep z oprogramowaniem (lub software house, jak go tutaj nazywamy)?


title: Jak utrzymać enkapsulację z kompozycją w C++?

text: Projektuję klasę `Master`, która składa się z wielu innych klas, `A`, `Base`, `C` and `D`. Te cztery klasy nie mają absolutnie żadnego zastosowania poza `Master` i mają na celu rozbicie jego funkcjonalności na łatwe w zarządzaniu i logicznie podzielone pakiety. Zapewniają również rozszerzalną funkcjonalność, jak w przypadku `Base`, z której mogą dziedziczyć klienci. _Ale jak utrzymać enkapsulację `Master` w tym projekcie?_ * * * Do tej pory mam dwa podejścia, które są dalekie od doskonałości: ## 1\. Replikuj wszystkie akcesory: po prostu napisz metody akcesorów dla wszystkich metod akcesorów wszystkich klas, z których składa się `Master`. Prowadzi to do doskonałej enkapsulacji, ponieważ nie widać szczegółów implementacji `Master`, ale jest to niezwykle żmudne i sprawia, że definicja klasy jest potworna, a właśnie temu kompozycja powinna zapobiegać. Ponadto dodanie funkcjonalności do jednej z kompozycji (czy to nawet słowo?) wymagałoby przepisania wszystkich tych metod w `Master`. Dodatkowy plusblemem jest to, że spadkobiercy `Base` mogli tylko zmieniać, ale nie dodawać funkcjonalności. ## 2\. Użyj nieprzypisywalnych, niekopiowalnych akcesorów składowych: Posiadanie klasy `accessor<T>`, której nie można skopiować, przenieść ani przypisać do, ale zastępuje `operator->`, aby uzyskać dostęp do bazowego `shared_ptr`, aby wywołuje takie jak Master->A()->niceFunction(); są możliwe. Mój problem z tym polega na tym, że w pewnym sensie psuje to enkapsulację, ponieważ nie byłbym teraz w stanie zmienić mojej implementacji `Master`, aby używała innej klasy dla funkcjonalności `niceFunction()`. Mimo to jest najbliżej, do jakiego dotarłem bez użycia brzydkiego pierwszego podejścia. Całkiem ładnie rozwiązuje również problem dziedziczenia. Pobocznym pytaniem byłoby, czy taka klasa już istniała w `std` lub `boost`. * * * # EDIT: Ściana kodu Zamieszczę teraz kod plików nagłówkowych omawianych klas. Może to być trochę trudne do zrozumienia, ale dam z siebie wszystko, aby to wszystko wyjaśnić. ## 1\. GameTree.h Podstawa tego wszystkiego. Tenw zasadzie jest podwójnie powiązanym drzewem, przechowującym instancje `GameObject`, do których przejdziemy później. Ma też swój własny, niestandardowy iterator `GTIterator`, ale pominąłem to dla zwięzłości. `WResult` to wyliczenie z wartościami `SUCCESS` i `FAILED`, ale nie jest to naprawdę ważne. class GameTree { public: //Metody statyczne dla roota. W danym momencie może istnieć tylko jeden korzeń! static void ConstructRoot(seed_type seed, unsigned int depth); inline static bool rootExists(){ return static_cast<bool>(rootObject_); } inline static słaby_ptr<GameTree> root(){ return rootObject_; } //delta jest w ms, jest używana dla prędkości, kolizji i takiego void tick (unsigned int delta); //Interakcja z drzewem inline słaby_ptr<TreeGry> parent() const { return parent_; } inline unsigned int numChildren() const{ return static_cast<unsigned int>(children_.size()); } słaby_ptr<DrzewoGry> getChild(unsigned int index) const; template<typename GOType> strong_ptr<GameTree> addChild(seed_type seed, unsigned int depth = 9001){ GOType object{ new GOType(seed) }; return addChildObject(unique_ptr<GameTree>(nowy GameTree(std::move(obiekt), głębokość))); } WResult moveTo(weak_ptr<GameTree> newParent); WKasowanie wyników(); //Iteratory for( : ) pętli GTIterator& begin(){ return *(beginIter_ = std::move(make_unique<GTIterator>(children_.begin()))); } GTIterator& end(){ return *(endIter_ = std::move(make_unique<GTIterator>(children_.end()))); } //rozładowanie powinno być używane, gdy obiekty są daleko WResult unloadChildren(unsigned int newDepth = 0); WResult loadChildren(unsigned int newDepth = 1); inline const RenderObject& renderObject() const{ return gameObject_->renderObject(); }//Getter dla bazowego GameObject (nie testowałem wersji szablonu) slow_ptr<GameObject> gameObject(){ return gameObject_; } template<typu GOType> słaby_ptr<GOType> gameObject(){ return dynamic_cast<weak_ptr<GOType>>(gameObject_); } słaby_ptr<ObiektFizyki>ObiektFizyki() { return ObiektGry_->ObiektFizyki(); } private: GameTree(const GameTree&); //kopiowanie dozwolone tylko wewnętrznie GameTree(shared_ptr<GameObject> obiekt, unsigned int depth = 9001); //wskaźnik do katalogu głównego static shared_ptr<GameTree> rootObject_; //wewnętrzne zarządzanie dzieckiem słabe_ptr<GameTree> addChildObject(shared_ptr<GameTree>); WResult removeChild(indeks int bez znaku); //prywatni członkowie shared_ptr<GameObject> gameObject_; shared_ptr<GTIterator> beginIter_; shared_ptr<GTIterator> endIter_;//wektor elementów drzewa<shared_ptr<GameTree>> children_; słaby_ptr<Drzewo Gry> rodzic_; unsigned int selfIndex_; //używane do usunięcia, nie jest to konieczne void initChildren(unsigned int depth); //konstruuje dzieci }; ## 2\. GameObject.h Jest to trochę trudne do zrozumienia, ale `GameObject` zasadniczo działa tak: Podczas konstruowania `GameObject` konstruujesz jego podstawowe atrybuty i instancję `CResult`, która zawiera `vector<unique_ptr<Construction> >`. Struktura `Construction` zawiera wszystkie informacje potrzebne do skonstruowania `GameObject`, który jest ziarnem i obiektem funkcji, który jest stosowany podczas budowy przez fabrykę. Umożliwia to dynamiczne ładowanie i rozładowywanie obiektów `GameObject`, tak jak robi to `GameTree`. Oznacza to również, że musisz zdefiniować tę fabrykę, jeśli dziedziczysz `GameObject`. Dziedziczenie to jest również powodem, dla którego `GameTree` ma funkcję szablonu `gameObject<GOType>`. `GameObject` może zawierać `RenderObject` i `PhysicsObiekt`, do którego przejdziemy później. W każdym razie oto kod. klasa GameObject; typedef unsigned long seed_type; //ta deklaracja magia oznacza, że wszystkie GameObjectFactory dziedziczą po GameObjectFactory<GameObject> template<typename GOType> struct GameObjectFactory; template<> struct GameObjectFactory<GameObject>{ virtual unique_ptr<GameObject> construct(seed_type seed) const = 0; }; template<nazwa typu GOType> struct GameObjectFactory : GameObjectFactory<GameObject>{ GameObjectFactory() : GameObjectFactory<GameObject>(){} unique_ptr<GameObject> construct(seed_type seed) const{ return unique_ptr<GOType>(new GOType(seed)); } }; //tak samo jak w przypadku fabryk. jest to ważne przy przechowywaniu ich w wektorach template<typename GOType> struct Budowa; template<> struct Construction<GameObject>{ virtual unique_ptr<GameObject> construct() const = 0; }; template<typename GOType> struct Construction : Construction<GameObject>{ Construction(seed_type seed, function<void(GOType*)> func = [](GOType* null){}) : Construction<GameObject>(), seed_(seed) , func_(func) {} unique_ptr<GameObject> construct() const{ unique_ptr<GameObject> gameObject{ GOType::factory.construct(seed_) }; func_(dynamic_cast<GOType*>(gameObject.get())); return std::move(gameObject); } seed_type seed_; funkcja<unieważnij(GOType*)> func_; }; typedef struct CResult { CResult() : konstrukcje{} {} CResult(CResult && o) : konstrukcje(std::move(o.constructions)) {} CResult& operator= (CResult& inne){ if (this != &other){ for (unique_ptr<Construction<GameObject>>& child : other.constructions){konstrukcje.push_back(std::move(child)); } } return *to; } template<typename GOType> void push_back(seed_type seed, function<void(GOType*)> func = [](GOType* null){}){ constructions.push_back(make_unique<Construction<GOType>>(seed, func)) ; } wektor<unikalny_ptr<Konstrukcja<GameObject>>> konstrukcje; } CRWynik; //na koniec klasa GameObject GameObject { public: GameObject(seed_type seed); GameObject(const GameObject&); wirtualny znacznik pustki (bez znaku delta int); inline Matrix4f trafoMatrix(){ return PhysicalObject_->transformationMatrix(); } //getter inline seed_type seed() const{ return seed_; } inline CResult& properties(){ return properties_; } inline const RenderObject& renderObject() const{ return *renderObject_; } wbudowany słaby_ptr<ObiektFizyczny>FizykaObject() { return fizycyObject_; } chronione: wirtualny CResult build_(seed_type seed) = 0; Właściwości CResult_; shared_ptr<RenderObject> renderObject_; shared_ptr<ObiektFizyki> obiekt fizyki_; rodzaj_nasiona_rodzaj_; }; ## 3\. PhysicsObject To trochę prostsze. Odpowiada za pozycję, prędkość i przyspieszenie. W przyszłości poradzi sobie również z kolizjami. Zawiera trzy obiekty Transformation, z których dwa są opcjonalne. Nie zamierzam włączać akcesorów do klasy `PhysicsObject`, ponieważ wypróbowałem swoje pierwsze podejście do tego i jest to po prostu szaleństwo (ponad 30 funkcji). Brakuje również: nazwanych konstruktorów, które konstruują obiekty `PhysicsObject` o różnym zachowaniu. klasa Transformacja{ Vector3f translation_; Vector3f obrót_; Skalowanie Vector3f_; public: Transformation() : translation_{ 0, 0, 0 }, rotacja_{ 0, 0, 0 },skalowanie_{ 1, 1, 1 } {}; Transformacja (translacja Vector3f, obrót Vector3f, skalowanie Vector3f); inline Vector3f translation(){ return translation_; } inline void translation(float x, float y, float z){ translation(Vector3f(x, y, z)); } inline void translation(Vector3f newTranslation){ translation_ = newTranslation; } inline void translate(float x, float y, float z){ translate(Vector3f(x, y, z)); } inline void przetłumacz(Vector3f summand){ translation_ += summand; } inline Vector3f obrót(){ return obrót_; } inline void rotation(float pitch, float yaw, float roll){ obrót(Vector3f(pitch, yaw, roll)); } inline void rotacja(Vector3f newRotation){ rotacja_ = newRotation; } inline void rotate(float pitch, float yaw, float roll){ rotate(Vector3f(pitch, yaw, roll)); } inline void rotate(Vector3f summand){obrót_ += suma; } inline Vector3f scaling(){ return skalowanie_; } inline void scaling(float x, float y, float z){ scaling(Vector3f(x, y, z)); } inline void scaling(Vector3f noweSkalowanie){ scaling_ = noweSkalowanie; } inline void scale(float x, float y, float z){ scale(Vector3f(x, y, z)); } void scale(Vector3f factor){ scaling_(0) *= factor(0); skalowanie_(1) *= współczynnik(1); skalowanie_(2) *= współczynnik(2); } Matrix4f matrix(){ return WMatrix::Translation(translation_) * WMatrix::Rotation(rotation_) * WMatrix::Scale(scaling_); } }; klasa FizykaObiekt; typedef void tickFunction(PhysicsObject& self, unsigned int delta); class PhysicsObject{ PhysicsObject(const Transformation& trafo) : transformacja_(trafo), transformacjaVelocity_(nullptr), transformacjaAcceleration_(nullptr),tick_(nullptr) {} PhysicsObject(PhysicsObject&& inne) : transformacja_(inne.transformacja_), transformacjaVelocity_(std::move(other.transformationVelocity_)), transformacjaAcceleration_(std::move(other.transformationAcceleration_)), tick_(inne.tick ) {} Transformacja transformacji_; unique_ptr<Transformacja>transformacjaVelocity_; unique_ptr<Transformacja> transformacjaPrzyspieszenie_; tickFunkcja* tick_; public: void tick(unsigned int delta){ tick_ ? tick_(*to, delta) : 0; } inline Matrix4f transformacjaMatrix(){ return transformacja_.matrix(); } } ## 4\. RenderObject `RenderObject` jest klasą bazową dla różnych typów rzeczy, które mogą być renderowane, tj. siatki, źródła światła lub sprite'y. _ZASTRZEŻENIE:_ Nie napisałem tego kodu, pracuję nad tym projektem z kimś innym. klasa RenderObject { public: RenderObject(float renderDistance); wirtualny ~RenderObject(); float renderDistance() const { return renderDistance_; } void setRenderDistance(float rD) { renderDistance_ = rD; } chronione: float renderDistance_; }; struct NullRenderObject : public RenderObject{ NullRenderObject() : RenderObject(0.f){}; }; class Light : public RenderObject{ public: Light() : RenderObject(30.f){}; }; class Mesh : public RenderObject{ public: Mesh(unsigned int seed) : RenderObject(20.f) { meshID_ = 0; identyfikator_tekstury_ = 0; if (seed == 1) meshID_ = Model::getMeshID("EM-208_heavy"); w przeciwnym razie meshID_ = Model::getMeshID("kostka"); }; unsigned int getMeshID() const { return meshID_; } unsigned int getTextureID() const { return identyfikator_tekstury_; }prywatne: unsigned int meshID_; unsigned int textureID_; }; Myślę, że to całkiem ładnie pokazuje mój problem: widzisz kilka akcesorów w `GameObject`, które zwracają `weak_ptr`s, aby uzyskać dostęp do członków członków, ale tak naprawdę nie tego chcę. Pamiętaj również, że **NIE** jest to kod ukończony lub produkcyjny! To tylko prototyp i mogą występować niespójności, niepotrzebne „publiczne” części klas i tym podobne.


title: Czy należy opracować specjalną wersję strony internetowej dla użytkowników tabletów?

text: Czy wersja strony internetowej na komputery stacjonarne jest zawsze wystarczająca dla wersji na tablety (zakładając, że nie ma flasha)? czy też często zdarza się, że strony internetowe mają specjalną wersję tabletu, która różni się zarówno od komputera stacjonarnego, jak i telefonu?