title: Ograniczenia polimorfizmu w językach statycznie typowanych

text: Programuję głównie w językach statycznie typowanych, takich jak C++ i Java. Powszechną strategią stosowaną w takich językach do obsługi kolekcji obiektów, które są _pokrewne_ , ale które wymagają określonych zachowań, jest użycie polimorfizmu i hierarchii dziedziczenia. Ale Polymorphism działa tylko wtedy, gdy klasa Base ma metodę (funkcję wirtualną), która może być następnie nadpisana przez każdą klasę Derived. Jednak często zdarzają się przypadki, w których klasa Derived musi mieć metodę, a umieszczanie metody o tej samej nazwie w klasie Base nie ma sensu, ponieważ jest ona bardzo specyficzna dla klasy Derived. Podam konkretny przykład, do którego prawdopodobnie wielu z nas może się odnieść: HTML DOM. Programiści JavaScript są przyzwyczajeni do robienia takich rzeczy, jak iterowanie po kolekcjach węzłów DOM. Przyjmują za pewnik dynamicznie typowaną naturę JavaScript, gdy robią coś takiego: node = document.getElementById("foo"); for (var i = 0; i < node.childNodes.length; ++i) doSomething(node.childNodes[i]); Coś takiego byłoby bardzo kłopotliwe do zrobienia w statycznie typowanym języku, takim jak Java, ponieważ polimorfizm oparty na dziedziczeniu nie nadaje się dobrze do sytuacji, w których klasy pochodne mają metody, które nie istnieją w klasie bazowej. Na przykład, podczas iteracji po powyższych węzłach HTML, możemy znaleźć węzeł DIV, który ma określone metody i węzeł Text, który ma pewne różne metody, oraz węzeł TABLE, który ma swoje własne unikalne metody - i nie byłoby ma sens, aby WSZYSTKIE te różne metody istniały we wspólnej klasie bazowej „Węzeł”, ponieważ są one wysoce specyficzne dla każdego typu pochodnego. (np. węzeł DIV nie potrzebuje metody „komórek”, ale węzeł TABLE tak.) Tak więc, w statycznie typowanym języku, byłbybyś zmuszony wrócić do czegoś takiego jak Type Enums i dużo bałaganu. rzutowanie, aby sprawdzić jaki typ węzła posiadasz. Więc w zasadzie kończysz z niechlujnym kodem, takim jak: Node node = document.getElementById("foo"); for (int i = 0; i < node.childNodes().length(); ++i) { Węzeł n = node.childNodes().elementAt(i); if (n.type() == Węzeł.DIV_NODE) doCośZDiv(((DivNode)(n))); else if (n.type() == Node.TABLE_NODE) doSomethingWithTable(((TableNode)(n))); /* itd... */ } Jest to podobne do tego, co robią programiści C, i wydaje się, że jest to rodzaj rzeczy, które zaprojektowano, aby _unikać_ funkcji wirtualnych. A jednak, gdy masz do czynienia z sytuacją, w której istnieją różne różne metody w klasie pochodnej, dla których nie ma sensu umieszczać we wspólnej klasie bazowej, nie masz innego wyjścia, jak uciekać się do czegoś takiego jak Wyliczenia typów . Jak więc ten problem jest zwykle rozwiązywany w językach statycznie typowanych? Czy istnieje lepszy wzorzec projektowy niż Type Enums?


title: JavaScript, JQuery, a teraz AngularJS Co się dzieje?

text: Byłem z dala od komputerów przez około 3 lata i zacząłem wracać do programowania. Wiele się zmieniło w zasobach i witrynach pomocy dostępnych w Internecie, zwłaszcza w rozwijającej się społeczności StackExchange. Pochodzę z dni IRC #javascript, #html, #php z php.net i trochę wyszukiwania google tu i tam. Powiedziawszy to, zanim zrobiłem sobie przerwę w programowaniu, JQuery było już w pobliżu, ale nie tak powszechne jak dzisiaj. Osobiście trzymam się od tego z daleka, łatwiej jest po prostu napisać to, co muszę zrobić w tradycyjnym javascript. Teraz właśnie natknąłem się na AngularJS. Niewiele o tym wiem, po prostu zajrzałem na stronę główną i zobaczyłem kilka przykładowych skryptów. Moje pytanie brzmi: czy utrudniam moim klientom używanie javascript, nie znając JQuery i/lub AngularJS?


title: Edytor wykresów/diagramów współpracujący z pseudografiką

text: Czy istnieje narzędzie do edycji wykresów/diagramów, które może generować (a nawet lepiej analizować) pseudografikę, którą można łatwo wstawić do komentarzy do kodu źródłowego? Tak: +---------------+ | Niektóre klasy | +---------------+ | ---------- |----------->| Inna klasa | | @it_atrybut| +---------------+ | @inny_atr | / +---------------+ --------/ | / | / +---------------+ |Coś innego | +---------------+


title: Wysyłaj wcześnie, nigdy nie wysyłaj

text: Zaczęło się od „Notatki do siebie”, więc proszę wybacz mi, jeśli frustracja jest zbyt wyraźna, a pisanie jest mniej niż gwiezdne… Trzy główne tematy, które ostatnio miałem na czele: 1. Motywacja 2 Uczenie się (ciekawość) 3. Robienie (robienie) Od miesięcy studiuję motywację i bodźce. Wydaje się, że istnieje nieskończona liczba różnych motywacji, które ludzie mogą mieć do robienia rzeczy (zdaję sobie sprawę, że brzmi to banalnie, ale znoszę to). Naprawdę ciągnęło mnie do tego, ponieważ desperacko pragnę dowiedzieć się **dlaczego robię to, co robię i dlaczego nie robię rzeczy, które chcę robić, ale nie robię**. Jestem w trakcie czytania znakomitej książki Paula Grahama Hackers and Painters. W nim twierdzi, że hakerzy i malarze są bardzo podobni, ponieważ obaj są „twórcami”. Malarze _robią_ obrazy. Hakerzy _tworzą_ oprogramowanie. Malarze niekoniecznie muszą rozumieć skład chemiczny farby, aby tworzyć piękne obrazy. A hakerzy niekoniecznie muszą znać jedynki i zera, aby tworzyć piękne oprogramowanie. Graham następnie dokonuje rozróżnienia pomiędzy różnymi dziedzinami informatyki: 1. niektórzy ludzie wydają się studiować matematykę 2. niektórzy wydają się studiować komputery sami 3. hakerzy _tworzą_ oprogramowanie. Różnica jest niezwykle istotna. Wydaje się, że motywacją dla niektórych jest _robienie_ pięknych rzeczy. A motywacją dla innych jest uczenie się z ciekawości. Pewne motywacje wydają mi się oczywiste, ale ciekawość wydaje się nieco mniej oczywista. Z pewnością uważałbym się za osobę ciekawską z pozornie nienasyconym pragnieniem poznania wszystkiego, co tylko mogę. Ale właśnie tutaj pojawia się problem. Rzeczą, która tak bardzo mnie przeraża, jest to, że rozpaczliwie chcę coś robić. Rozpaczliwie chcę coś robić. Chcę napisać książkę. Chcę namalować obraz. Chcę skomponować piosenkę. Chcę _robić_ takie rzeczy jak podróże. Ale dziwność polega na tym, że ja też chcę się czegoś nauczyć. Chcę nauczyć się grać na gitarze. Chcę _uczyć się_ o historii sztuki. Chcę dowiedzieć się więcej o filozofii i literaturze. Kluczem wydaje się być równowaga między uczeniem się a robieniem... między nauką a robieniem. Chociaż nie jestem pewien, ile należy się dowiedzieć o danej rzeczy przed zrobieniem tego, wiem na pewno, że ciągle znajduję się po jednej stronie, a nie po drugiej. W obecnej sytuacji (i o ile wiem, że zawsze tak było), jestem uczniem, a nie wykonawcą. Czytałam świetne książki. Gram na gitarze od lat. Spędziłem niezliczone godziny na nauce programowania. Ale napisałem 0 książek. Skomponowałem 0 piosenek. Zakodowałem 0 pięknych programów. Namalowałem 0 pięknych obrazów. Założyłem 0 rentownych firm. Przerażające jest to, że na świecie jest prawdopodobnie niezliczona ilość niedokończonych dzieł sztuki. Czy to moja mizantropijna zemsta na społeczeństwie i kulturze, by nigdy nie wyprodukować ani nie ukończyć żadnego z dzieł sztuki, które zacząłem? Być może najgorszą częścią (poza tym, że to moja naturalna skłonność), jest fakt, że ja kurwa wiem lepiej. Właśnie skończyłem książki takie jak „Getting Things Done” i „Making Ideas Happen”. Zebrałem i zsyntetyzowałem niezliczone słowa mądrości na temat tego, jak robić rzeczy i jak robić rzeczy. Wyobraź sobie okropność przechodzenia przez życie bez możliwości robienia rzeczy, które chcesz robić. Jeśli jest to coś, z czym zmagałeś się (i miejmy nadzieję, że przezwyciężyłeś), udostępnij. Jeśli nie... może jakaś pyszna litość poprawiłaby mi humor. [AKTUALIZACJA: Chciałem tylko szybko podziękować wszystkim, którzy podzielili się swoimi przemyśleniami. Celowo pozostawiłem pytanie nieco otwarte w nadziei, że zachęcę do dyskusji i skłoni innych do przekształcenia głównego problemu wokół ich podobnych doświadczeń, i myślę, że wyszło świetnie... jest tu wiele niesamowitych wglądów do pracy i to było naprawdę pomocny. Dzięki jeszcze raz.]


title: Czy startupy potrzebują dbać?

text: Jestem osobą zajmującą się bazami danych/BI z ponad 5 letnim doświadczeniem (SQL Server i Oracle). Bardzo chciałbym pracować dla startupu, ale z odczucia, jakie odczuwam po obejrzeniu ofert pracy, większość startupów nie szuka ludzi innych niż programiści do swojego zespołu IT. Czy startupy w ogóle szukają innych ludzi IT niż programiści? A jeśli tak, to jak mogę się połączyć z tymi, którzy szukają osób DB?


title: Co jest droższe w przypadku wielu gałęzi warunkowych lub wielu wyrażeń relacyjnych w jednym warunku?

text: Co jest droższe pod względem kosztów przetwarzania if ( x < 20 && z == "M") { // wyciągi 3 } if ( x >= 20 && w && x <= 65) { // wyciągi 1 } if( x >= 20 && z == "F"){ // oświadczenia 2 } lub to if ( x < 20 ) { if( z == 'M') // oświadczenia 3; } else if ( x <= 65 && w == true ) // instrukcje 1; if ( z == 'F' ) // instrukcje 2; }


title: Jak ważne jest zmniejszenie liczby linii w kodzie?

text: Jestem programistą pracującym na J2SE (core java). Często podczas naszych przeglądów kodu jesteśmy proszeni o zmniejszenie liczby linii w naszym kodzie. Nie chodzi o usuwanie zbędnego kodu, chodzi o przestrzeganie stylu, który koncentruje się na robieniu tych samych rzeczy z mniejszą liczbą wierszy w kodzie, podczas gdy wierzę w przejrzystość kodu, nawet jeśli oznacza to zwiększenie liczby wierszy. Jak myślisz, jaki jest właściwy sposób robienia rzeczy? Jeśli LOC (wiersze kodu) to mała liczba, jaki ma to wpływ na kod? Jeśli LOC jest większą liczbą, jaki ma to wpływ na kod? przykład ze strony internetowej : "javaranch" - public static void happyBirthday(int age) { if ((wiek == 16) || (wiek == 21) || ((wiek > 21) && (((wiek % 10) == 0) || ((wiek % 25) == 0)))) { System.out.println("Super specjalne przyjęcie w tym roku!"); } else { System.out.println("Rok starszy. Znowu."); } } VS public static void happyBirthday(int wiek) { boolean sweet_sixteen = (wiek == 16); większość logiczna = (wiek == 21); dorosły boolowski = (wiek > 21 lat); dekada logiczna = (wiek % 10) == 0; ćwiartka logiczna = (wiek % 25) == 0; if (sweet_sixteen || większość || (dla dorosłych && (dekada || kwartał))) { System.out.println("Super specjalne przyjęcie w tym roku!"); } else { System.out.println("Rok starszy. Znowu."); } }


title: Entity Framework 6 Konwencji

text: Często korzystam z Entity Framework, ale mam jeden obszar zamieszania, który chciałbym lepiej zrozumieć. Jeśli chciałem mieć właściwość nawigacyjną w encji, taką jak public virtual ExampleObject Przykład {get;set;}, dobrze jest również mieć właściwość Id public int ExampleId {get;set;} Moje rozumienie jest takie, że tworzy FK , ale jeśli go pominę, funkcjonalność jest taka sama, a FK i tak wygląda na stworzoną. Czy jest więc powód do dodatkowego pola?


title: Dlaczego świat .NET nie ma czegoś takiego jak rails/grails/django/roo?

text: Wydaje mi się, że szybko rozwijające się platformy internetowe radykalnie zmienią świat aplikacji internetowych. Od wydania Rails 1.0 dla Rubiego minęło pięć lat i od tego czasu widzieliśmy Grails dla Groovy, Django dla Pythona i Roo dla Javy. Ale według mojej wiedzy (która prawdopodobnie jest ograniczona, jako programista Java/Groovy) nie ma podobnego frameworka dla C#. Czy coś takiego istnieje? Jeśli nie, dlaczego nie? **Edycja:** Jest całkiem możliwe, że nie używam właściwych słów, kiedy mówię „szybki rozwój”, ale mówię o frameworkach, które mogą pozwolić Ci zbudować działający silnik blogowy w 30 minut. Nie można tego rozsądnie zrobić z, powiedzmy, Javą, Springiem i Hibernate, biorąc pod uwagę różne konfiguracje potrzebne do odnalezienia kontrolerów oraz zarówno konfigurację, jak i kod niezbędny do utrwalenia i odzyskania encji. Mówię więc o frameworkach, które obsługują całe CRUD z mentalnością przeładowania konwencją. Jeśli ktoś ma odpowiednie słowa na to, o czym mówię, daj mi znać.


title: Jak mogę nakłonić anonimowego użytkownika do zgłaszania błędów w prywatnym projekcie GitHub?

text: Nasza firma posiada prywatne repozytorium GitHub dla projektu, nad którym pracuję. Po całym lecie pracy, wygląda na to, że ruszamy w tym tygodniu (och!). Jednak chcę dołączyć do programu link „prześlij błąd”, który prowadzi do formularza, w którym użytkownik może wypełnić formularz, który staje się dla nas problemem na GitHub. Googlowanie nie znalazło żadnego rozwiązania (lub kogoś, kto ma ten sam problem). Czy jest to możliwe (może przez jakiś interfejs API?) czy będę musiał ręcznie wprowadzać błędy zgłaszane przez moich użytkowników?


title: "Dowód to program; formuła, którą udowadnia jest typem programu"

text: To może być pytanie o charakterze filozoficznym, ale wierzę, że istnieje na nie obiektywna odpowiedź. Jeśli przeczytałeś artykuł w Wikipedii o Haskell, możesz znaleźć następujące informacje: > Język jest zakorzeniony w obserwacjach Haskella Curry'ego i jego > intelektualnych potomków, że „dowód jest programem; formuła, którą dowodzi > jest typem dla program" Teraz pytam: czy nie dotyczy to właściwie wszystkich języków programowania? Jaka cecha (lub zestaw cech) Haskella sprawia, że jest on zgodny z tym stwierdzeniem? Innymi słowy, w jaki zauważalny sposób to stwierdzenie wpłynęło na projekt języka?


title: Czy można edytować wbudowany moduł Pythona?

text: Obecnie uczę się Pythona i jestem w punkcie w książce o korzystaniu z biblioteki Math. Zajrzałem na stronę Pythona i zauważyłem, że biblioteka jest trochę uboga i piszę kilka bardziej przydatnych funkcji. Na przykład napisałem funkcję pobierającą współczynniki i zwracającą pierwiastki równania. Zasadniczo funkcja równania kwadratowego. Zastanawiam się, czy można to dodać do biblioteki Math Pythona. Jeśli tak nie jest, jak mam to zapisać, aby móc używać tej funkcji w innych programach Pythona, które piszę, po prostu ją wywołując?


title: Projektowanie obiektów i spójność - problem i potencjalna refaktoryzacja

text: **Abstrakt** Próbowałem zrozumieć spójność niektórych funkcji w naszej bazie kodu. Podchodziłem do tego projektu na różne sposoby i ostatnio jestem przekonany, że przyjąłem złe podejście, ponieważ niewłaściwie zastosowałem zasadę pojedynczej odpowiedzialności. **Problem** Problematyczną domeną jest studnia, zwana inaczej okrągłą dziurą w ziemi. Obecny kod wygląda mniej więcej tak... Mam zestaw danych w obiekcie tylko do danych... Uwaga: To nie jest pełny kod, tylko nazwy metod, aby wszystko było krótkie... public class WellData { public string Name { Dostawać; ustawić; } public ICollection<SurveyPoint> SurveyPoints { get; ustawić; } public ICollection<GeometryItem> GeometryItems { get; ustawić; } public ICollection<TemperaturePoint> WellTemperature { get; ustawić; } public ICollection<FluidPoint> WellFluids { get; ustawić; } } Rozbiłem funkcjonalność operującą na tych danych na kilka małych klas. Jak poniżej… public class ReferenceWellSurvey { ICollection<SurveyPointCalculate> _calculatedSurveyPoints; double GetTvdAtDepth(double depth) {} double GetAzimuthAtDepthRad(double depth) {} double GetInclinationAtDepthRad(double depth){} double GetTortuosityPeriodAtDepth(double depth ) {} double GetTortuosityAmplitudeAtometrDepth(podwójna głębokość klasy) {> ; double GetFrictionAtDepth(double depth) {} double GetHoleIdAtDepth(double depth) {} } public class ReferenceWellTemperature { ICollection<TemperaturePoint> _wellTemperatures; double GetTemperatureAtDepth(double depth) {} double GetSurfaceTemperature(double depth) {} } Itd. Ostatnio, patrząc na nasz kod, zdałem sobie sprawę, że muszę to wszystko skleić z powrotem, aby można go było używać tam, gdzie jest to potrzebne w logice aplikacji . Coś jak…. public class ReferenceWellData { private IReferenceWellGeometry _refWellGeometry; prywatne IReferenceWellTemperature _refWellGeometry; prywatne IReferenceWell _refWellGeometry; prywatny IReferenceFluid _refWellFluid; //Funkcje proxy z każdej klasy sklejają to wszystko z powrotem… } Kilka rzeczy, które doprowadziły mnie do obecnego bałaganu. Klasa well data zawiera kilka zbiorów informacji i jeśli wszystko jest w jednej klasie, większość funkcji będzie działać tylko na małym podzbiorze danych. Wtedy czułem, że stworzy to niską spójność, teraz kilka miesięcy później czuję, że te rzeczy naprawdę pasują do siebie. Dodatkowo w moim kodzie jest kilka klas, które wymagają wywołania tylko jednej metody klasy ReferenceWellSurvey, GetTvdAtDepth(). Naprawdę to, co zrobiłem, nie rozwiązało tego problemu. Po zastanowieniu się nad tym i po przeczytaniu tego artykułu Wikipedii http://en.wikipedia.org/wiki/Cohesion_(computer_science), zaczynam dostrzegać, że popełniłem kilka grzechów programistycznych. • Anemiczny model domeny • Niska spójność • Konstruktor nad wstrzykiwaniem w kodzie, w którym staram się sklejać ze sobą • Udostępnienie klasie zależnej od GetTvdAtDepth do innych metod, które nie są jej potrzebne, naruszało Zasadę Segregacji Interfejsów. **Rozwiązanie** Szukam tego projektu Goldilox, który nie daje zbyt dużej odpowiedzialności na żadną klasę (brak obiektów boga), jednocześnie zachowując dobry stopień spójności. Moje obecne przemyślenia na temat naprawy tego są następujące. Przenieś funkcjonalność działającą na danych studni do tej samej klasy. Powinno to pomóc zbliżyć tę funkcjonalność do spójności komunikacyjnej/informacyjnej. public class WellData : IWellData { ciąg publiczny Nazwa { get; ustawić; } public ICollection<SurveyPoint> SurveyPoints { get; ustawić; } public ICollection<GeometryItem> GeometryItems { get; ustawić; } public ICollection<TemperaturePoint> WellTemperature { get; ustawić; } public ICollection<FluidPoint> WellFluids { get; ustawić; } // Działa na kolekcji SurveyPoint double GetTvdAtDepth(double depth) {} double GetAzimuthAtDepthRad(double depth) {} double GetInclinationAtDepthRad(double depth){} double GetTortuosityPeriodAtDepth(double depth ) {} double GetTortuosityDepth(doublet) w kolekcji WellGeometry double GetFrictionAtDepth(double depth) {} double GetHoleIdAtDepth(double depth) {} //działa na kolekcji WellTemperature double GetTemperatureAtDepth(double depth) {} double GetSurfaceTemperature(double depth) {} } potrzebuję tylko jednej funkcji, mógłbym z niej zrobić osobny interfejs IGetTvdAtDepth. W ten sposób moje klasy, które potrzebują tej funkcjonalności, mogą zależeć tylko od tego interfejsu, który mogę odziedziczyć do mojego interfejsu WellData i tam go zaimplementować, ale nie wiązać moich innych klas z całą funkcjonalnością, która jest w mojej klasie WellData. Myśli o tym podejściu a oryginalne podejście? Jedną rzeczą, która przeszkadza mi w robieniu rzeczy w ten sposób, jest to, że w moim API używam wstrzykiwania bastard, aby spełnić wymagane zależności tej klasy... W tej chwili mam trzy wymagane zależności, kalkulator ankiet i specjalną klasę, która odwołuje się do danych na różnych zmierzonych głębokościach. Chciałbym odejść od tego, ale wydaje się to wskazywać na to, że usługi wykonują więcej podnoszenia ...


title: Jak mogę zmotywować kolegów z zespołu do pracy?

text: Zostałem zwerbowany w małym zespole siedmiu programistów około 4 miesiące temu w małym projekcie Java obejmującym podstawowe tworzenie gier, w którym każdy programista musi wykonać określoną część. Na przykład programiści 1,2 i 3 mają duże doświadczenie w Javie i otrzymują trudniejsze zadania, podczas gdy programiści 4 i 5 zajmują się drobnymi szczegółami projektu. (Oni też programują, ale dostają nudne rzeczy) Jesteśmy stosunkowo dobrze zorganizowani, wszyscy mieszkamy w różnych krajach i komunikujemy się przez skype i udostępniamy źródło przez Dropbox, gdzie przechowujemy dziennik aktualizacji, listę zadań i tak dalej, ale generalnie zawsze pojawia się problem w rozwoju projektu. Zasadniczo każdy zostaje zmotywowany na dzień lub dwa i pracuje nad szybkim kodem, który spełnia swoje zadanie (chociaż nie zawsze jest w 100% wydajny, ale czysty i łatwy w utrzymaniu), po czym przestaje działać i traci motywację, ponieważ myśli, że tylko on wykonuje swoją pracę . Wykonano bardzo niewiele pracy, a ich wiedza programistyczna mogłaby poprowadzić projekt do góry, gdyby użyli jej właściwie. Zawsze istnieje czynnik demotywujący w rozwoju projektu, taki jak „Nie podoba mi się ta funkcja, myślę, że powinniśmy wrócić” lub „Nikt nie działa, więc ja też nie będę” i ostatecznie wszystko okazuje się bałaganiarskie . Moje pytanie brzmi – co można zrobić, aby ich zmotywować? Jak mogę nimi zarządzać tak, aby stale pracowali nad projektem? **EDYTUJ:** Zapomniałem dodać, że wszyscy programiści w projekcie robią to głównie dla doświadczenia, **_pracują za darmo_** i nie zarabiają. Osobiście pracuję, bo chcę zdobyć doświadczenie w pracy z zespołem.


title: Jak można zaimplementować prawdziwy wektor w Haskell?

text: Jak można zaimplementować prawdziwy typ Vector w Haskell? Aby coś było wektorem, musi być przechowywane sekwencyjnie w pamięci, z losowym dostępem `O(1)`. Ale Haskell ukrywa swoje zarządzanie pamięcią, a jego typy danych opisują drzewa! Jak więc możesz wyrazić tego rodzaju wymagania?


title: Klasyczny problem dziedziczenia?

text: Ciągle widzę następujący wzorzec, gdy ludzie dowiadują się o OOP: Problem: Jak umieścić obiekty różnych, ale powiązanych typów w kontenerze? Rozwiązanie: Dziedzicz ze wspólnej klasy bazowej. Nowy problem: mam kilka obiektów klasy bazowej, jak uzyskać prawdziwy typ? Rozwiązanie: ??? Klasycznym przykładem dziedziczenia jest stworzenie programu graficznego, który zajmuje się obiektami geometrycznymi. Mamy „Kółko”, „Elipsę” i „Trójkąt”. Wszystkie te obiekty mają wspólną bazę `Drawable`. ![Drawable](http://i.stack.imgur.com/LuLXm.png) W C++ może to wyglądać mniej więcej tak: struct Drawable{ virtual ~Drawable(){} virtual void draw() const = 0; }; struct Triangle : Drawable{ Punkt p1, p2, p3; void draw() const nadpisanie; void stretch (podwójny xfactor, podwójny yfactor); std::touple<double, double, double> getAngles() const; //... }; struct Circle : Drawable{ podwójny promień; void draw() const nadpisanie; //... }; struct Ellipse : Drawable{ podwójny promień; void draw() const nadpisanie; //... }; std::vector<Drawable *> drawables = {nowy okrąg, nowy trójkąt, nowa elipsa}; for (const auto &d : drawables) d->draw(); Na razie w porządku. Teraz chcę zwiększyć promień moich 'Kręgów' i 'Elipsy'. O ile wiem, można to zrobić na 4 sposoby: 1: Umieść wszystko w klasie bazowej. Klasa bazowa pobiera funkcje wirtualne `getAngles`, `getRadius`, `stretch` i `getEccentricity`. Dla każdego z nich istnieje domyślna implementacja, więc na przykład `getRadius` zwraca jakąś fikcyjną wartość, gdy mamy do czynienia z `Trójkątem`. Po wykonaniu tej czynności możesz łatwo iterować po `Drawable`s i zwiększać ich promień. To sprawia, że klasa bazowa jest absurdalnie duża, a praca z `vectorem<Drawable *>` staje się nieefektywna, ponieważ funkcje nie robią nic dla większości elementów. 2: Użyj hacków typu „dynamic_cast”. for (const auto &d : drawables){ if (dynamic_cast<Okrąg *>(d)) ((Okrąg *)d)->promień++; else if (dynamic_cast<Elipsa *>(d)) ((Elipsa *)d)->promień++; } Niestety musisz powtarzać tę brzydką składnię za każdym razem, gdy musisz zrobić coś takiego. Nie możesz umieścić go w funkcji lub makrze. Za każdym razem, gdy dodawany jest nowy `Drawable`, musisz przejrzeć całą bazę kodu i dodać go tam, gdzie to konieczne. Również łańcuch `if`/`else` jest dość nieefektywny. 3: Dodaj Tag jako pierwszą zmienną składową i odpowiednio rzutuj. for (const auto &d : drawables){ switch(d->tag){ case Tag::Circle: ((Circle *)d)->radius++; przerwanie; wielkość liter Tag::Elipsa: ((Elipsa *)d)->promień++; przerwanie; } } Nieco bardziej wydajny dzięki przełącznikowi zamiast łańcucha `if`/`else`, ale istnieje już rodzaj znacznika, który pokazuje typ dynamiczny, więc znacznik jest zbędny. Ma również ten sam problem co 2: ponieważ musisz zmienić cały kod, gdy pojawia się nowy `Drawable`. 4: Po prostu trzymaj przedmioty w oddzielnych pojemnikach. vector<Circle> okręgi; trójkąty vector<Triangle>; wektor<Elipsa> elipsy; for (auto &c : okręgi) c.promień++; for (auto &e : elipsy) e.radius++; Jest to bardzo wydajny układ pamięci pod względem układu pamięci i iterujesz tylko po obiektach, które mają znaczenie. Jest to mój ulubiony, ale niestety łamie pierwsze rozwiązanie, w którym nie trzymasz różnych typów obiektów w jednym pojemniku. Próbowałem rozwiązać ten problem, tworząc szablon wariadyczny, który wewnętrznie ma „wektor” na typ i przekazuje wstawki do odpowiedniego kontenera. Idealnie byłoby całkowicie ukryć fakt, że pod maską znajdują się różne pojemniki. Użycie wyglądałoby mniej więcej tak: MultiVector<Triangle, Circle, Ellipse> mv; mv.push_back(Trójkąt()); mv.push_back(Okrąg()); mv.push_back(Elipsa()); for (auto &d : mv.get<Circle, Ellipse>()) d.radius++; Rozwiązanie nie jest idealne, na przykład różne typy nie zachowują swojej kolejności, a wdrożenie iteracji jest trudne. Przedstawiłem ten problem i próbę rozwiązania mojej (uniwersyteckiej) grupie badawczej i otrzymałem reakcje „ _Jeśli dobrze zaprojektujesz zajęcia, to nie jest problem_ ” oraz „ _Proponowane rozwiązanie jest bardzo konkretnym narzędziem do rozwiązania bardzo konkretnego problemu i jest w najlepszym razie wątpliwe, aby dodać jeszcze większą złożoność do c++ dla tak drobnego szczegółu_ ”. Moim zdaniem jest to bardzo podstawowy problem, który wymaga naprawy, a zwykłe rozwiązanie polegające na lepszym projektowaniu klas tylko próbuje znaleźć najmniejsze z 4 obejść w konkretnym przypadku bez faktycznego rozwiązania problemu. Problem pojawia się prawie za każdym razem, gdy stosuje się dziedziczenie. Na koniec pojawia się pytanie: czy Ty też spotkałeś się z tym problemem / czy to jest prawdziwy problem? Czy znasz inne obejście/rozwiązanie? Czy inne języki lepiej radzą sobie z tym problemem? Chcę zasymulować ankietę za pomocą 2 komentarzy poniżej, więc możesz zagłosować albo „ _Nigdy nie miałem tego problemu / Problem można łatwo rozwiązać._ ” lub „ _Miałem również ten problem i nigdy go nie rozwiązałem w sposób zadowalający._ ” Edytuj: Aby zapobiec zamknięciu z powodu głównie opartej na opinii / dyskusji: Chcę jasnej odpowiedzi, która rozwiąże problem lub jakiegoś źródła, które mówi, że nie ma. Edycja: Powiązane: Czy naprawdę mam samochód w garażu?


title: Używanie lambd do poprawy hermetyzacji

text: Tak jak wielu ludzi wytrwale wierzy w małe funkcje, niektórzy uważają, że lambdy powinny zawierać tylko małe fragmenty kodu. Często pomijaną zaletą lambd jest jednak to, że używając ich możesz **zawrzeć zachowanie, które w innym przypadku musiałbyś udostępnić całej klasie**. Czy nie jest prawdziwą zaletą utrzymanie właściwej enkapsulacji, niezależnie od liczby linii? Jakie ewentualne wady korzystania z funkcji anonimowych z dużą ilością wierszy kodu przeoczam? * * * Poniżej znajduje się rzeczywisty przykład. `argumentsMatch` wykonuje bardzo specyficzne dopasowanie argumentów, w dużym stopniu zależne od zachowania funkcji, w której jest zdefiniowane. Poniższy kod IMHO jest zgodny z zasadą pojedynczej odpowiedzialności. Przeniesienie argumentu `argumentsMatch` do metody prywatnej skutkowałoby wywołaniem jej tylko z poziomu tej metody. /// <summary> /// Pobierz pierwszy znaleziony pasujący typ ogólny. /// Parametry typu typu ogólnego są opcjonalne. ///   Np. Dictionary<,> /// Gdy znany jest typ pełny (ogólny) (np. Dictionary<string,string>), /// operator "is" jest najprawdopodobniej bardziej wydajny, /// ale ta funkcja nadal będzie działać poprawnie. /// </summary> /// <param name = "source">Źródło tej metody rozszerzenia.</param> /// <param name = "type">Typ do sprawdzenia.</param> /// <returns> /// Pierwszy znaleziony pasujący kompletny typ ogólny, /// lub null, gdy nie znaleziono pasującego typu. /// </returns> public static Type GetMatchingGenericType( this Type source, Type type ) { Type[] genericArguments = type.GetGenericArguments(); Wpisz rawType = type.IsGenericType ? type.GetGenericTypeDefinition() : typ; // Używane do porównywania argumentów typu i sprawdzania, czy pasują. Func<Type[], bool> argumentsMatch = arguments => genericArguments .Zip( argumenty, Tuple.Create ) .All( t => t.Item1.IsGenericParameter || // Nie określono typu. t.Item1 == t.Item2 ); Typ matchingType = null; if ( type.IsInterface ) { // Przejdź przez wszystkie interfejsy, aby znaleźć pasujący interfejs. matchingType = (z t in source.GetInterfaces() let rawInterface = t.IsGenericType ? t.GetGenericTypeDefinition() : t gdzie rawInterface == rawType && argumentsMatch( t.GetGenericArguments() ) select t).FirstOrDefault(); } else { // Przechodzenie przez typ i wszystkie jego typy podstawowe. Typ baseType = źródło; while ( baseType != null && baseType != typeof( obiekt )) { Type rawCurrent = baseType.IsGenericType ? baseType.GetGenericTypeDefinition() : baseType; if ( rawType == rawCurrent ) { // Ten sam surowy typ ogólny, porównaj argumenty typu. if ( argumentsMatch( baseType.GetGenericArguments() ) ) { matchingType = baseType; przerwanie; } } baseType = baseType.BaseType; } } return typ dopasowania; }


title: sizeof styl: sizeof(typ) czy sizeof zmienna?

text: Widziałem dwa style używania `sizeof` do operacji związanych z pamięcią (takich jak `memset` lub `malloc`): * `sizeof(type)` i * `sizeof variable` lub `sizeof(variable)` Który z nich wolisz, czy też użyjesz kombinacji dwóch stylów i kiedy użyjesz każdego z nich? Jakie są plusy i minusy każdego stylu i kiedy ich używasz? Jako przykład mogę zobaczyć następującą parę sytuacji, w których jeden styl pomaga, a drugi nie: Gdy otrzymasz niepoprawny wskaźnik pośredni: type *var; ... memset(zmienna, 0, rozmiar zmienna); /* ups */ Kiedy zmienia się typ: new_type var; /* zmieniono z old_type na new_type */ ... memset(&var, 0, sizeof(old_type)); /* ups */


title: Śledzenie wszystkich obiektów klasy

text: Jestem nowy w programowaniu obiektowym i ciągle napotykam ten problem. (programuję w Javie) Trochę niechętnie o to pytałem, bo wydaje się, że jest to taka podstawowa kwestia, ale nie mogę znaleźć tutaj żadnych informacji na ten temat, ani pytań na ten temat, a żadne z podręczniki, które czytałem (oczywiście na dość podstawowym poziomie) poruszały tę kwestię: często muszę śledzić wszystkie utworzone obiekty klasy, aby iterować po nich w różnych celach. W ten sposób, w jaki obecnie piszę programy, wiele obiektów jest przywoływanych tylko z innych obiektów, co oznacza, że nie mam tablicy ani kolekcji, za pomocą której mógłbym się do nich odwoływać. Wyobrażam sobie, że skoro wydaje się to tak bardzo podstawową koniecznością w OOP, powinien istnieć dość zinstytucjonalizowany i prosty sposób, aby to zrobić? Czy zwykłą praktyką jest utrzymywanie oddzielnej listy wszystkich obiektów klasy? Pomyślałem o statycznej tablicy lub kolekcji, do której poprzez jej konstruktor dodawany byłby każdy nowo utworzony obiekt. To jednak nie działałoby z podklasami, ponieważ konstruktory nie są dziedziczone? Zdaję sobie sprawę, że to pytanie może nie mieć jednej łatwej odpowiedzi; Mam tylko nadzieję, że ktoś może mnie trochę oświecić w tym temacie. Czuję, że brakuje mi tutaj centralnej części wiedzy.


title: IXRepozytorium i problemy testowe

text: Ostatnio miałem wątpliwości, jak i gdzie testować metody repozytorium. Niech następująca sytuacja: Mam interfejs `IRepository` w ten sposób: interfejs publiczny IRepository<T> gdzie T: class, IEntity { IQueryable<T> Query(Expression<Func<T, bool>> wyrażenie); // ... Pominięte } I ogólna implementacja klasy publicznej `IRepository` Repository<T> : IRepository<T> gdzie T : class, IEntity { public IQueryable<T> Query(Expression<Func<T, bool>> wyrażenie ) { return All().Where(expression).AsQueryable(); } } Jest to baza implementacyjna, z której może korzystać dowolne repozytorium. Zawiera podstawową implementację **mój ORM**. Niektóre repozytoria mają określone filtry, w takim przypadku użyjemy `IEmployeeRepository` z określonym filtrem: interfejs publiczny IEmployeeRepository : IRepository<Employee> { IQueryable<Employee> GetInactiveEmployees(); } Oraz implementacja `IEmployeeRepository`: public class EmployeeRepository : Repository<Employee>, IEmployeeRepository // DO ZROBIENIA: W tym momencie mam zależność z ORM w Repository<Employee>. Jak rozwiązać? Jak przetestować metodę GetInactiveEmployees { public IQueryable<Pracownik> GetInactiveEmployees() { return Query(p => p.Status != StatusEmployeeEnum.Active || p.StartDate < DateTime.Now); } } ## Pytania 1. Czy można dziedziczyć `Repozytorium<Pracownik>`? Celem jest ponowne użycie kodu po wykonaniu wszystkich implementacji `IRepository`. Jeśli `EmployeeRepository` dziedziczy tylko `IEmployeeRepository`, muszę dosłownie skopiować i wkleić kod `Repository<T>`. 2. W naszym przykładzie w `EmployeeRepository : Repository<Employee>` nasze `Repozytorium` leży w naszej warstwie ORM. Mamy tutaj zależność z naszym ORM niemożliwą do wykonania jakiegoś **testu jednostkowego**. 3. Jak utworzyć **test jednostkowy**, aby upewnić się, że filtr `GetInactiveEmployees` zwraca wszystkich pracowników, w których Status != Active i StartDate < DateTime.Now. Nie mogę utworzyć fałszywego/makiety `IEmployeeRepository`, ponieważ będę testować? Musisz przetestować rzeczywistą implementację „GetInactiveEmployees”. Pełny kod można znaleźć na Github


title: Cykl Żądanie/Odpowiedź

text: Gdy Użytkownik A zdecyduje, że chce odwiedzić witrynę http://example.com/, wszystko zaczyna się od Żądania. Chwilę później otrzymuje odpowiedź. W tym cyklu dużo się dzieje, w różnych frameworkach jest on oddzielony na różne komponenty, w tym Routing, Dispatching itp. Chcę stworzyć prosty eksperymentalny framework MVP do mojej nauki, próbując wykorzystać jak najwięcej najlepszych praktyk , do cholery, kto wie, że może nawet warto użyć, kiedy skończę. Nie jestem pewien, jak powinienem rozdzielić ten cykl na te różne komponenty i nie jestem nawet pewien, za co odpowiada każdy komponent (Thinking SOLID, DRY, SRP itp.). O to właśnie pytam, patrząc na różne frameworki, te komponenty od czasu do czasu wydają się mieć różne obszary zastosowania. Za co odpowiada każdy z tych składników iw jakiej kolejności są używane? Żądanie, odpowiedź, dyspozytor, router, kontroler frontowy, bootstrap, zdarzenia.


title: Trudności z TDD i refaktoringiem (lub – dlaczego jest to bardziej bolesne niż powinno być?)

text: Chciałem nauczyć się korzystać z podejścia TDD i miałem projekt, nad którym chciałem pracować od dłuższego czasu. Nie był to duży projekt, więc pomyślałem, że byłby dobrym kandydatem do TDD. Jednak czuję, że coś poszło nie tak. Podam przykład: na wysokim poziomie mój projekt jest dodatkiem do programu Microsoft OneNote, który pozwoli mi łatwiej śledzić i zarządzać projektami. Teraz chciałem również zachować logikę biznesową jak najbardziej oddzieloną od OneNote na wypadek, gdybym zdecydował się zbudować własną niestandardową pamięć masową i zaplecze. Najpierw zacząłem od podstawowego testu akceptacji prostych słów, aby określić, co chciałem zrobić z moją pierwszą funkcją. Wygląda to mniej więcej tak (usuwając to dla zwięzłości): 1. Użytkownik klika, aby utworzyć projekt 2. Typy użytkownika w tytule projektu 3. Sprawdź, czy projekt jest tworzony poprawnie Pomijam rzeczy związane z interfejsem użytkownika i pewne pośrednie planowanie. Dochodzę do mojego pierwszego test jednostkowy: [TestMethod] public void CreateProject_BasicParameters_ProjectIsValid() { var testController = new Controller(); Projekt nowyProjekt = testController(A.Dummy<String>()); Assert.IsNotNull(nowyProjekt); }      Na razie w porządku. Czerwony, zielony, refaktoryzacja itp. W porządku, teraz potrzebuje zapisywania rzeczy. Wycinając tutaj kilka kroków, kończę z tym. [TestMethod] public void CreateProject_BasicParameters_ProjectMatchesExpected() { var fakeDataStore = A.Fake<IDataStore>(); var testController = new Controller(fakeDataStore); String oczekiwanyTitle = device.Create<String>("Tytuł"); Projekt nowyProjekt = testController(oczekiwany tytuł); Assert.AreEqual(oczekiwany tytuł, nowy projekt.Tytuł); } Nadal czuję się dobrze w tym momencie. Nie mam jeszcze konkretnego magazynu danych, ale stworzyłem interfejs tak, jak się spodziewałem. Pominę tutaj kilka kroków, ponieważ ten post robi się wystarczająco długi, ale postępowałem zgodnie z podobnymi procesami i w końcu dotarłem do tego testu dla mojego magazynu danych: [TestMethod] public void SaveNewProject_BasicParameters_RequestsNewPage() { /* snip init code * / testDataStore.SaveNewProject(A.Dummy<IPprojekt>()); A.CallTo(() => oneNoteInterop.SavePage()).MustHaveHappened(); } To było dobre, dopóki nie próbowałem go zaimplementować: public String SaveNewProject(Project project) { Page projectPage = oneNoteInterop.CreatePage(...); } I JEST problem właśnie tam, gdzie jest "...". Teraz zdaję sobie sprawę, że w TYM punkcie funkcja CreatePage wymaga identyfikatora sekcji. Nie zdawałem sobie z tego sprawy, kiedy myślałem na poziomie kontrolera, ponieważ interesowałem się tylko testowaniem bitów istotnych dla kontrolera. Jednak przez całą drogę tutaj zdaję sobie sprawę, że muszę poprosić użytkownika o lokalizację do przechowywania projektu. Teraz muszę dodać identyfikator lokalizacji do magazynu danych, następnie dodać jeden do projektu, następnie dodać jeden do kontrolera i dodać go do WSZYSTKICH testów, które są już napisane dla wszystkich tych rzeczy. Bardzo szybko stało się to nużące i nie mogę się powstrzymać, ale czuję, że złapałbym to szybciej, gdybym naszkicował projekt z wyprzedzeniem, zamiast pozwolić, aby został zaprojektowany podczas procesu TDD. Czy ktoś może mi wyjaśnić, czy zrobiłem coś złego w tym procesie? Czy mimo to można uniknąć tego rodzaju refaktoryzacji? Czy to jest powszechne? Jeśli jest powszechna, czy istnieją sposoby na uczynienie go bardziej bezbolesnym? Dziękuje wszystkim!


title: Wiele argumentów w wywołaniu funkcji a pojedyncza tablica

text: Mam funkcję, która przyjmuje zestaw parametrów, a następnie stosuje je jako warunki zapytania SQL. Jednak podczas gdy ja preferowałem jednoargumentową tablicę zawierającą same warunki: function searchQuery($params = array()) { foreach($params as $param => $value) { switch ($param) { case 'name': $ zapytanie->where('nazwa', $wartość); przerwanie; case 'telefon': $query->join('telefon'); $zapytanie->where('telefon', $wartość); przerwanie; } } } Mój kolega wolał wymienić wszystkie argumenty jawnie: function searchQuery($name = '', $phone = '') { if ($name) { $query->where('name', $value); } if ($telefon) { $zapytanie->join('telefon'); $zapytanie->where('telefon', $wartość); } } Jego argumentem było to, że poprzez jawne wymienienie argumentów, zachowanie funkcji staje się bardziej widoczne - w przeciwieństwie do konieczności zagłębiania się w kod, aby dowiedzieć się, czym był tajemniczy argument `$param`. Mój problem polegał na tym, że staje się to bardzo gadatliwe, gdy mam do czynienia z wieloma argumentami, takimi jak 10+. Czy jest jakaś preferowana praktyka? Moim najgorszym scenariuszem byłoby zobaczenie czegoś takiego: `searchQuery('', '', '', '', '', '', '', '', '', '', '', '' ', 'zapytanie_wyszukiwania')`


title: Czy warto przejść z formularzy webowych ASP na ASP MVC?

text: Mam roczne doświadczenie z formularzami webowymi ASP.net, a teraz zdecydowałem się przenieść do innej firmy, w której architekturą jest ASP MVC. Zdecydowałem, ponieważ zawsze czułem, że nie jest to prawdziwy sposób na tworzenie aplikacji w sieci (architektura pojedynczego formularza i stan widoku). Ale wiem, że mogę wykonać wszystko na MVC na formularzach internetowych z kontrolowaną architekturą? Czy przeniosę się do ASP MVC, czy da się zyskać na rynku pracy?


title: Jak opłacalne jest przełączanie stosów w celu skonfigurowania startu?

text: Obecnie jestem zatrudniony w firmie od 2,5 roku i przez cały czas pracowałem ze stosem .net głównie na frameworku MVC. _Wierzę_, że mam kilka fajnych pomysłów na start, ale nie jestem pewien, czy powinienem kontynuować na tym stosie, czy przełączyć się na inny stos, taki jak Ruby on Rails. Powodem, dla którego uważam ten przełącznik, jest infrastruktura wymagana do hostowania aplikacji dot net i jej pomyślne skalowanie w porównaniu z konfiguracją działającej witryny na innym stosie. W tej chwili mam naprawdę dobrą wiedzę na temat domeny w dot net, ale uważam, że przejście na nowy stos i przyjęcie najlepszych praktyk, które nauczyłem się w ciągu ostatnich dwóch lat, nie powinno być takie trudne. Daj mi znać, czy coś mi brakuje w układance i czy podejmuję właściwą decyzję? Czy są jakieś komplikacje związane z nauką nowego stosu i budowaniem na nim? Proszę, poprowadź mnie we właściwym kierunku.


title: Używanie walidacji try-finally (bez catch) vs walidacja stanu wyliczenia

text: Czytałem porady dotyczące tego pytania, jak postępować z wyjątkami jak najbliżej miejsca, w którym został on zgłoszony. Mój dylemat dotyczący najlepszej praktyki polega na tym, czy należy użyć try/catch/finally, aby zwrócić enum _(lub int, który reprezentuje wartość, 0 dla błędu, 1 dla ok, 2 dla ostrzeżenia itp., w zależności od przypadku)_ aby odpowiedź była zawsze w porządku, czy też należy przepuścić wyjątek, aby strona wywołująca się nim zajęła? Z tego, co wiem, może się to różnić w zależności od przypadku, więc oryginalna rada wydaje się dziwna. Na przykład w serwisie internetowym zawsze chciałbyś zwrócić stan, więc każdy wyjątek musi być rozwiązywany na miejscu, ale powiedzmy, że wewnątrz funkcji, która wysyła/pobiera dane przez http, chciałbyś, aby wyjątek (na przykład w przypadku 404), aby przejść do tego, który go wystrzelił. Jeśli tego nie zrobisz, będziesz musiał stworzyć jakiś sposób informowania części wywołującej o jakości wyniku (błąd:404), a także o samym wyniku. Chociaż można spróbować złapać wyjątek 404 wewnątrz funkcji pomocniczej, która pobiera/publikuje dane, czy powinieneś? Czy tylko ja używam smallint do oznaczania stanów w programie (i oczywiście dokumentują je odpowiednio), a następnie używam tych informacji do celów sprawdzania poprawności (wszystko w porządku/obsługa błędów) na zewnątrz? **Aktualizacja:** Spodziewałem się wyjątku fatalnego/niekrytycznego dla głównej klasyfikacji, ale nie chciałem tego włączać, aby nie zaszkodzić odpowiedziom. Pozwólcie, że wyjaśnię, o co chodzi w pytaniu: obsługa zgłaszanych wyjątków, a nie zgłaszanie wyjątków. Jaki jest pożądany efekt: Wykryj błąd i spróbuj go naprawić. Jeśli odzyskanie nie jest możliwe, przekaż najbardziej znaczącą informację zwrotną. Ponownie, w przykładzie http get/post, pytanie brzmi, czy należy podać nowy obiekt, który opisuje, co stało się z pierwotnym wywołującym? Gdyby ten helper znajdował się w bibliotece, z której korzystasz, czy spodziewałbyś się, że dostarczy ci kod stanu dla operacji, czy też umieścisz go w bloku try-catch? Jeśli _projektujesz_ to, czy dostarczyłbyś kod statusu, czy rzuciłbyś wyjątek i pozwolił wyższemu poziomowi przetłumaczyć go na kod/komunikat statusu? Streszczenie: **Jak wybrać, czy fragment kodu zamiast tworzyć wyjątek, zwraca kod stanu wraz z wynikami, które może dać?**


title: Synchronizacja czatu na urządzeniu z systemem Android z aplikacją internetową

text: Próbuję zrobić aplikację czatu w Androidzie. Tylko jeden na jeden czat. Jednak chcę również, aby czat był synchronizowany z aplikacją internetową działającą w przeglądarce. Jestem zdezorientowany, jak się do tego zabrać. Dlatego chcę, aby moja aplikacja internetowa i aplikacja na Androida były zsynchronizowane. Mam na myśli dwie rzeczy. Po pierwsze, użyj metoerjs dla frontendu i php dla backendu połączonego z mongodb. Jestem skłonny do metoerjs dla front-endu, ponieważ bezproblemowo synchronizuje się z obiektem mongodb i jest dobrą biblioteką js w czasie rzeczywistym. To wymagałoby ode mnie hostowania mojego skryptu php na serwerze Apache i frontonu działającego na węźle. Czy mogę wysyłać żądania http post do serwera meteor js (i dodawać rzeczy do mojej bazy danych) za pomocą mojego urządzenia z Androidem? Jeśli tak, to mogę zrezygnować z używania php i rozwijać zarówno stronę klienta, jak i serwer w javascript. Po drugie, użyj klienta xmpp, aby skonfigurować czat na Androidzie. Ale nie mam pojęcia, jak mam połączyć go z moim serwerem internetowym. Jestem kompletnym początkującym z skryptowaniem po stronie serwera w javascript, bazach danych noSQL i protokole xmpp. Więc byłbym naprawdę wdzięczny, gdyby ktoś wskazał mi właściwy kierunek.


title: Optymalizacja sortowania dużych ilości tekstu przechowywanego w bazie danych

text: Jak przechowywać informacje tekstowe - w relacyjnej bazie danych, a może przy użyciu NoSQL? Problem w tym, że tekst należy podzielić na różne części, z których każda spełnia jakieś wymagania, np. ten sam tekst powinien znajdować się w kilku „miejscach”. Czy jest inny sposób na zorganizowanie tego? Mam kilka książek (każda około 600 stron), które powinny być przechowywane w bazie danych, ale będzie mechanizm, który będzie sortował zawartość książek według pewnych kryteriów. Kryteria są złożone, więc zastanawiam się, czy nie staje się to dużym problemem. Czy pomogłoby przechowywanie tego samego tekstu w różnych „tabelach”, z których każda spełniałaby konkretny „warunek” Czy muszę zapisywać ten sam tekst w różnych „tabelach”, z których każda spełnia określony zestaw kryteriów?


title: Jak metodologie wytwarzania oprogramowania wpisują się w konsulting?

text: Pracuję dla dość małej firmy konsultingowej, liczącej około 100 pracowników, i pracuję z nimi od około roku. To moja pierwsza praca po college'u. Jako firma nie specjalizujemy się w żadnej konkretnej technologii, ale moja codzienność polega zwykle na programowaniu w .NET, czy to w ASP.NET, niestandardowych programach SharePoint itp. Nasze projekty polegają na ogół na dodawaniu funkcji do lub rozszerzenie istniejącej bazy kodu klienta. Rzadko będziemy budować aplikacje webowe od podstaw. Coś, co mnie niepokoi, to wyraźny brak jakiejkolwiek metodologii lub ram, które pomagają nam dostarczać klientom wysokiej jakości rozwiązania. Nie przeprowadzamy przeglądów kodu, testy, które wykonujemy, wydają się słabe, kierunek techniczny wydaje się słaby. Wydaje się, że niewiele wysiłku wkłada się w to, aby kod, który zespół zobowiązuje się do projektu, spełniał jakiekolwiek standardy rozszerzalności i łatwości utrzymania lub był zgodny z najlepszymi praktykami dla danego środowiska. Z mojego dotychczasowego doświadczenia wynika, że pozostawienie tej odpowiedzialności wyłącznie poszczególnym programistom daje pewne słabe wyniki, zwłaszcza gdy w grę wchodzą niedoświadczeni członkowie zespołu. Chciałbym wiedzieć, czy w świecie konsultingu jest to zwykły biznes. Jeśli pracujesz w firmie konsultingowej, chciałbym usłyszeć o wszelkich technikach, procesach lub podejściach, które są stosowane, aby upewnić się, że rozwiązanie, które tworzy Twój zespół, nie stanie się bałaganem, cały czas pod warunkiem, że pracujesz nad istniejąca baza kodu klienta, nad którą możesz nie mieć pełnej kontroli. Co mogę zrobić jako młodszy członek zespołu, aby promować kulturę tworzenia lepszego oprogramowania?


title: Filozofia stojąca za wzorem memento

text: Czytałam wzór memento z różnych źródeł internetu. Różne informacje z różnych źródeł wprawiły mnie w zakłopotanie, dlaczego ten wzór jest rzeczywiście potrzebny. Implementacja dofactory mówi, że podstawową intencją tego wzorca jest przywrócenie stanu systemu. Wiki mówi, że głównym celem jest **możliwość** przywrócenia zmian w systemie. Daje to inny efekt - mówiąc, że możliwe jest, aby system miał implementację memento bez konieczności przywracania. I ta zdolność przywracania jest cechą tego. OODesign mówi, że > Czasami konieczne jest uchwycenie wewnętrznego stanu obiektu w pewnym > punkcie i posiadanie możliwości przywrócenia obiektu do tego stanu w > późniejszym czasie. Taki przypadek jest przydatny w przypadku błędu lub awarii. Więc moje pytanie brzmi, dlaczego dokładnie używamy tego? Czy ma to ocalić poprzednie stany - czy też promować hermetyzację między Opiekunem a Pamiątką? Dlaczego ten rodzaj hermetyzacji jest tak ważny? Edycja: Dla odwiedzających, sprawdź tę implementację! **Edytuj** : Pracuję nad wdrożeniem memento rozwiązania mojego problemu. Zamieszczę kolejne pytanie na ten temat i połączę to pytanie z tym. Dziękujemy wszystkim za odpowiedzi z cennymi sugestiami! **Edytuj 3** : Oto link do mojej przykładowej implementacji


title: Nietransakcyjne testowanie baz danych i integracja

text: Jednym z problemów, na który natrafię podczas testów integracyjnych, jest posiadanie wielu testów uzyskujących dostęp do tej samej bazy danych. Chociaż nie stanowi to teraz problemu, wiem, że mamy tutaj wiele aplikacji, które uzyskują dostęp do tej samej bazy danych, i po prostu staram się wymyślić sposób, aby zapobiec temu problemowi, zanim do niego dojdzie. Pomysł, który widziałem dużo, to korzystanie z transakcji. Na starcie rozpoczynasz transakcję, a następnie w fazie demontażu wycofujesz transakcję. Oznacza to, że wiele testów uzyskuje dostęp do tych samych tabel bazy danych i nie wpływa na siebie nawzajem, co jest świetne. Problem polega na tym, że w moim przypadku 85-95% tabel, z którymi pracuję w MySQL to MyISAM, które nie obsługują transakcji. Czy istnieją sposoby na obejście aparatów pamięci masowej, które nie obsługują transakcji, ale nadal umożliwiają wielu testom dostęp do tych samych tabel bez wzajemnego oddziaływania? Z tego, co słyszałem, framework testujący ruby on rails wykorzystuje transakcje w ten sposób, w jaki sposób obchodzą ten problem (lub robią)?


title: Jak Ruby, Python, PHP radzą sobie bez Springa?

text: W pracy piszę aplikacje Java i usługi webowe dla przedsiębiorstw (Spring, Hibernate, Maven, RESTEasy) oraz PHP (CakePHP) i Python (Django) dla moich projektów pobocznych. Chociaż widzę wartość, jaką przynosi odwrócenie kontroli, programowanie zorientowane na aspekty itp., które przynosi Spring, nie jestem pewien, jak ogromne aplikacje internetowe, które nie są na stosie Java, radzą sobie bez frameworka takiego jak Spring. Czy więc programiści muszą po prostu „tolerować” ściśle powiązane komponenty i inne problemy, które Spring eliminuje, czy też czegoś mi brakuje? Dla tych, którzy nie znają Springa, najczęściej używamy następujących funkcji: * Kontener Inversion of Control: konfiguracja komponentów aplikacji i zarządzanie cyklem życia obiektów Java, * Programowanie aspektowe: umożliwia implementację procedur przekrojowych, * Zarządzanie transakcjami: ujednolica kilka interfejsów API do zarządzania transakcjami i koordynuje transakcje dla obiektów Java.


title: Dlaczego powinniśmy (nie) programować na serwerze przez RDP

text: Mam klienta, który prosi, abyśmy stworzyli ich dość małą aplikację internetową bezpośrednio w ich środowisku przez RDP na serwer, który będzie hostował aplikację. Od jakiegoś czasu zlecali to kontrahentowi i działało to dla nich „w porządku”, więc czują się komfortowo z takim podejściem. Największym zmartwieniem klienta w tym momencie jest cięcie kosztów – mają bardzo napięty budżet. Wydaje się, że mój menedżer nie przejmuje się tym ani nie myśli, że to robi różnicę. Zdecydowanie jednak nie zgadzam się z tą praktyką. Jak najlepiej przekonać klienta, że robienie rzeczy w ten sposób jest złą praktyką? Muszę używać języka „zarządzania”, a nie języka programisty. Przychodzi mi do głowy kilka zalet rozwoju lokalnego (jako programista): 1. Nie możemy zagwarantować jakości kodu w środowisku zdalnym (dlaczego?) 2. Współpraca w zespole zwiększa wydajność (jak?) 3. Wewnętrznie możemy lepiej wykorzystywać kontrolę źródeł (choć można ją również zainstalować na serwerze) 4. Wewnętrznie możemy lepiej śledzić procesy kontroli jakości 5. Dzięki RDP tylko jeden programista może pracować nad projektem w danym momencie 6. Programowanie lokalne zwiększa wydajność (jak? może dlatego, że jest to ich strefa komfortu? może z wieloma monitorami? jak to jest korzystne dla klienta?) Niestety, niekoniecznie przekłada się to na coś, co docenia kierownictwo (np. dolary i centy). Proszę o pomoc.


title: Dlaczego nie ma tagu HTML „pole”?

text:
Istnieje znacznik `<fieldset>` dla zestawu pól. Dlaczego nie ma hierarchicznego dziecka dla zestawów pól? <form> <fieldset> <legend>Opcje cienkiej kanapki</legend> <field> Mięso
  <input type="radio" name="mięso" value="turkey" />Turcja  <input type="radio" name="mięso" value="monkey" />małpa

Wybierz jedno mięso na cienką kanapkę.
 </field> <field> Ser
  <input type="checkbox" name="ser " value="chedder" />Cheddar  <input type="checkbox" name="ser" value="swiss" />szwajcarski

Wybierz jedno mięso na cienką kanapkę.
 </field> </fieldset> <fieldset> <legend>Opcje napojów</legend> <field> Gazowane
  <input type="radio" name="gazowane " value="koks" />koks  <input type="radio" name="gazowany" value="mtn-rosa" />rosa

Wybierz jeden napój na zestaw.
 </field> <field> Niegazowane
  <input type="radio" name="niegazowane" value="herbata-słodka" />herbata (bez słodkości) <etykieta> <input type="radio" name="niegazowana" value=" herbata" />Herbata
 </field> </fieldset> </form> h ttp://jsfiddle.net/5dC8c/ Wracam do tego pytania za każdym razem, gdy pracuję nad układami formularzy HTML. Zgodnie z definicją MDN: > Element HTML `<fieldset>` jest używany do grupowania kilku kontrolek oraz > etykiet () w formularzu sieciowym. Widzę element `<field>` jako grupujący pojedynczą kontrolkę (lub zestaw przycisków radiowych) z pojedynczą etykietą i opisem. Znacznik pola miałby niektóre z tych samych atrybutów, co znacznik wejściowy, tylko do odczytu, wymagany itd. Dlaczego bootstrap używa klasy „form-group”? Dlaczego Wufoo używa znaczników li dla każdego pola? Zamknięcie powiązanych elementów formularza w polach zwiększyłoby przejrzystość. Każdy główny framework front-endowy ma jakąś klasę lub tag, aby odróżnić każde pole. Dlaczego do cholery nie mamy jednego tagu HTML, który wprowadzi trochę normalności do projektowania formularzy? **Update:** dodał lepszy przykład HTML użycia znacznika `<field>`.


title: Jak wskazać wiarygodność podczas raportowania dostępności kompetencji?

text: Mamy pracowników o kompetencjach: Pete Welder Carpenter Melissa Carpenter Załóżmy, że oboje pracują 40 godzin tygodniowo i nie mają jeszcze przydzielonej pracy. Musimy zgłosić dostępność tych kompetencji, wyrażoną w godzinach. O ile teraz widzę, możemy to zgłosić na dwa sposoby: Metoda A. Gdy ktoś ma wiele kompetencji, policz je obie. Spawacz 40 godzin Stolarz 80 godzin Metoda B. Gdy ktoś ma wiele kompetencji, policz równy podział godzin dla każdego Spawacza 20 godzin Cieśla 60 godzin Metoda A ma nasze preferencje: \- Dobry planista będzie wiedział, aby najpierw zaplanować najmniej dostępne kompetencje. Jeśli zaplanowane jest 30 godzin spawania, zostanie nam 10 _spawacz_ , 50 _cieśla_. \- Metoda B ma tę wadę, że planista myśli, że nie może zaplanować pracy, gdy wymagane jest 30 godzin spawania. Jeśli jednak to zgłosimy **chcielibyśmy oszacować wiarygodność liczb dla każdej kompetencji** , tj. w jakim stopniu są one zawyżone? W moim przykładzie A, czy powiedziałbym, że _stolarz_ jest o 100% zawyżony, czy o 50%, a może o inną liczbę? Jak obliczyć to dla dużej liczby kompetencji? Jestem pewien, że to nie my pierwsi się tym zajmujemy, czy istnieje „zwykły” sposób na zrobienie tego w planowaniu? Dodatkowo: \- Czy istniałaby jeszcze lepsza metoda niż A lub B? \- Opcjonalnie mamy też _kolejność preferencji_ kompetencji (np. użyj go/ją w tej kolejności), Pete może być 1. _spawaczem_ 2\. _Cieśla_. Czy to wprowadza nowe opcje?


title: Czy „praktyczne” rozdziały na końcu księgi PCL Siebela mają zostać pominięte podczas pierwszego przejścia?

text: Właśnie ukończyłem pierwsze przejście przez Practical Common Lisp Petera Siebela. Jestem dość wygodny z C#, Ruby, Java; Rozdziały, które uczą Lispu i wczesne „praktyczne” rozdziały, były dla mojego mózgu łatwe. Jednak pod koniec książki praktyczne rozdziały (o serializacji binarnej, parsowaniu id3, programowaniu sieciowym i DSL generującym HTML) wydawały się być po prostu poza zasięgiem - rozpoznałem prymitywy i używane metody; ale sposób połączenia wprawił mnie w osłupienie. np. Biorąc pod uwagę specyfikacje, nie mogłem usiąść i samodzielnie napisać tego kodu. Pominąłem niektóre z nich i przejrzałem resztę. Czy są inni, którzy czuli, że brakuje poziomu między pierwszymi 22 rozdziałami a praktykami? Czy to tylko ja? Czy powinienem ponownie przeczytać podstawy? A może jest jakaś inna książka, która pomoże mi przekroczyć przepaść?


title: Wybierasz język programowania pozwalający na takie sympatie klienta?

text: Chciałbym mieć profesjonalną opinię na temat języka programowania używanego w projekcie w firmie. Wyjaśnijmy... W mojej firmie pierwszym argumentem przemawiającym za wyborem Javy jako języka głównego jest jej nazwa i popularność z perspektywy klienta. Wygląda na to, że jeśli proponujesz programowanie klienta w Python/Ruby/..., jest on mniej przekonany. Chciałabym wiedzieć, czy doświadczasz takiej sytuacji i co o niej myślisz?


title: Co sprawia, że jeden język jest lepszy od drugiego, skoro oba są przeznaczone do tych samych celów?

text: Jestem w trakcie tworzenia gramatyki dla języka skryptowego, ale kiedy nad tym pracuję, zacząłem się zastanawiać, co sprawia, że język jest dobry. Znam cele mojego scenariusza, ale zawsze jest 1000 różnych sposobów robienia rzeczy. Cele: * Łatwy w użyciu i zrozumiały (nie moja babcia może to zrobić łatwo, ale sekretarka w recepcji lub wiceprezes ds. marketingu może to zrobić w sposób łatwy) * Brak zdefiniowanych przez użytkownika funkcji lub podprogramów. * Jego zastosowanie byłoby w zdarzeniach obiektów w systemie podobnym do HyperCard. Koncepcyjnie myślałem o języku takim: ustaw myVariable na „Hello World” ustaw licznik na 0 powtórz 5 razy z x start ustaw licznik na licznik dodaj x koniec ustaw myVariable na myVariable plus ' ' plus licznik wyskakujący myVariable ustaw tekst etykiety o nazwie 'label' na 'nowy tekst' ustaw kolor etykiety o nazwie 'label' na niebieski. Efektem końcowym będzie wyskakujące okno dialogowe z zawartością 'Hello World 15', zmieni się również tekst etykiety i uczyni ją niebieską. Ale mógłbym zrobić to samo na 1000 różnych sposobów. Więc co sprawia, że jeden język jest lepszy od drugiego, skoro oba są przeznaczone do tych samych celów?


title: Złożoność całego rozwiązania ... a złożoność rozwoju

text: Generalnie jestem programistą PHP, który zajmuje się kilkoma różnymi frameworkami MVC. Kusi mnie (jak większość) wyrwanie się z mojego wygodnego środowiska LAMP w pogoni za „ładniejszym” i „prostszym” językiem, dołączonym do coraz bardziej popularnych frameworków. Zgadzam się z większością argumentów za przejściem na (the) ruby framework lub framework python i zamieniłbym PHP na Pythona w akronimie LAMP każdego dnia tygodnia. Ale jak odkryłem, próbując zacząć z nimi, nie jest to takie proste ... W moich próbach zrozumienia spaghetti zależności, wersji i procedur instalacyjnych, odkryłem, że podczas ostatecznego czasu rozwoju / prostoty jest korzyścią, moim zdaniem jest prawie przyćmiona przez złożoność wdrożenia... Zwłaszcza używanie do wdrażania kopiowania/wklejania w coraz liczniejszych usługach hostingu lamp. Mówię konkretnie o * Ruby on Rails * Django (python) Czy twoje początkowe doświadczenia były podobne do tych, które działają na tych platformach? jeśli tak, jak to przezwyciężyłeś?


title: jak powiedzieć użytkownikom, żeby czekali, bo strona się ładuje

text: Na mojej stronie muszę wygenerować pliki excel i pdf, ale użytkownik musi poczekać, aż plik zostanie wygenerowany. scenariusz jest taki: użytkownik klika link i czeka, aż pliki zostaną wygenerowane i wyświetlone jako linki na stronie z raportami. jak mogę „powiedzieć” użytkownikowi, żeby czekał?


title: Jak udokumentować/weryfikować spójne warstwowanie?

text: Niedawno przeszedłem na ciemną stronę: jestem teraz KLIENTEM zajmującym się tworzeniem oprogramowania - głównie stron internetowych. Wraz z tą nową rolą pojawiają się nowe obawy. Jako programista wiem, jak solidna staje się aplikacja, gdy jest odpowiednio ułożona i chcę tę wiedzę wykorzystać w mojej nowej pracy. Nie chcę logiki biznesowej w mojej warstwie prezentacji, a już na pewno nie rzeczy prezentacji w warstwie danych. Dlatego chcę móc wymagać od mojego dostawcy, aby udokumentował poziom warstw oraz to, jak schludne i spójne jest nakładanie warstw. Najważniejsze pytanie brzmi: w jaki sposób udokumentowany jest poziom warstwowania dla mnie jako klienta i czy jest to rozsądne żądanie, abym je posiadał, więc nie muszę zaglądać do kodu (nie powinienem już tego robić )?


title: RESTful sposób weryfikacji stanu serwera

text: Jestem zainteresowany wbudowaniem weryfikacji w usługę REST, aby pomóc w monitorowaniu usług. Na przykład można uruchomić asercje, takie jak `http://example.com/posts/verify?min-posts=5&since=1-hour-ago`, które odpowiedziałyby błędem, chyba że w ciągu ostatniej godziny utworzono 5 nowych postów . Czy istnieją już takie usługi lub sprawdzone metody? Szczególnie interesuje mnie zalecany kod błędu dla nieudanych weryfikacji, ponieważ tak naprawdę nie widzę niczego odpowiedniego w serii 4xx. Błędy takie jak „Wymagany warunek wstępny” i „Wewnętrzny błąd serwera” dotyczą bardziej rzeczywistego żądania lub jego przetwarzania niż jego znaczenia.


title: Czy klasy domeny POCO powinny zawierać kolekcje?

text: Tytuł pytania nie jest dobry, ale nie mogłem wymyślić sposobu na lepsze sformułowanie. Jestem przyzwyczajony do programowania przy użyciu klas POCO w swoich projektach, czyli obiekty domeny nie zawierają absolutnie żadnej logiki, tylko dane. Zastanawiam się, co jest najlepszym podejściem w przypadku relacji klasowych - umieścić kolekcję wewnątrz klasy lub poprosić o nią później. Załóżmy na przykład, że mamy aplikację e-commerce, która zawiera zamówienia i pozycje w tych zamówieniach. Moglibyśmy więc mieć (pseudo-kod) class Order { int id; Lista<OrderItem> elementów; } class OrderItem { Produkt produkt; ilość int; } A następnie użyj go (1) var o = LoadOrder(id); foreach (var i in o.Items) { ...lub możemy zrobić: class Order { int id; } I użyj go w ten sposób: (2) var odr = LoadOrder(id); var szt = LoadItemsOfOrder(odr); foreach (var i in itms) { ..... Pierwszy sposób jest bardziej zwarty i bardziej "OOP-owski", ale drugi sposób daje większą kontrolę nad tym, jak i kiedy elementy są żądane, np. co jeśli teraz muszę zamówić tylko te przedmioty, które mają ilość > 3 ? A co jeśli w ogóle nie będę korzystał z kolekcji Items (np. żeby wyświetlić tylko listę zamówień) - będę robił niepotrzebne zapytania do bazy. W moich starszych, dużych projektach korzystałem z podejścia hybrydowego - klasy domen są pierwszego smaku, ale istnieją różne metody "load", takie jak "LoadOrder" i "LoadOrderWithItems" lub "FillOrderObject". Teraz pracuję nad małym, zabawkowym projektem, bez klientów i szalonych terminów i mam czas na przemyślenie tych kwestii. Próbowałem przeszukiwać sieć, ale bardzo trudno jest znaleźć odpowiedź POCO niezwiązaną z Entity Framework. (Tym razem nie pracuję w .net, ale chciałbym zastosować te koncepcje.) **Pytanie** : czy istnieje metoda, która jest wyraźnie _lepsza_ od drugiej, czy obie są poprawne i "to zależy" od mojego projektu , jeśli dążę do wydajności lub przejrzystości kodu i łatwości konserwacji?.


title: Czuję się zagubiony wśród różnych technologii internetowych i szukam wskazówek

text: W ciągu ostatnich 3-5 miesięcy zastanawiałem się, jakiego języka programowania internetowego powinienem użyć. PHP? Rubin? C#? Pyton? Perla? I wiesz co? Za każdym razem zmieniam zdanie jak szalony! Dowiaduję się kilku rzeczy o każdym z nich, a potem przechodzę do następnego. Teraz jestem totalnie zagubiony, totalnie zagubieni faceci. :) To, czego chcę od Ciebie, to pomóc mi zdecydować, a nie decydować za mnie i dać mi kilka zaleceń. Byłoby więcej niż pomocne, gdybyś mógł opowiedzieć mi krótką historię o sobie, jak zacząłeś, gdzie jesteś teraz i jakich technologii programowania internetowego używasz.


title: Diagramy UML aplikacji wielowątkowych

text: W przypadku aplikacji jednowątkowych lubię używać diagramów klas, aby uzyskać przegląd architektury tej aplikacji. Ten typ diagramu nie był jednak zbyt pomocny przy próbie zrozumienia aplikacji wielowątkowych/współbieżnych, na przykład dlatego, że różne instancje klasy są „na żywo” w różnych wątkach (co oznacza, że dostęp do instancji jest zapisywany tylko z jednego wątek, na którym żyje). W konsekwencji asocjacje między klasami niekoniecznie oznaczają, że mogę wywoływać metody na tych obiektach, ale zamiast tego muszę wykonać to wywołanie w wątku obiektu docelowego. Większość literatury, którą odkopałem na ten temat, takiej jak _Projektowanie aplikacji współbieżnych, rozproszonych i czasu rzeczywistego z użyciem UML_ autorstwa Hassana Gomaa, zawierała kilka fajnych pomysłów, takich jak rysowanie granic wątków na diagramach obiektów, ale ogólnie wydawało się to trochę zbyt akademickie i rozwlekłe, być naprawdę użytecznym. Nie chcę używać tych diagramów jako wysokopoziomowego widoku domeny problemu, ale raczej jako szczegółowego opisu moich klas/obiektów, ich interakcji i ograniczeń wynikających z granic wątków, o których wspomniałem powyżej. Dlatego chciałbym wiedzieć: 1. Jakie rodzaje diagramów okazały się najbardziej pomocne w zrozumieniu aplikacji wielowątkowych? 2. Czy istnieją rozszerzenia do klasycznego UML uwzględniające specyfikę aplikacji wielowątkowych, np. poprzez adnotacje ilustrujące, że * niektóre obiekty mogą żyć w określonym wątku, podczas gdy inne nie mają powinowactwa do wątku; * niektóre pola obiektu mogą być odczytywane z dowolnego wątku, ale zapisywane tylko z jednego; * niektóre metody są synchroniczne i zwracają wynik, podczas gdy inne są asynchroniczne, które ustawiają żądania w kolejce i zwracają wyniki, na przykład poprzez wywołanie zwrotne w innym wątku.


title: Co Stallman miał na myśli w tym cytacie na temat implementacji innych języków w Lispie?

text: Właśnie przeczytałem następujący cytat Stallmana jako część przemówienia, które wygłosił wiele lat temu. Mówi o tym, jak możliwe jest zaimplementowanie innych języków programowania w Lispie, ale niewykonalne jest zaimplementowanie Lispa w tych innych językach programowania. Wydaje się brać za pewnik, że słuchacze/czytelnicy rozumieją dlaczego. Ale nie rozumiem dlaczego. Myślę, że odpowiedź wyjaśni mi coś o Lispie i chciałbym to zrozumieć. Czy ktoś może to wyjaśnić? Oto cytat: > „Istnieje interesująca korzyść, jaką można uzyskać z używania tak potężnego > języka, jak wersja Lisp jako podstawowego języka rozszerzalności. Możesz > zaimplementować inne języki, tłumacząc je na swój język >. jest TCL, nie da się łatwo zaimplementować > Lispu, tłumacząc go na TCL. Ale jeśli Twoim podstawowym językiem jest Lisp, > nie jest trudno zaimplementować inne rzeczy, tłumacząc je.” Pełne przemówienie znajduje się tutaj: http://www.gnu.org/gnu/rms-lisp.html Dzięki.


title: SQL IN() kontra OR

text: Pracowałem z zapytaniem, które napisałem dzisiaj, musiałem zmienić kod z klauzuli `WHERE`, aby użyć filtru IN(lista rzeczy) zamiast używać czegoś takiego jak item_desc = 'item 1' OR item_desc = 'item 2' LUB item_desc = 'pozycja 3' LUB item_desc = 'pozycja 4' Powyższe działało przez 15 minut i nic nie zwróciło, ale następujące dało mój wynik ustawiony w 1,5 minuty item_desc IN ( 'pozycja 1' ,'pozycja 2' ,'pozycja 3' ,'pozycja 4' ) Zrobiłem to w SQL i zastanawiam się, dlaczego IN (lista elementów) działała o wiele szybciej niż instrukcja OR. \-- EDIT -- SQL Server 2008, przepraszam, że nie wstawiłem tych informacji w pierwszej kolejności. **Oto zapytanie w całości z użyciem instrukcji `OR`:** DECLARE @SD DATETIME DECLARE @ED DATETIME SET @SD = '2013-06-01'; USTAW @ED = '2013-06-15'; -- WYBÓR KOLUMNY WYBIERZ PV.PtNo_Num AS 'VISIT ID' , PV.Med_Rec_No AS 'MRN' , PV.vst_start_dtime AS 'ADMIT' , PV.vst_end_dtime AS 'DISC' , PV.Days_Spt_typ AS ' 'TYP PT' , PV.hosp_svc AS 'HOSP SVC' , SO.ord_no AS 'NUMER ZAMÓWIENIA' --, SO.ent_dtime JAK 'CZAS WEJŚCIA ZAMÓWIENIA' --, DATEDIFF(GODZINA,PV.vst_start_dtime,SO.ent_dtime) AS 'ADM DO GODZIN WEJŚCIA' , SO.svc_desc JAK 'OPIS ZAMÓWIENIA' , OSM.ord_sts JAK 'STATUS ZAMÓWIENIA' , SOS.prcs_dtime JAK 'CZAS STATUSU ZAMÓWIENIA' , DATEDIFF(DAY,PV.vst_start_dtime,SOS.prcs_ADMtime) ABY ZAMÓWIĆ STS W DNIACH' -- DB(S) UŻYWANE Z smsdss.BMH_PLM_PtAcct_V PV DOŁĄCZ smsmir.sr_ord SO ON PV.PtNo_Num = SO.episode_no DOŁĄCZ smsmir.sr_ord_sts_hist_hist_snoOS ON SO. SOS.hist_sts = OSM.ord_sts_modf_cd -- FILTER(S) WHERE PV.Adm_Date BETWEEN @SD AND @ED AND SO.svc_cd = 'PCO_REMFOLEY' OR SO.svc_cd = 'PCO_INSRTFO LEY' OR SO.svc_cd = 'PCO_INSTFOLEY' OR SO.svc_cd = 'PCO_URIMETER' ORAZ SO.ord_no NIE W ( WYBIERZ SO.ord_no Z smsdss.BMH_PLM_PtAcct_V PV JOIN smsmir_NPV.sr_Pt sr_ord_sts_hist SOS NA SO.ord_no = SOS.ord_no DOŁĄCZ smsmir.ord_sts_modf_mstr OSM NA SOS.hist_sts = OSM.ord_sts_modf_cd GDZIE OSM.ord_sts = 'NIEKONTYNUUJ' ORAZ SOREM_S.svc'c'cd svc_cd = 'PCO_INSTFOLEY' LUB SO.svc_cd = 'PCO_URIMETER' ) ZAMÓWIENIE PRZEZ PV.PtNo_Num, SO.ord_no, SOS.prcs_dtime Dziękuję,


title: Otwórz zastrzeżoną bibliotekę bez pewnych funkcji

text: Mam nadzieję, że jestem w odpowiednim miejscu, by o to zapytać. Mam pytanie dotyczące praktyki open-sourcingu autorskiej biblioteki, którą zbudowaliśmy i wykorzystujemy w pracy. Licencja będzie prawdopodobnie MIT. Podoba mi się ten pomysł, ale oto niezwykła część: dostałem zadanie usunięcia niektórych z najbardziej zaawansowanych funkcji. Pozostaną one na naszych serwerach, dostępne jako usługa. Otworzymy bibliotekę (JavaScript w przypadku zainteresowania) wraz z minimalnym powiązanym kodem serwera. _Nie_ zadaję pytanie o problemy techniczne (wyobrażam sobie, że będziemy musieli utrzymywać i synchronizować jakoś różne repozytoria, może z niekompatybilnymi pull requestami, ale to pytanie jest na inny dzień). Chciałbym wiedzieć: * Jak będzie to postrzegane przez społeczność? Czy grozi to zabiciem ewentualnego zainteresowania tą biblioteką? * Osobiście nie znam żadnej biblioteki, która tak działa. Jestem jednak pewien, że jest to możliwe, ale wszelkie dowody istnienia takiej biblioteki są mile widziane (o ile to możliwe). To także dlatego, że chciałbym zobaczyć, jak to przedstawiają. * Co ważniejsze, jakie może być uzasadnienie/przeciwko temu? Nie jestem pewien, czy rozumiem konsekwencje takiego postępowania. **EDYTUJ** Po zapoznaniu się z odpowiedziami i komentarzami zebrałem tutaj kilka przykładów: * http://www.jfrog.com/home/v_artifactorypro_overview * http://www.easyrtc.com /pricing/ * http://rapidminer.com/the-core-of-rapidminer-is-open-source/ (zwróć uwagę na gniewne komentarze na ten temat - ale robimy odwrotnie, od zastrzeżonego do otwartego rdzenia) Jako programista używałbym produktu, który zamierzamy wydać w osobistych projektach, więc myślę, że jest to przydatne. Ale pracowałem nad tym i mam oczywistą stronniczość. Ponadto większość opinii, które widziałem, mówi w zasadzie „możesz spróbować, ale to nie zadziała”. Zobacz także http://blogs.gartner.com/brian_prentice/2010/03/31/open-core-the-emperors-new-clothes/ Jeśli ktoś jest w stanie znaleźć udany produkt robiący open-core, byłbym wdzięczny.


title: Jak obsłużyć zaktualizowaną konfigurację, która została już sklonowana do edycji

text: Naprawdę przepraszam za tytuł, który prawdopodobnie nie ma większego sensu. Mam nadzieję, że mogę się tu lepiej wytłumaczyć, ponieważ jest to coś, co mnie denerwowało od wieków, a teraz staje się pilnym problemem, gdy piszę trochę oprogramowania z konfiguracją. Większość oprogramowania jest dostarczana z domyślnymi opcjami konfiguracyjnymi przechowywanymi w samej aplikacji, a ponadto istnieje plik konfiguracyjny (powiedzmy), że użytkownik może edytować. Po utworzeniu/edycji po raz pierwszy, kolejne aktualizacje aplikacji nie mogą (z łatwością) modyfikować tego pliku konfiguracyjnego z obawy przed zablokowaniem własnych zmian użytkownika w konfiguracji domyślnej. Więc moje pytanie brzmi, jeśli moja aplikacja dodaje nowy konfigurowalny parametr, jaki jest najlepszy sposób na ułatwienie odkrycia ustawienia i umożliwienie użytkownikowi (programistom) zastąpienia go tak ładnie, jak to możliwe, biorąc pod uwagę następujące ograniczenia: * W rzeczywistości nie mam domyślna konfiguracja kanoniczna w aplikacji per se, jest to raczej sprawa przypominająca 'kaskadowy system plików' - szablon konfiguracji jest przechowywany w `default/config.json` i kiedy użytkownik chce edytować konfigurację, jest kopiowany do `user /config.json`. Jeśli zostanie znaleziona konfiguracja użytkownika, jest ona używana - nie ma automatycznego nadpisywania podzbioru kluczy, używany jest cały nowy plik i to wszystko. Jeśli nie ma konfiguracji użytkownika, używana jest konfiguracja domyślna. Kiedy użytkownik chce edytować konfigurację, uruchamia polecenie, aby ją dla niego 'wygenerować' (co po prostu kopiuje plik `config.json` z katalogu `default` do katalogu `user`). * Nie ma interfejsu użytkownika dla opcji konfiguracyjnych, ponieważ nie jest to odpowiednie dla bazy użytkowników (pomyśl o moim oprogramowaniu jako o bibliotece lub czymś takim, użytkownicy to programiści, konfiguracja odbywa się w pliku user/config.json). * Ze względu na to, że moje oprogramowanie jest podobne do biblioteki, nie ma prostego sposobu, aby po aktualizacji oprogramowania uruchomić niektóre zadania automatycznie (więc wszelkie pomysły dotyczące aktualnej konfiguracji, porównania z konfiguracją szablonu, dodania brakujących kluczy) nie są odpowiednie . Jedyne rozwiązanie, jakie przychodzi mi na myśl, to powiedzenie „w informacjach o wydaniu jest nowe ustawienie konfiguracji `X`”, ale nie wydaje mi się to idealne. Jeśli chcesz uzyskać więcej informacji, daj mi znać. Powyższe szczegóły nie są w rzeczywistości w 100% zgodne z moją sytuacją, ale równie dobrze przedstawiają problem przy mniejszej złożoności. Jeśli jednak chcesz konkretów, mogę wyjaśnić dokładną konfigurację. * * * Dalsze wyjaśnienie rodzaju konfiguracji mam na myśli: pomyśl o edytorze kodu Atom. Wygląda na to, że gdzieś jest domyślny plik konfiguracyjny 'template', ale jak tylko opcja konfiguracji zostanie zmieniona, generowany jest `~/.atom/config.cson` i ustawienia są tam umieszczane. Od teraz Atom jest aktualizowany i otrzymuje nowy klucz konfiguracyjny, ten plik nie może zostać nadpisany przez Atom bez dużego wysiłku, aby upewnić się, że dodanie/modyfikacja klucza nie zakłóci działania. W przypadku Atoma, ponieważ istnieje GUI do edycji ustawień, mogą uciec po prostu dodając interfejs użytkownika dla nowego ustawienia do interfejsu użytkownika, aby ułatwić „wykrywanie” nowego ustawienia. Nie mam tego luksusu. * * * Wyjaśnienie moich ograniczeń i tego, czego właściwie szukam: Oprogramowanie, które piszę, jest w rzeczywistości pakietem dla większego systemu. Ten większy system jest tym, co zapewnia konfigurację, a sposób, w jaki to działa, jest trochę naprawiony - po prostu wykonuję rodzaj wywołania `config('some.key')` i wie, aby sprawdzić, czy użytkownik ma klon konfiguracji i czy więc użyj go, w przeciwnym razie użyj domyślnej konfiguracji, która jest częścią mojego pakietu. Teraz, podczas gdy _mogłem_ sprawić, by moja aplikacja edytowała pliki konfiguracyjne użytkownika (istnieje konwencja dotycząca ich przechowywania), generalnie nie jest to zrobione, więc jeśli to możliwe, chciałbym żyć z ograniczeniami systemu, którego używam . I nie chodzi tylko o wykrywalność, jednym dużym problemem jest to, że dodanie klucza konfiguracyjnego nie zadziała, gdy tylko użytkownik będzie miał własną kopię oryginalnego szablonu. Dodanie klucza do szablonu nie zrobi różnicy, ponieważ ten plik nigdy nie jest odczytywany. W związku z tym myślę, że jest to w rzeczywistości dość duża wada w projektowaniu systemu kaskadowego konfiguracji i dlatego należy ją zająć się moimi upstreamami. Tak więc myśląc o tym, w oparciu o moje ograniczenia, nie sądzę, że będzie dobre rozwiązanie, za wyjątkiem edycji konfiguracji użytkownika lub używania nowego pliku konfiguracyjnego za każdym razem, gdy pojawią się aktualizacje domyślnej konfiguracji. Nawet pomysł z informacjami o wydaniu z powyższego jest niewykonalny, ponieważ jeśli użytkownik nie zastosuje się do porady, nagle mam klucz konfiguracyjny bez wartości (zdefiniowany przez użytkownika _lub_ domyślny). * * * Tak więc nowe pytanie brzmi: jaki jest ogólny sposób rozwiązania problemu posiadania domyślnej konfiguracji w plikach konfiguracyjnych szablonów i umożliwienia użytkownikowi tworzenia wersji dostosowanych do użytkownika w celu zastąpienia ustawień domyślnych? Kaskada na klawisz (a nie na plik), w której użytkownik określa tylko ich nadpisania? W takim przypadku, co się dzieje, gdy wartością konfiguracyjną jest tablica — czy zastępujemy, czy dołączamy do wartości domyślnej (lub bardziej realistycznie, jak użytkownik określa, czy chce zastąpić, czy dołączyć)? Wygląda na to, że konfiguracja jest dość trudna, więc jak to rozwiązać na wolności?


title: Wielowątkowość: czy robię to źle?

text: Pracuję nad aplikacją odtwarzającą muzykę. Podczas odtwarzania często rzeczy muszą się dziać w osobnych wątkach, ponieważ muszą się dziać jednocześnie. Na przykład nuty akordu muszą być słyszane razem, więc każdy z nich ma przypisany własny wątek, w którym ma być odtwarzany. i dlatego potrzebuję trzech oddzielnych wątków, aby w tym samym czasie były słyszane trzy nuty.) Ten rodzaj zachowania tworzy wiele wątków podczas odtwarzania utworu muzycznego. Rozważmy na przykład utwór muzyczny z krótką melodią i krótką progresją akordów. Całą melodię można zagrać na jednym wątku, ale progresja wymaga trzech wątków do zagrania, ponieważ każdy z jej akordów zawiera trzy nuty. Pseudokod do odtwarzania progresji wygląda więc tak: void playProgression(Progression prog){ for(Chord chord : prog) for(Note note : akord) runOnNewThread( func(){ note.play(); } ); } Tak więc zakładając, że progresja ma 4 akordy i gramy ją dwa razy, to otwieramy `3 nuty * 4 akordy * 2 razy` = 24 wątki. A to tylko do grania raz. W praktyce działa to dobrze. Nie zauważam żadnych zauważalnych opóźnień ani wynikających z tego błędów. Ale chciałem zapytać, czy to jest właściwa praktyka, czy też robię coś fundamentalnie złego. Czy rozsądne jest tworzenie tylu wątków za każdym razem, gdy użytkownik naciśnie przycisk? Jeśli nie, jak mogę to zrobić inaczej?


title: Czy gettext jest odpowiedni do internacjonalizacji dokumentacji pomocy użytkownika?

text: W moim projekcie mamy pliki po do internacjonalizacji/tłumaczenia różnych etykiet, komunikatów o błędach, tekstu przycisków itp. Mamy również oddzielne pliki po dla całej naszej dokumentacji pomocy, która jest dołączona do produktu. Czy jest to właściwe użycie gettexta - umieszczanie całych dokumentów w plikach po zamiast samych etykiet i wiadomości? Format został jeszcze bardziej skomplikowany, ponieważ czasami (w przypadku podpowiedzi lub ikon „co to jest”) potrzebna jest tylko niewielka część dokumentacji pomocy, co powoduje, że pojedyncze frazy/paragrafy są wpisami w pliku po, które są następnie łączone razem gdy użytkownik przegląda pomoc... co utrudnia samo tłumaczenie. Czy istnieje lepszy sposób na umiędzynarodowienie dokumentacji pomocy dla użytkowników końcowych?


title: Korzystasz z programów open-source w swojej firmie?

text: Czy są jakieś wady zmuszania pracowników do korzystania z programów open-source w Twojej firmie? Planuję założyć firmę i zastanawiam się, dlaczego firmy zwykle pracują z oprogramowaniem własnościowym, jak _Microsoft Word_ cytując najsłynniejszy. Dlaczego nie używają _Open Office_ (lub _Libre Office_ ) itp.? Z mojego punktu widzenia można zaoszczędzić sporo pieniędzy i pomóc społeczności open-source, np. przekazując jej część swoich korzyści w postaci darowizn. Nie znam żadnej (średnio-dużej) firmy, która to robi. Prawdopodobnie mógłbyś podać mi kilka przykładów, aby udowodnić, że ten model wykorzystania/współpracy z otwartym kodem źródłowym ~~działa~~ jest niezły.


title: Jak mogę ustawić "brak podprocesu" dla IDLE Pythona innego niż skrót?

text: Udało mi się uruchomić moje ulubione narzędzie Pythona, Python iDLE, uruchamiając je skrótem systemu Windows do IDLE.BAT z opcją -n (bez podprocesu) na końcu ciągu TARGET. Czy istnieje inny/lepszy sposób na zrobienie tego, aby nie potrzebować skrótu do systemu Windows?


title: Jak wdrożyć ograniczony dostęp do funkcji aplikacji

text: Obecnie pracuję nad aplikacją sieci web, która udostępnia użytkownikowi pewne ' ** _service_** '. Użytkownik będzie musiał wybrać ' ** _plan_** ', zgodnie z którym będzie mógł wykonywać działania specyficzne dla aplikacji, ale do limitu określonego przez plan. Plan ograniczy również dostęp do niektórych funkcji, które nie będą w ogóle dostępne w przypadku niektórych planów. Jako **przykład** : powiedzmy, że istnieją 3 **plany** , 2 **działania** w całej aplikacji * użytkownicy w planie 1 mogą wykonać akcję 1 3 razy i nie mogą wykonać akcji 2 w ogóle * użytkownicy w planie-2 mogą wykonać czynność-1 10 razy, czynność-2 5 razy * użytkownicy w planie-3 mogą wykonać czynność-1 20 razy, czynność-2 10 razy Szukam więc najlepszego sposobu na uzyskanie to zrobione, a moje główne obawy poza wdrożeniem są następujące (w dowolnej kolejności) * **utrzymywanie/zmienność** : liczba planów i rodzaj funkcji/działań **zmieni się** w produkcie końcowym * **standard branżowy/najlepsza praktyka** : gotowość na przyszłość * **wydajność** : oczywiście chcę szybkiego kodu!! Nigdy wcześniej czegoś takiego nie robiłem, więc **nie mam pojęcia** o tym, jak zaimplementować te funkcjonalności. **Jakieś wskazówki/przewodniki/wzory/zasoby/przykłady?** Czytałem trochę o ACL, RBAC, czy są to wzorce, których muszę przestrzegać? Naprawdę, każda informacja zwrotna pomoże.


title: Czym jest dobra (porządna) architektura w programowaniu?

text: Kiedy buduję prostą stronę internetową, np. książkę kontaktów, w której mogę dodawać, usuwać i aktualizować kontakty, tworzę plik `index.php`, w którym użytkownik, jeśli nie jest zalogowany, jest proszony o podanie hasła, a jeśli wpisze prawidłowe hasło, przypisuje mu sesję i może robić pewne rzeczy z kontaktami. Mam dwa pliki: 1. Pierwszy (`contacts.php`) służy do wyświetlania kodu HTML. Nad kodem HTML dołączam drugi plik i tworzę klasę. 2. Drugi (`contacts_class.php`) zawiera wszystkie metody dodawania, usuwania i aktualizacji. Myślę, że to w porządku, ale jeśli chodzi o realizację dużego projektu, jak mam to zrobić? Czy muszę tworzyć foldery dla każdej strony i umieszczać w nich pliki (jak wyżej, HTML i klasa) i jak mam to zrobić? Jaka jest dobra i zgrabna architektura do budowania dużych projektów, którą każdy inny programista doskonale zrozumie?


title: Jaka jest „najlepsza praktyka” konwertowania struktury danych zewnętrznego interfejsu API?

text: Gdy struktura danych interfejsu API nie pasuje dobrze do aplikacji kątowej, próbuję określić najlepszą praktykę w moim konkretnym projekcie i implementacji w celu przekonwertowania go na użyteczną strukturę. Robiłem to „w razie potrzeby” w ramach kontrolerów/dyrektyw aplikacji, co szybko doprowadziło do kodu spaghetti. Teraz myślę, że to należy do usługi/fabryki, która współdziała z interfejsem API. Czy istnieją wady lub zalety wzorca fabryki w porównaniu z architekturą bardziej zorientowaną na usługi, jeśli chodzi o obsługę konwersji struktury danych?


title: Bazy danych i serwer CI

text: Mam serwer CI (Hudson), który wesoło buduje, przeprowadza testy jednostkowe i wdraża do środowiska programistycznego, ale teraz chciałbym, aby uruchomił testy integracyjne. Testy integracyjne trafią do bazy danych i ta baza danych będzie stale zmieniana, aby zawierała dane istotne dla danego testu. Prowadzi to jednak do problemu — jak mogę się upewnić, że baza danych nie jest zapełniana danymi z jednego testu, a następnie dane są zastępowane przez drugi projekt przed zakończeniem pierwszego zestawu testów? Na bieżąco korzystam z metody „nadzieja”, która w tej chwili nie sprawdza się zbyt źle, ale głównie ze względu na to, że mamy tylko niewielką liczbę testów integracyjnych ustawionych na CI. Jak widzę, mam następujące opcje: * Bazy danych testowych (w pamięci) Nie jestem pewien, czy jakaś baza danych w pamięci obsłuży wszystkie przerażające wyzwalacze i pakiety Oracle itp. być wartościowym testem. * Lokalne bazy danych CI Executor Wymagałoby to sporo pracy, aby to ustawić i aktualizować, ale zdecydowanie jest to opcja (większość pracy jest już wykonana, aby bieżąca baza danych CI była aktualna) . * Pojedynczy executor „testów integracyjnych” Prawdopodobnie najłatwiejszy do zaimplementowania, ale oznaczałby, że testy integracyjne mogą być dość daleko w tyle. * Blokowanie bazy danych (lub zestawu tabel) Na pewno pominąłem kilka sposobów (proszę je dodać). Jak przeprowadzić testy integracyjne oparte na bazie danych na serwerze CI? Jakie miałeś problemy i jaką metodę polecasz? (Uwaga: chociaż używam Hudsona, chętnie przyjmę odpowiedzi dla dowolnego serwera CI, pomysły, które z pewnością będą przenośne, nawet jeśli szczegóły nie są). Pozdrawiam, Mlk


title: Zastosowano styl warstwy, ale intuicja jest inna

text: Obecnie pracuję nad architekturą dla systemu następującego rodzaju: Istnieje kilka istniejących aplikacji (frontend), za pomocą których można zdefiniować profile UML przechwytujące pewne specyficzne aspekty domeny. Ponieważ narzędzia są zastrzeżone, produkowane modele domyślnie nie podlegają wymianie. Z drugiej strony istnieje kilka narzędzi, które mogą analizować produkowane modele frontendowe (backend). Mają one również własne mechanizmy (które różnią się od frontendów) do reprezentowania aspektów domeny. Ponieważ spowodowałoby to m*n transformacji modelu z m frontendami i n backendami, zdecydowałem się wprowadzić model wymiany, który przechwytuje wszystkie istotne informacje z frontendów, a mimo to pozwala backendowi na posiadanie wystarczającej ilości informacji do analizy. Takie podejście skutkuje tylko m+n przekształceniami. Moje spojrzenie na architekturę z lotu ptaka: ![Przegląd architektury](http://i.stack.imgur.com/uCyfx.jpg) Rzeczy wyglądają tak: Możliwa jest transformacja między modelem frontendowym<->modelem wymiany a modelem wymiany <->model zaplecza. Zadania analityczne są uruchamiane w interfejsie i delegowane do zaplecza, gdzie są wykonywane. Na pierwszy rzut oka wyglądało to dla mnie jak warstwowy styl, ale im więcej o tym myślałem, intuicja problemu polega na tym, żeby nie robić różnych warstw wymiennych, gdzie warstwy osiągają separację obaw i skupiają się na przenośności. Chodzi raczej o wprowadzenie warstwy pośredniej, która oddziela dwie pozostałe i ma na celu głównie rozszerzalność. Inną kwestią jest to, że najwyższa abstrakcja nie znajduje się w najwyższej warstwie, ale w warstwie pośredniej, tj. format wymiany powinien być rdzeniem architektury, do której można dołączać frontendy i backendy. Nie powinien wiedzieć nic o dołączonych frontendach ani backendach. Oznacza to również, że warstwa zaplecza musi wiedzieć, jak przekształcić format wymiany na własną reprezentację modelu, co jest niedozwolone w przypadku stylu warstwowego. Sprowadza się to do **pytań**: 1. Czy znasz jakiś styl architektoniczny, który jest podobny do tego, który przedstawiłem, a jednocześnie jest zgodny z jego intuicją? 2. Dlaczego nie jest to dobry przykład dla stylu warstwowego (poza użyciem w górę)? 3. Ponieważ aplikacja jest oparta głównie na modelach, czy istnieją jakieś specyficzne wzory/style architektoniczne dla tego rodzaju systemów? Z góry dziękujemy za pomoc! EDIT: Właściwie jestem zainteresowany warstwami, ponieważ toporna wizja tej architektury jest osadzona w istniejącym projekcie i jest tam komunikowana jako „warstwy”. Ale z architektonicznego punktu widzenia nie pasuje do stylu. Problem leży pomiędzy dokumentacją a komunikacją architektury. Jeśli większość interesariuszy mówi o architekturze warstwowej, a ja wprowadzam do niej widok warstwowy, mimo że nie jest on stosowany poprawnie, czy nie zmyliłoby to wszystkich interesariuszy, którzy dobrze rozumieją architekturę warstwową? Celem jest udokumentowanie poglądów stylu, który jest rzeczywiście stosowany, aby mieć właściwą podstawę do komunikowania architektury.


title: Autoryzacja i uwierzytelnianie przy użyciu wielu typów uwierzytelniania w MVC

text: Obecnie zarządzam zespołem, w którym budujemy nową aplikację SaaS. Obecna struktura polega na tym, że mamy rozwiązanie, które zawiera naszą logikę biznesową i dane oraz rozwiązanie, które przechowuje naszą stronę internetową (i powiązane projekty) W naszej obecnej bazie użytkowników są klienci, którzy używają różnych rodzajów uwierzytelniania: * nazwa użytkownika /password przy użyciu architektury członkostwa aspnet * Domowe usługi sieci Web SOAP, które umożliwiają programistom łączenie się przez jednokrotne logowanie * Klienci SAML mogą mieć różne ustawienia logowania, ale użytkownicy w ramach klientów logują się w ten sam sposób. Dużym wyzwaniem związanym z naszym starym systemem jest to, że są one nieco „zhakowane” razem i bardzo trudne do zarządzania. Chcę mieć pewność, że w przyszłości będziemy znacznie bardziej skalowalni. Przyjrzałem się uwierzytelnianiu opartemu na oświadczeniach przy użyciu frameworka MVC i rozumiem to całkiem dobrze, więc jestem pewien, że nasz zespół może zbudować framework, aby go obsługiwać. Moje wyzwanie dotyczy STS (serwera tożsamości), więc mam kilka pytań: 1. Zasadniczo, czy idę we właściwym kierunku? 2. Jaki system posiada wiedzę o tym, gdzie należy uwierzytelnić użytkownika? Podejrzewałbym STS, ponieważ oznaczałoby to, że system oparty na oświadczeniach naprawdę nie może się martwić o uwierzytelnianie lub autoryzację 3. Sprawdziłem OpenAM, OpenIDM i IdentityServer pod kątem STS, ale nie mogę naprawdę dowiedzieć się, jak je podłączyć. te nawet systemy STS? 4. Jestem również gotów wydać pieniądze na rozwiązanie, czy są jakieś inne rozwiązania, którymi powinienem się przyjrzeć?


title: Pisanie nadzbioru języka programowania jako transkompilatora

text: Moim pomysłem jest napisanie nadzbioru C# (ale pytanie nie jest specyficzne dla języka), tak aby kompilował (transkompilował) do samego C# (klauzule przełączania awaryjnego, domyślne parametry metod itp., nic niemożliwego w C#). Pierwszym pomysłem było parsowanie go, tworzenie drzew składni, drzew abstrakcyjnych itp., ale wydaje mi się to trochę przesadą, głównie dlatego, że duże fragmenty kodu pozostaną takie same. **Moje pytanie:** Czy jest na to prostszy sposób? Jednym z moich pomysłów było wyszukanie tokenów, które wymagają modyfikacji (np. `switch` w przypadku awarii), a następnie przepisanie kodu (w razie potrzeby dodaj `goto case NEXT_CASE`), ale czy jest na to lepszy i czystszy sposób ?


title: Problemy z zamierzonym zachowaniem warstwy usługi?

text: Ta analiza ma sens i stwierdza, że wszystko, co pozwala uniknąć powielania kodu i upraszcza konserwację, przemawia za warstwą usług. Jakie jest zachowanie techniczne? 1. Kiedy klient usługi odwołuje się do usługi, czy robi to w czasie wykonywania, czy dzieje się to w czasie kompilacji? 2. Kiedy zmienię coś w kodzie warstwy usług, czy ta zmiana zostanie automatycznie uwzględniona we wszystkich jego klientach, czy też muszą być indywidualnie rekompilowane? 3. Jaki to ma sens z testowego punktu widzenia - mam działający kod oparty na kodzie z usługi, ale jeśli ta usługa się zmieni, mój kod może się zepsuć?!


title: Co zrobić, gdy narzędzie do śledzenia problemów nie działa?

text: W naszym zespole zdarzyło się, że nasze narzędzie do śledzenia problemów nie działa. Odbywa się mniej więcej raz w tygodniu (tak, wow) i tak naprawdę niewiele możemy zrobić, aby go przywrócić, ponieważ jest hostowany przez naszego klienta w innej strefie czasowej. Czasami ponowne uruchomienie zajmuje kilka godzin. W międzyczasie nie możemy tak naprawdę powiedzieć, nad którymi problemami pracowaliśmy, a jeśli to zrobimy, nie możemy zaktualizować tych problemów, jak przenoszenie ich przez przepływ pracy, rejestrowanie wykorzystywanych godzin, sprawdzanie opisu problemu, pozostawianie komentarzy i wkrótce. Więc pytanie brzmi: jak możemy, jako zespół, pracować w międzyczasie, aby gdy narzędzie do śledzenia problemów zostanie ponownie uruchomione, mamy jak najmniej kłopotów z aktualizowaniem go za pomocą tego, nad czym pracowaliśmy?


title: Dlaczego nie zawiera tagu HTML po stronie klienta?

text: Niedawno inny programista zadał mi pytanie. Pamiętam (bardzo dawno temu) zastanawiałem się nad tym samym. **Dlaczego tag dołączania po stronie przeglądarki nigdy nie był brany pod uwagę? A może?** Konkretnie z tagiem, który poinstruował przeglądarkę, aby zawierała dodatkowy kod HTML z innych źródeł. np. `<include src="http://server/foo/bar.html">`. Wiele osób wykonuje wywołania javascript i wypełnia `innerHTML`, aby osiągnąć to samo, podczas gdy to samo poza silnikiem javascript może być wykonane przez przeglądarkę. Zagnieżdżanie (tj.) `<HTML> `<BODY> byłoby bolesne, ale i tak musimy wziąć pod uwagę ten aspekt.


title: Porównanie frameworków internetowych w Pythonie

text: Niedawno zadałem pytanie na SO dotyczące frameworków internetowych Pythona: http://stackoverflow.com/questions/4909306/python-web-frameworks-vs-java-web-frameworks-how-is-web-development-in-python- czy chcę się tego nauczyć tylko dla zabawy, ale musi też być w stanie pomóc mi w dostarczeniu odpowiedniej, działającej aplikacji. Szukam frameworka z wieloma funkcjami, potężnego, dojrzałego, z dużą społecznością, dobrą dokumentacją, książkami itp. Potrzebuję czegoś, co pomoże mi być bardziej produktywnym w rozwijaniu mojej aplikacji i nie marnuje czasu na zastanawianie się, jak zrobić określone rzecz we frameworku lub jak napisać obejście ograniczeń frameworka. Myślałem o jednym z następujących: django, zope, turboprzekładnie, pylony. Oczywiście wojna tam szaleje i są inne alternatywy, ale wydaje się, że Django jest na szczycie… czy to tylko szum? Interesują mnie plusy i minusy każdego z nich. Jaka była najlepsza funkcja, którą według Ciebie ma framework? Czego mu brakuje? Co można było zrobić inaczej. Pomóż mi wybrać jeden do nauki na początek.


title: Nauka języka programowania GO i jego perspektyw

text: > **Możliwy duplikat:** > Jakie są szanse, że Google Go stanie się językiem głównego nurtu? Ostatnio zacząłem eksperymentować z językiem programowania The GO firmy Google. Jest to przyjazny dla programistów język, mający prostotę Pythona. Zastanawiałem się, czy firmy inne niż Google również zaczną używać Go do rozwoju, a jeśli to zrobią, jakie będą perspektywy zostania programistą Go?


Jest wiele osób, które nadal pracują w tej samej firmie od ponad 10 lat. Jaka motywacja sprawia, że trzymasz się obecnej pracy?


title: Pracodawcy płacą za świeżo upieczonych absolwentów MS Degree?

text: Czy w dzisiejszych czasach nadal istnieje opcja (poza pracą dla rządu), że w prywatnym biznesie firma pomoże zapłacić za część/całość dyplomu MS? Jakie jest prawdopodobieństwo, że firma zapłaci za świeży dyplom, aby uzyskać tytuł magistra, gdy im za to pomoże?


title: Dlaczego 0 jest fałszywe?

text: To pytanie może zabrzmieć głupio, ale dlaczego „0” jest oceniane jako „fałsz”, a każda inna wartość [liczba całkowita] jako „prawda” jest w większości języków programowania? # Porównanie ciągów Skoro pytanie wydaje się trochę zbyt proste, wyjaśnię się trochę bardziej: po pierwsze, każdemu programiście może się to wydawać oczywiste, ale dlaczego nie miałby istnieć język programowania - może być, ale nie wszystkie, których użyłem - gdzie „0” ocenia się na „prawda”, a wszystkie inne wartości [liczba całkowita] na „fałsz”? Ta jedna uwaga może wydawać się przypadkowa, ale mam kilka przykładów, w których może to być dobry pomysł. Przede wszystkim weźmy przykład trójstronnego porównania łańcuchów, jako przykład wezmę `strcmp` w C: każdy programista próbujący C jako swojego pierwszego języka może ulec pokusie napisania następującego kodu: if (strcmp(str1, str2) ) { // Zrób coś... } Ponieważ `strcmp` zwraca `0`, co oznacza `false`, gdy łańcuchy są równe, to, co próbował zrobić początkujący programista, sromotnie kończy się niepowodzeniem i na początku generalnie nie rozumie dlaczego. Gdyby zamiast tego wartość „0” miała wartość „prawda”, ta funkcja mogłaby zostać użyta w jej najprostszym wyrażeniu — tym powyżej — podczas porównywania równości, a prawidłowe sprawdzenie „-1” i „1” zostałoby wykonane tylko kiedy był potrzebny. Przez większość czasu uznalibyśmy, że zwracany typ to `bool` (mam na myśli to, że mamy na myśli). Co więcej, wprowadźmy nowy typ, `znak`, który przyjmuje tylko wartości `-1`, `0` i `1`. To może być bardzo przydatne. Wyobraźmy sobie, że w C++ jest operator statku kosmicznego i chcemy go użyć jako `std::string` (no cóż, funkcja `compare` już istnieje, ale operator statku kosmicznego jest fajniejszy). Deklaracja byłaby obecnie następująca: operator znaku<=>(const std::string& lhs, const std::string& rhs); Gdyby „0” zostało ocenione jako „prawda”, operator statku kosmicznego nawet by nie istniał i moglibyśmy zadeklarować „operator==” w ten sposób: operator znaku==(const std::string& lhs, const std::string& prawa strona); Ten `operator==` obsłużyłby od razu porównanie trójstronne i nadal mógłby być użyty do wykonania następującego sprawdzenia, jednocześnie będąc w stanie sprawdzić, który łańcuch jest leksykograficznie lepszy od drugiego w razie potrzeby: if (str1 == str2) { // Zrób coś... } # Obsługa starych błędów Mamy teraz wyjątki, więc ta część dotyczy tylko starych języków, w których coś takiego nie istnieje (na przykład C). Jeśli spojrzymy na standardową bibliotekę C (i bibliotekę POSIX również), możemy zobaczyć na pewno, że wiele funkcji zwraca `0`, gdy się powiedzie, a dowolną liczbę całkowitą w przeciwnym razie. Niestety widziałem, jak niektórzy ludzie robią takie rzeczy: #define TRUE 0 // ... if (some_function() == TRUE) { // Tutaj PRAWDA oznaczałaby sukces... // Zrób coś } Jeśli myślimy o tym, jak myślimy w programowaniu, często mamy następujący wzorzec rozumowania: Zrób coś Czy to zadziałało? Tak -> W porządku, jedna sprawa do załatwienia Nie -> Dlaczego? Wiele spraw do załatwienia Jeśli zastanowimy się nad tym ponownie, sensowne byłoby umieszczenie jedynej neutralnej wartości, `0`, na `tak` (i tak działają funkcje C), podczas gdy wszystkie inne wartości mogą być tam do rozwiązania wiele przypadków „nie”. Jednak we wszystkich językach programowania, które znam (może z wyjątkiem niektórych eksperymentalnych języków ezoterycznych), „tak” oceniane jest jako „fałsz” w warunku „jeśli”, podczas gdy wszystkie przypadki „nie” oceniają jako „prawda”. Istnieje wiele sytuacji, w których „to działa” reprezentuje jeden przypadek, podczas gdy „to nie działa” reprezentuje wiele prawdopodobnych przyczyn. Jeśli myślimy o tym w ten sposób, oszacowanie „0” na „prawdę”, a resztę na „fałsz” miałoby znacznie większy sens. # Wnioski Mój wniosek jest zasadniczo moim pierwotnym pytaniem: dlaczego zaprojektowaliśmy języki, w których „0” jest „fałszem”, a inne wartości są „prawdą”, biorąc pod uwagę kilka przykładów powyżej i może kilka innych, o których nie pomyślałem? **Kontynuacja:** Miło widzieć, że jest wiele odpowiedzi z wieloma pomysłami i tak wieloma możliwymi przyczynami. Uwielbiam to, jak bardzo się tym zajmujesz. Początkowo zadałem to pytanie z nudów, ale ponieważ wydajesz się tak pasjonujący, postanowiłem pójść trochę dalej i zapytać o uzasadnienie wyboru wartości logicznej dla 0 i 1 na Math.SE :)