title: Zbieg okoliczności czy reguła?

text: Czytałem o Assemblies (modułach, z którymi współpracuje Microsoft CLR). Zbiór zawiera tzw. Manifest, który z definicji opisuje zbiór plików w Zgromadzeniu. Wiem, że aplikacje na Androida zawierają również plik o nazwie Manifest, który również opisuje zestaw plików zawartych w aplikacji. Czy to po prostu przypadek? A może są jakieś powszechnie akceptowane zasady tworzenia oprogramowania, aby nazywać pliki „specjalne”?


title: Czy znajomość Pythona pomogłaby w tworzeniu aplikacji na iPhone'a?

text: Oto, co mówi witryna Apple: > Dzięki Snow Leopard, Mac OS X ułatwia pełne korzystanie z języków skryptowych > Narzędzia do tworzenia aplikacji. Snow Leopard jest dostarczany z obsługą mostów > RubyCocoa Bridge i PyObjC. Te dwa mosty zapewniają programistom dostęp nie tylko do systemowych interfejsów API, ale także do frameworków Cocoa, takich jak AppKit i Core Data, umożliwiając tworzenie w pełni natywnych aplikacji Mac OS X w językach Ruby lub Python. Mostki RubyCocoa i PyObjC pozwalają na swobodne mieszanie kodu > napisanego w Objective-C z kodem napisanym w języku skryptowym. Możesz > szybko budować prototypy, a następnie optymalizować, wdrażając elementy o krytycznym znaczeniu dla wydajności w Objective-C. Jak Python mógłby pomóc w tym przypadku?


title: Jak daleko powinienem ujawnić to wyliczenie stanu?

text: Napisałem małą aplikację do zarządzania dowolną serią zadań (np. wywołanie sproc SQL i przechwycenie out-vars, uruchomienie innej aplikacji, uruchomienie pakietu SSIS) z zależnościami między zadaniami. Każde zadanie ma status (oczekujące na rozpoczęcie, nieudane i oczekujące na ponowną próbę, nieudane i porzucone, zakończone sukcesem itp.). Wewnętrznie każdy obiekt `Task` ma pole typu wyliczeniowego `TaskStatus`. Istnieje obiekt `TaskManager`, który uruchamia zadania i monitoruje ich sukcesy i niepowodzenia, oraz WinForm `Dashboard` wyświetlający postęp. Czy powinienem uwidaczniać stan każdego zadania jako wyliczenie w całej aplikacji, czy tylko w Menedżerze zadań, czy zawsze udostępniać tylko wartość ciągu? Moje podejście polegało na uwidocznieniu statusu jako enum, ale oznacza to, że nie tylko `TaskManager`, ale także `Dashboard` są zależne od możliwych wartości `TaskStatus`. Prawie wysłałem to pytanie na przegląd kodu, ale ogólnie uważam, że lepiej tu pasuje, wyczuwam, że jest to głównie kwestia zasad. „Pulpit nawigacyjny” współdziała tylko z „Task.Status” w dwóch miejscach. Po pierwsze, jego wartość jest wyświetlana w „DataGridView”, który podsumowuje wszystkie zadania, a to naprawdę powinno zamiast tego używać wartości tekstowej, choćby po to, aby umożliwić ładniejsze wartości. Po drugie, wartości statusu są porównywane, gdy sortowana jest kolumna Status, i oczywiście będzie to działać w obie strony. `TaskManager` to niepewna część. Na przykład „TaskManager” ma właściwości „NumTasksRunning”, „NumTasksComplete” i „NumTasksWaiting”. Pierwotnie, gdy `Task`s bezpośrednio ujawnia swoje statusy, umieściłem tę logikę w `TaskManager`: public int NumTasksRunning { get { return _tasks.Count(t => t.IsEnabled && (t.Status == TaskStatus.Running || t.Status == TaskStatus.Aborting || t.Status == TaskStatus.FailedAwaitingRetry)); } } public int NumTasksComplete { get { return _tasks.Count(t => t.IsEnabled && (t.Status == TaskStatus.Succeeded || t.Status == TaskStatus.FailedAbandoned)); } } public int NumTasksWaiting { get { return _tasks.Count(t => t.IsEnabled && (t.Status == TaskStatus.Waiting)); } } Mógłbym przenieść tę logikę do właściwości w `Task`, chroniąc `TaskManager` przed koniecznością znajomości wyliczenia: public bool IsRunning { get { return _status == TaskStatus.Running || _status == TaskStatus.Aborting || _status == TaskStatus.FailedAwaitingRetry; } } public bool IsComplete { get { return _status == TaskStatus.Succeeded || _status == StatusZadania.NieudaneOpuszczone; } } public bool Oczekuje { get { return _status == TaskStatus.Waiting; } } Istnieją jednak inne miejsca, w których kod jest znacznie prostszy, jeśli `TaskManager` może bezpośrednio zobaczyć statusy zadań: public void Abort(Exception ex) { State = TaskManagerState.Aborting; foreach (Zadanie zadania w _tasks) if (task.Status == TaskStatus.Running && task.CanAbort) task.Abort(ex); } Oczywiście mógłbym dodać nową właściwość do `Task`, być może nazwaną `CanAbortNow` (`CanAbort` oznacza, że zadanie można przerwać w zasadzie oddzielnie), ale jest to tylko jeden z kilku punktów styku. Jeśli skończę z właściwością "IsX" dla każdej możliwej wartości `TaskStatus`, czy naprawdę ułatwiłem utrzymanie kodu? Ta aplikacja jest do mojego osobistego użytku, więc wybór tak naprawdę ma znaczenie tylko w tym, że chciałbym znać "właściwy" sposób - jeśli istnieje jakikolwiek konsensus.


title: Jak mogę sprawić, by znajomość szczegółów implementacji nie była konieczna w moim API?

text: Czy to możliwe, że mamy warstwę API po prostu z tego powodu, aby ludzie w zespole nie musieli rozumieć rzeczywistej implementacji poszczególnych komponentów, nad którymi każdy z nas pracuje? Przyszło mi do głowy, ponieważ zacząłem odkrywać, że czasami pracując nad projektem z zespołem ludzi (jestem nowy w pracy w grupie), trochę trudno jest wiedzieć, od czego zacząć. Chcemy podzielić ogromną aplikację na części, tak aby każdy z nas mógł skoncentrować się na własnej części, podczas gdy pod koniec dnia nadal chcemy, aby te części działały razem bez konieczności, aby każdy członek dokładnie wiedział o rzeczywistej implementacji każdego Części. Ale dla mnie API zwykle służy jako interfejs dla "zewnętrznych" programistów do rozszerzania lub budowania nowych rzeczy z naszej pracy bez konieczności przechodzenia bezpośrednio do części podstawowej. Ponieważ wszyscy pracujemy w zespole, posiadanie API dla każdego komponentu tylko po to, abyśmy pracowali między sobą, wydaje się trochę przesadne i zabawne. Jaka jest więc zwyczajowa praktyka w takich sytuacjach? Chociaż w moim przypadku używam Javy, uważam, że właściwa praktyka w takich sytuacjach sprawdza się w projektach wszystkich języków, prawda?


title: Czy warto zapoznać się ze specyfikacją języka?

text: Zastanawiam się, czy warto czytać specyfikacje językowe/standardowe dokumenty (np. Specyfikacja języka Java), jeśli nie zamierzasz pisać kompilatora/interpretera dla języka lub czegoś podobnego? Rozumiem, że czytanie takiej książki nie powinno być dla nikogo pierwszym kontaktem z językiem, ale może to być świetny sposób na poznanie jego drobniejszych szczegółów. Czy kiedykolwiek zawracałeś sobie głowę, a inni powinni?


title: Refaktoryzacja modelu Single Rails z dużymi metodami i długimi zapytaniami łączącymi, próbując zrobić wszystko

text: Mam **działający** model Ruby on Rails, który podejrzewam, że jest **nieefektywny** , **trudny do utrzymania** i **pełny niepotrzebnych zapytań sprzężenia SQL**. Chcę **zoptymalizować** i **refaktoryzować** ten model (Quiz.rb), aby był zgodny z najlepszymi praktykami Railsów, ale nie jestem pewien, jak powinienem to zrobić. Aplikacja Rails to gra, która zawiera „Misje” z wieloma „Etapami”. Użytkownik wypełnia etapy, odpowiadając na pytania z poprawnymi lub niepoprawnymi odpowiedziami. Kiedy `Użytkownik` próbuje ukończyć etap, odpowiadając na pytania, `Użytkownik` otrzymuje wpis **`Quiz`** z wieloma `Próbami`. Każda „Próba” rejestruje „Odpowiedź” przesłaną na to „Pytanie” w ramach „Etapu”. Użytkownik kończy etap lub misję, poprawiając każdą „Próbę”, a ich postęp jest śledzony przez dodanie nowego wpisu do „UserMission”. ` & `UserStage` dołączają do tabel. Wszystkie te funkcje działają, ale niestety model `Quiz.rb` został przekręcony, aby obsłużyć prawie wszystko. Callbacki rozpoczęły się w 'Quiz.rb', a ponieważ nie byłem pewien, jak opuścić model `Quiz` podczas aktualizacji wielomodelowej, uciekłem się do użycia _Rails Console_, aby mieć zmienną instancji `@quiz` przez `self .jakaś_metoda` wykonaj _wszystkie_ ciężkie działania, aby _odzyskać każdą wartość danych_ dla logiki biznesowej gry; w wyniku dużych zapytań sprzężenia rozszerzonego, które „tańczą” wokół schematu bazy danych. ## Model `Quiz.rb`, który pachnie: class Quiz < ActiveRecord::Base należy_do :user has_wiele :attempts, zależny: :destroy before_save :check_answer before_save :update_user_mission_and_stage accepts_nested_attributes_for :attempts | =|> lambreda a[:answer_id].blank? }, :allow_destroy => true #Sprawdza każdą odpowiedź w każdym quizie, dodając +1 za każdą poprawną odpowiedź #w quizie etapowym i -1 za każdą niepoprawną odpowiedź def check_answer stage_score = 0 self.attempts.each do |attempt| jeśli próba.odpowiedz.prawidłowa? == true stage_score += 1 elsif próba.answer.correct == false stage_score - 1 end end stage_score end def zwycięzca return true end def update_user_mission_and_stage ####### #Krok 1: Sprawdza, czy UserMission istnieje, znajduje lub tworzy . #jeśli nie istnieje misja użytkownika dla bieżącej misji, tworzy nową misję użytkownika, jeśli self.user_has_mission? == false @user_mission = UserMission.new(user_id: self.user.id, mission_id: self.current_stage.mission_id, dostępne: true) @user_mission.save else @user_mission = self.find_user_mission end ####### # Krok 2: Sprawdza, czy obecny UserStage istnieje, zatrzymuje się, jeśli true, aby zapobiec zduplikowaniu wpisu, jeśli self.user_has_stage? @user_mission.save return true else ####### ##Krok 3: jeśli krok 2 zwróci false: ##Inicjuje instrukcje tworzenia UserStage #sprawdza zwycięzcę (należy zdefiniować akcje zwycięzcy), jeśli ukończą ostatni etap misja dla danej orientacji, jeśli self.passed? && self.is_last_stage? && self.is_last_mission? create_user_stage_and_update_user_mission self.winner #UWAGA: Pozostałe są takie same, ale określ warunki, które są dostępne, aby dodać odznaki lub inne działania po wystąpieniu tych warunków: ##jeśli użytkownik ukończył pierwszy etap misji elsif self.passed? && self.is_first_stage? && self.is_first_mission? create_user_stage_and_update_user_mission #tworzy odznakę użytkownika za ukończenie pierwszego etapu pierwszej misji self.user.add_badge(5) self.user.activity_logs.create(description: "przyznana odznaka pierwszego etapu", type_event: "badge", wartość: "pierwszy etap ") #Jeśli użytkownik ukończy ostatni etap danej misji, tworzy nową misję UserMission self.passed? && self.is_last_stage? && self.is_first_mission? create_user_stage_and_update_user_mission #tworzy odznakę użytkownika za ukończenie pierwszej misji self.user.add_badge(6) self.user.activity_logs.create(description: "przyznana odznaka za pierwszą misję", type_event: "badge", value: "first-mission") elsif sam.zdany? create_user_stage_and_update_user_mission jeszcze self.passed? == false return true end end end #Tworzy nowy rekord UserStage w bazie danych dla pomyślnego zakończenia testu quizu def create_user_stage_and_update_user_mission @nu_stage = @user_mission.user_stages.new(user_id: self.user.id, stage_id: self.current_stage.id ) @nu_stage.save @user_mission.save self.user.add_points(50) end #Boolean, który definiuje przejście etapu jako odpowiedź na każde pytanie w tym etapie poprawna def przeszła? self.check_answer >= self.number_of_questions end #Zwraca liczbę pytań zadawanych w quizie danego etapu def number_of_questions self.attempts.first.answer.question.stage.questions.count end #Zwraca bieżący_etap quizu, przechodząc przez pierwszą próbę w tym quizie def current_stage self.attempts.first.answer.question.stage end #Zwraca pozycję sceny w stosunku do jej misji. def stage_position self.attempts.first.answer.question.stage.position end #znajdzie misję_użytkownika dla bieżącego użytkownika i etap jeśli istnieje def find_user_mission self.user.user_missions.find_by_mission_id(self.current_stage.mission_id) end #Zwraca true jeśli quiz dotyczył ostatniego etapu w tej misji #pomocny do wywoływania działań związanych z ukończeniem misji przez użytkownika def is_last_stage? self.stage_position == self.current_stage.mission.stages.last.position end #Zwraca wartość true, jeśli quiz był na pierwszym etapie tej misji #pomocny w uruchamianiu działań związanych z ukończeniem misji przez użytkownika def is_first_stage? self.stage_position == self.current_stage.mission.stages_ordered.first.position end #Zwraca true jeśli bieżący użytkownik ma misję użytkownika dla bieżącego etapu def user_has_mission? self.user.missions.ids.include?(self.current_stage.mission.id) end #Zwraca true, jeśli bieżący użytkownik ma UserStage dla bieżącego etapu def user_has_stage? self.user.stages.include?(self.current_stage) end #Zwraca true, jeśli bieżący użytkownik jest na ostatniej misji na podstawie pozycji w danej orientacji def is_first_mission? self.user.missions.first.orientation.missions.by_position.first.position == self.current_stage.mission.position end #Zwraca true, jeśli bieżący użytkownik jest na pierwszym etapie i misji danej orientacji def is_last_mission? self.user.missions.first.orientation.missions.by_position.last.position == self.current_stage.mission.position end end ## Moje pytanie Obecnie mój serwer Rails przetwarza pojedynczy `@quiz.save w przybliżeniu od 500ms do 1s ` działanie. Jestem przekonany, że powolność tutaj jest spowodowana niechlujnym kodem, a nie złym projektem ERD bazy danych. Jak wygląda lepsze rozwiązanie? A konkretnie: 1. Czy powinienem używać zapytań _join_ do pobierania wartości, tak jak to zrobiłem tutaj, czy zamiast tego lepiej jest tworzyć instancje nowych obiektów w modelu? A może brakuje mi lepszego rozwiązania? 2. Jak należy zrefaktoryzować **`update_user_mission_and_stage`**, aby postępować zgodnie z najlepszymi praktykami? * * * ## Relevant Code for Reference: **`quizzes_controller.rb` w/ Controller Route Initiating Callback:** class QuizzesController < ApplicationController before_action :find_stage_and_mission before_action :find_orientation before_action :find_question def show end def create @user = current_user @quiz = current_user.quizzes.new(quiz_params) if @quiz.save if @quiz.passed? jeśli @mission.next_mission.nil? && @stage.next_stage.nil? redirect_to root_path, zauważ: "Gratulacje, ukończyłeś ostatnią misję!" elsif @stage.next_stage.nil? redirect_to [@mission.next_mission, @mission.first_stage], uwaga: "Poprawnie! Czas na misję #{@mission.next_mission.position}", info: "Rozpoczęcie następnej misji" else redirect_to [@mission, @stage.next_stage] , zauważ: „Odpowiedź poprawna! Przeszedłeś etap!” end else redirect_to [@mission, @stage], alert: "Nie wszystkie pytania odpowiedziały dobrze, spróbuj ponownie." end else redirect_to [@mission, @stage], alert: "Przepraszamy. Nie udało się zapisać Twojej odpowiedzi. Skontaktuj się z administratorem." end @questions = @stage.questions.all end private def find_stage_and_mission @stage = Stage.find(params[:stage_id]) @mission = @stage.mission end def find_question @question = @stage.questions.find_by_id parametry[:id ] end def quiz_params params.require(:quiz).permit(:user_id, :attempt_id, {attempts_attributes: [:id, :quiz_id, :answer_id]}) end def find_orientation @orientation = @mission.orientation @missions = @orientation .missions.by_position end end **Przegląd istotnych relacji z bazą danych ERD:** **Misja -> Etap -> Pytanie -> Odpowiedź ->** Próba **< \- Quiz <\- Użytkownik** **Misja - >** UserMission **< \- User** **Stage ->** UserStage **< \- User** * * * **Inne modele:** **`Mission`.rb** class Mission < ActiveRecord::Base należy_do :orientacja has_wiele :etapy has_ma :user_missions, zależny: :destroy ma_wielu :users, poprzez: :user_missions #SCOPES scope :by_position, -> {order(position: :asc)} def stage_ordered stage.order(:position) end def następna_misja self.orientation.missions .find_by_position(self.position.next) end def first_stage next_mission.stages_ordered.first end end **`Stage`.rb:** class Stage < ActiveRecord::Base należy_do :mission has_many :questions, dependant: :destroy has_many :user_stages , dependant: :destroy has_many :users, poprzez: :user_stages accepts_nested_attributes_for :questions, odrzuć_if: :all_blank, allow_destroy: true def next_stage self.mission.stages.find_by_position(self.position.next) end end **`bQuestion`. ** class Pytanie < ActiveRecord::Base należy_do :stage has_many :answers, zależne: :destroy accepts_nested_attributes_for :answers, :reject_if => lambda { |a| a[:ciało].puste? }, :allow_destroy => true end **`Answer`.rb:** class Answer < ActiveRecord::Base należy_to :question has_many :attempts, dependant: :destroy end **`Próba`.rb**: class Attempt < ActiveRecord::Base należy_do :answer należy_do :quiz end **`User`.rb:** class Użytkownik < ActiveRecord::Base należy_to :school has_many :activity_logs has_many :user_missions, dependant: :destroy has_many :missions, poprzez: :user_missions has_many :user_stages, zależny: :destroy has_many :stages, poprzez: :user_stages ma_wiele :orientations, poprzez: :school has_many :quizzes, zależny: :destroy has_many :attempts, poprzez: :quizzes def last_stage_position.lastages.user_missions last.stage.position end end **`UserMission`.rb** class UserMission < A ctiveRecord::Base należy_to :user należy_do :mission has_many :user_stages, zależny: :destroy end **`UserStage`.rb** class UserStage < ActiveRecord::Base należy_to :user należy_to :stage należy_do :user_mission end


title: Zwrócić magiczną wartość, wyrzucić wyjątek lub zwrócić false w przypadku niepowodzenia?

text: Czasami muszę napisać metodę lub właściwość _dla biblioteki klas_, dla której nie jest niczym wyjątkowym brak prawdziwej odpowiedzi, ale niepowodzenie. Coś nie można określić, nie jest dostępne, nie znaleziono, obecnie nie jest możliwe lub nie ma więcej dostępnych danych. Myślę, że istnieją trzy możliwe rozwiązania dla takiej stosunkowo _niewyjątkowej_ sytuacji wskazującej na niepowodzenie w C# 4: * zwraca magiczną wartość, która nie ma innego znaczenia (na przykład `null` i `-1`); * wyrzuć wyjątek (np. `KeyNotFoundException`); * zwróć `false` i podaj rzeczywistą wartość zwracaną w parametrze `out` (np. `Dictionary<,>.TryGetValue`). Tak więc pytania brzmią: _w jakiej niewyjątkowej sytuacji powinienem zgłosić wyjątek?_ A jeśli nie powinienem rzucać: _kiedy zwraca wartość magiczną preferowaną powyżej implementując metodę `Try*` z parametrem `out`_? (Dla mnie parametr `out` wydaje się brudny i jest więcej pracy, aby go właściwie używać.) Szukam odpowiedzi opartych na faktach, takich jak odpowiedzi dotyczące wytycznych projektowych (nie wiem nic o metodach `Try*`) , użyteczność (jak proszę o bibliotekę klas), spójność z BCL i czytelność. * * * W bibliotece klas bazowych .NET Framework wszystkie trzy metody są używane: * zwracają magiczną wartość, która w przeciwnym razie nie ma żadnego znaczenia: * `Collection<T>.IndexOf` zwraca -1, * `StreamReader.Read` zwraca - 1, * `Math.Sqrt` zwraca NaN, * `Hashtable.Item` zwraca null; * wyrzuć wyjątek: * `Dictionary<,>.Item` wyrzuca KeyNotFoundException, * `Double.Parse` wyrzuca FormatException; lub * zwróć `false` i podaj rzeczywistą zwracaną wartość w parametrze `out`: * `Dictionary<,>.TryGetValue`, * `Double.TryParse`. Zauważ, że ponieważ `Hashtable` został stworzony w czasie, gdy w C# nie było generyków, używa `object` i dlatego może zwracać `null` jako wartość magiczną. Ale w przypadku generyków, wyjątki są używane w `Dictionary<,>` i początkowo nie miał `TryGetValue`. Podobno spostrzeżenia się zmieniają. Oczywiście dwoistość `Item`-`TryGetValue` i `Parse`-`TryParse` istnieje z jakiegoś powodu, więc zakładam, że wyrzucanie wyjątków dla niewyjątkowych niepowodzeń jest w C# 4 _not done_. Jednak metody `Try*` nie zawsze istniały, nawet jeśli istniał `Dictionary<,>.Item`.


title: Jaki jest dobry sposób na utrzymanie projektu bibliotecznego bez redundancji?

text: Jestem programistą Androida, podczas gdy rozwijam nowy projekt, często muszę zaimportować projekt biblioteczny, więc w każdym nowym projekcie muszę skopiować mój projekt biblioteczny, a następnie mogę dodać. Czy istnieje lepszy sposób na posiadanie jednej kopii mojego projektu bibliotecznego, który mogę następnie zaimportować do każdego z moich innych projektów bez ciągłego kopiowania tego samego projektu (biblioteki)? Używam BitBucket.org do hostowania mojego kodu.


title: Jaki dokument powinien opisywać wykorzystanie w projekcie biblioteki innej firmy?

text: Klient mojego pracodawcy poprosił niedawno o nowe funkcje dla starszego kodu, a ponieważ autorów programu już tu nie ma, zostałem przydzielony do wdrożenia nowych funkcji. Otrzymałem kilka dokumentów wysokiego poziomu, które pochodzą głównie z wczesnych etapów projektu: definicja projektu, procedury testowania czarnoskrzynkowego, analiza badawcza początkowej fazy projektu itd. - nic na poziomie technicznym . Kod w dużym stopniu wykorzystuje bibliotekę innej firmy (Lemur Indri) do indeksowania i pobierania zindeksowanych materiałów, ale nie ma dokumentacji, w jaki sposób korzystamy z tej biblioteki ani dlaczego została wybrana. Spędziłem dużo czasu na poznawaniu samej biblioteki i tego, jak z niej korzystamy; Czuję, że to zmarnowany czas. Podczas spotkania z moim przełożonym wspomniałem, że byłoby miło, gdyby twórcy naszego systemu napisali trochę dokumentacji na temat biblioteki i tego, jak z niej korzystamy. Powiedziałem mu, że zaoszczędziłoby mi to dużo czasu, ale nie mogłem go przekonać, że tego typu rzeczy są niezbędne. Myślę, że pisanie takiej dokumentacji pomaga przyszłym programistom opanować system i szybciej dokonywać modyfikacji. Gdyby taki dokument miał istnieć, jak by się nazywał, czy powinien znaleźć się w jednym z dokumentów projektowych?


title: Rodzaj licencji do wykorzystania wymusza zachowanie odniesienia do autorów

text: Mam małą bibliotekę open source, którą napisałem. Chcę, aby ludzie używali go, jednocześnie zmuszając ich do zachowania atrybucji autorów (dwa linijki w każdym pliku) podczas redystrybucji go lub używania w swoim projekcie. Czy licencja MIT zadziała? lub jakiego rodzaju licencji powinienem użyć


title: jak wyjaśnić nową koncepcję programistyczną?

text: W świecie IT codziennie powstają nowe, najnowsze technologie. Za każdym razem każdy programista musi się czegoś nauczyć, a następnie wyjaśnić to koncepcyjnie, aby wdrożyć. Wszystkie nowe technologie opierają się na kilku podstawowych koncepcjach. Ale te technologie mają swój własny obszar rozwoju i programista powinien uchwycić to od podstaw. Wygląda na to, że od samego początku aż do prądu. Jaki jest najlepszy i najszybszy sposób na naukę i zrozumienie nowo opracowanej technologii?


title: Czy powinienem mieć bloga, aby być lepszym programistą?

text: Przeczytałem kilka pytań o to, jak możesz czerpać korzyści z czytania blogów, ale zastanawiam się, jaki jest tak naprawdę wpływ pisania jednego. Miałem swój, ale zaniedbałem go (nie mam czasu, nie bawię się nim (a naprawdę staram się unikać rzeczy, które nie są zabawne)) i teraz jest martwy. Czy powinienem się bardziej starać? Czy mogę dalej rozwijać (kalambur) swoje umiejętności bez konieczności prowadzenia bloga?


title: Obsługa C++11 dla funkcji list wyższego rzędu

text: Większość funkcjonalnych języków programowania (np. Common Lisp, Scheme / Racket, Clojure, Haskell, Scala, Ocaml, SML) obsługuje niektóre popularne funkcje wyższego rzędu na listach, takie jak `map`, `filter`, `takeWhile`, `dropWhile` , `foldl`, `foldr` (patrz np. Common Lisp, Scheme / Racket, Clojure side-by-side arkusz referencyjny, dokumentacja Haskell, Scala, OCaml i SML.) Czy C++11 ma równoważne standardowe metody lub funkcje na listach? Rozważmy na przykład następujący fragment kodu Haskella: let xs = [1, 2, 3, 4, 5] let ys = map (\x -> x * x) xs Jak mogę wyrazić drugie wyrażenie we współczesnym standardzie C++? std::list<int> xs = ... // Zainicjuj listę w jakiś sposób. std::list<int> ys = ??? // Jak przetłumaczyć wyrażenie Haskella? A co z innymi wyżej wymienionymi funkcjami wyższego rzędu? Czy można je wyrazić bezpośrednio w C++?


title: Szkolenie starych programistów fortranu w zakresie lepszego projektowania kodu. poradnik?

text: Muszę szybko nauczyć programistów Fortran 90 projektowania zorientowanego obiektowo, dobrego kodowania i ogólnych praktyk kodowania, aby utrzymanie kodu było łatwiejsze i dostępne dla wszystkich. Ich obecny styl to zwykły: * długie procedury, które robią zbyt wiele * moduły są agregowane w „trybie rodzinnym” (procedury, które mają coś wspólnego z różnymi rodzajami obiektów, które mają wspólne zastosowanie, znajdują się w jednym module, zamiast mieć różne moduły dla różnych typów) * ogromny moduł globals z setkami zmiennych * ogólna niegreppowalność identyfikatorów To jest po prostu z mojej głowy. Zrobiłem kurs dla jednego z nich wyjaśniając OO i modularyzację w kategoriach Pen (z metodami takimi jak uncap() i elementami takimi jak inkLevel) i bardzo skutecznie odwróciłem jego punkt widzenia. Dałem mu też ćwiczenie kodowania w stylu OO bardzo prostej tekstowej przygody, w której gracz może poruszać się po pokojach. Wprowadziłem też pojęcie wzorców i antywzorców. Chciałbym poznać wszelkie wskazówki i sugestie, jak najlepiej wykonać to zadanie. Dziękuję


title: Czy grafika w domenie publicznej może być wykorzystana w oprogramowaniu komercyjnym?

text: Na przykład: http://commons.wikimedia.org/wiki/File:Epithalamus.png Czy mogę wziąć taki plik obrazu, podzielić go i użyć w aplikacji, która byłaby sprzedawana?


title: Tworzenie stron internetowych imitujących aplikacje desktopowe. Jak walczyć z tym paradygmatem?

text: Załóżmy, że istnieje firma, w której witryny/aplikacje internetowe są zaprojektowane tak, aby przypominały aplikacje komputerowe. Starają się dodać: * Ekrany powitalne * Rozwijane menu * Strony z zakładkami * Strony, które nie rosną w dół wraz z treścią, kontekst znajduje się w obszarze przewijania, więc strona ma stały rozmiar, jak gdyby przypominała ograniczenie jednego ekranu aplikacje komputerowe. * Okna modalne, wyskakujące okienka, itp. * Widoki drzew * Absolutny brak dostępu do treści, chyba że najpierw się zalogujesz, nawet w przypadku zawartości niewrażliwej. Po zniknięciu ekranu powitalnego pojawia się ekran logowania. * Brak linków - tylko symulowane przyciski. * Naprawiono rozmiar strony. * Nie można otworzyć linków w innej karcie * Przycisk drukowania, który jest drukowany bezpośrednio (nie pokazuje strony do wydrukowania, więc użytkownik nie może drukować za pomocą polecenia drukowania przeglądarki) * Paski postępu ładowania treści, nawet jeśli przeglądarka wskazuje to za pomocą własnej animacji * Czcionki i amuluj kolor aplikacji komputerowej stworzonej w Visual Basic, PowerBuilder itp. Każda aplikacja wygląda prawie tak, jakby została stworzona w Visual Basic. Odrzucają te elementy: * bułka tarta * stare, dobre, podkreślone linki * generowana/dynamiczna nawigacja, sugestie oparte na użytkowaniu * możliwość otwierania linków na wielu kartach * paginacja * strony do druku * możliwość tworzenia adresu URL, który można zapisać lub udostępnić element, na przykład gdy wysyłasz komuś link do e-specyficznego pytania StackExchange. Jedynym adresem URL jest główny. * Przycisk Wstecz Aby to osiągnąć, potrzebnych jest mnóstwo kodu javascript. Dużo, dużo kodu JavaScript i Ajax do rzeczy niezwiązanych z biznesem, ale z koniecznością ukrycia/pokazania tego przycisku, odświeżenia tej listy, wyszarzania tej etykiety itp. Złożoność generowana przez przerzucenie jednego paradygmatu na inny oznacza większość wierszy kodu są przeznaczone do utrzymania iluzji aplikacji komputerowej. Jaki jest najlepszy sposób na zmianę tego sposobu myślenia i sprawienie, by przyjęli internet i zaczęli tworzyć nowoczesne aplikacje internetowe zamiast imitacji pulpitu? EDYCJA: Te witryny są witrynami intranetowymi. Użytkownicy nienawidzą tych aplikacji. Ciągle narzekają na nie, ale muszą ich używać do codziennej pracy. Witryny te są rozwiązaniami własnymi, użytkownicy końcowi nie mają wyboru i muszą z nich korzystać. Są „zniewoloną publicznością”. Również zamiana nie nastąpi z powodu wysokich kosztów. Ale przynajmniej jeśli zmieni się ten sposób myślenia, nowe rozwiązania będą bardziej przypominać sieć.


title: Jak uniknąć lub zminimalizować użycie instrukcji sprawdzania/warunkowej w moim scenariuszu?

text: Mam scenariusz, w którym mam stream i muszę sprawdzić jakąś wartość. Jeśli otrzymam nową wartość, muszę ją zapisać w dowolnej strukturze danych. Wydaje się to bardzo proste, mogę umieścić instrukcję warunkową if-else lub użyć metody include set/map, aby sprawdzić, czy otrzymany jest nowy, czy nie. Ale problem polega na tym, że sprawdzanie wpłynie na wydajność mojej aplikacji, w strumieniu otrzymam setki za wartość w ciągu sekundy, jeśli zacznę sprawdzać każdą otrzymaną wartość, to na pewno wpłynie to na wydajność. Czy ktoś może zasugerować mi jakiś mechanizm lub algorytm, aby rozwiązać mój problem, omijając kontrole lub przynajmniej je minimalizując?


title: Dlaczego warto korzystać z usług internetowych zamiast bezpośredniego dostępu do relacyjnej bazy danych dla aplikacji na Androida?

text: Szukałem w Internecie, jak uzyskać dostęp do centralnej bazy danych w zdalnej lokalizacji i spotkałem się z sugestiami, aby korzystać z usług internetowych zamiast bezpośredniego dostępu (tj. JDBC itp.) do bazy danych. Zastanawiam się, dlaczego tak jest i wszelkie inne sugestie .


title: Jaka jest powszechna definicja hakera?

text: Zastanawiam się, czy termin Hacker oznacza różne rzeczy dla różnych ludzi. Kiedy większość ludzi słyszy słowo haker, jakie są pierwsze rzeczy, które przychodzą na myśl?


title: Używać dekoratora i fabryki razem do rozbudowy obiektów?

text: Jestem nowy w OOP i wzorcu projektowym. Mam prostą aplikację, która obsługuje generowanie tabel, kolumn (należących do tabeli), wierszy (należących do tabeli i zawierających kolumny) i wartości (należących do wierszy). Każdy z tych obiektów może mieć kolekcję Property, która z kolei jest zdefiniowana jako wyliczenie. Wszystkie są interfejsami: użyłem fabryk, aby uzyskać konkretne instancje tych produktów, w zależności od okoliczności. Teraz mam problem z rozszerzeniem tych zajęć. Powiedzmy, że potrzebuję innego produktu o nazwie „SpecialTable”, który z kolei ma pewne specjalne właściwości lub nowe metody, takie jak „getSomethingSpecial” lub rozszerzony zestaw właściwości. Jedynym sposobem jest rozszerzenie/specjalizacja wszystkich moich elementów (np. zbudowanie SpecialTableFactory, interfejsu SpecialTable i betonu SpecialTableImpl)? Co zrobić, jeśli, powiedzmy, planuję użyć standardowych metod, takich jak addRow(Column column, String name), które nie muszą być wyspecjalizowane? Nie podoba mi się pomysł dziedziczenia fabryk i interfejsów, ale ponieważ SpecialTable ma więcej metod niż Table, myślę, że nie może współdzielić tej samej fabryki. Czy się mylę? Kolejne pytanie: jeśli muszę zdefiniować właściwości produktu w czasie wykonywania (tabela, która jest aktualizowana do SpecialTable w czasie wykonywania), myślę, że powinienem użyć dekoratora. Czy można (i jak) połączyć projekt fabryczny i dekoratorski? Czy zamiast tego lepiej użyć wzorca Stan lub Strategia?


title: Czy powinienem używać wzorca projektu fabrycznego dla każdej klasy?

text: Piszę stronę internetową w PHP. W miarę jak kod staje się coraz bardziej złożony, wciąż znajduję problemy, które można rozwiązać za pomocą wzorca projektowania fabryki. Na przykład: mam klasę `Page`, która ma podklasy `HTMLPage`, `XMLPage` itd. W zależności od jakiegoś wejścia muszę zwrócić obiekt jednej z tych klas. W tym celu używam wzorca projektu fabryki. Ale ponieważ napotykam ten problem w większej liczbie klas, ciągle muszę zmieniać kod, który nadal inicjuje obiekt za pomocą jego konstruktora. Zastanawiam się więc teraz: czy dobrym pomysłem jest zmiana całego kodu tak, aby używał wzorca projektowania fabrycznego? A może są duże wady? Obecnie mogę to zmienić, więc Twoje odpowiedzi będą bardzo pomocne.


title: Jakie podstawowe zasady chciałbyś mieć w bibliotece?

text: Tam mówią o tym, jaka składnia i funkcja lubisz w języku programowania; Zapytam teraz, jakie podstawowe zasady lub funkcje chciałbyś mieć w bibliotece w swoim ulubionym (lub dowolnym) języku? Przykładem jest dodanie do listy += anotherList poprawnego w przeciwieństwie do zezwalania tylko na listę += listElement (chociaż niektórzy mogą uznać to za zły pomysł)


title: Czy istnieje czyste oddzielenie moich warstw przy tej próbie projektowania opartego na domenie w XAML i C#

text: Pracuję nad aplikacją. Używam mieszanki TDD i DDD. Ciężko pracuję, aby oddzielić warstwy mojej aplikacji i właśnie tam pojawia się moje pytanie. Moje rozwiązanie jest ułożone w następujący sposób Rozwiązanie MyApp.Domain (biblioteka klas WinRT) Jednostka (folder) Interfejsy (folder) IPost.cs (interfejs ) BlogPosts.cs (implementacja usługi IPost) (folder) Interfejsy (folder) IDataService.cs (interfejs) BlogDataService.cs (implementacja IDataService) MyApp.Presentation (aplikacja Windows 8 XAML + C#) ViewModels (folder) Aplikacja BlogViewModel.cs .xaml MainPage.xaml (zawiera właściwość BlogViewModel MyApp.Tests (projekt testowania jednostek WinRT używany dla mojego TDD) Więc planuję używać mojego ViewModel z interfejsem użytkownika XAML Piszę test i definiuję moje interfejsy w moim systemie i mam do tej pory następujący kod.[TestMethod] public void Get_Zero_Blog_Posts_From_Presentation_Layer_Returns_Empty_Collection() { IBlogViewModel viewModel = _container.Resolve<IBlogViewModel>(); viewModel.LoadBlogPosts(0); Assert.AreEqual(0, viewModel.BlogPosts.Count, "Powinno być 0 postów na blogu."); } `viewModel.BlogPosts` jest `ObservableCollection<IPost>` Teraz .. moja pierwsza myśl jest taka, że chciałbym, aby metoda LoadBlogPosts na ViewModel wywołała metodę statyczną na encji BlogPost. Mój problem polega na tym, że czuję, że muszę wstrzyknąć IDataService do obiektu Entity, aby promował luźne sprzężenie. Oto dwie opcje, z którymi mam problem: 1. Nie używaj metody statycznej i użyj metody członkowskiej na encji BlogPost. Niech BlogPost pobiera `IDataService` w konstruktorze i używa iniekcji zależności, aby rozwiązać instancję BlogPost i implementację `IDataService`. 2. Nie używaj encji do wywołania `IDataService`. Umieść `IDataService` w konstruktorze ViewModel i użyj mojego kontenera do rozwiązania `IDataService` podczas tworzenia instancji modelu widoku. Tak więc z opcją pierwszą warstwy będą wyglądać tak > ViewModel (Warstwa prezentacji) -> Entity (Warstwa domeny) -> IDataService > (Warstwa usługi) lub > ViewModel (Warstwa prezentacji) -> IDataService (Warstwa usługi)


title: Miejsca o historycznym znaczeniu w dziedzinie programowania?

text: Zawody takie jak sztuka, historia i literatura mają na swoim koncie niezliczone muzea, ale nawet zwykłe, nierozrywkowe dziedziny, takie jak transport i medycyna, mają pewne cele, które mogą zainteresować entuzjastów. A co z programowaniem? Czy są jakieś ciekawe lub historyczne miejsca, które mogłyby rozbawić ludzi zainteresowanych programowaniem?


title: Integracja obliczeniowa z regułą trapezoidalną

text: Próbuję programowo zaimplementować regułę trapezów, ale mam problem ze znalezieniem dobrego sposobu na wprowadzenie funkcji x, a następnie mam pętlę, która będzie iterować dla każdego podprzedziału, znajdując obszar trapezu i dodając wyniki i zwracając je . Każda pomoc byłaby niesamowita.


title: Jaki jest najprzyjemniejszy (najłatwiejszy dla użytkownika) sposób poinformowania użytkownika o błędzie „Odmowa dostępu”?

text: Nasze oprogramowanie implementuje warstwę zabezpieczeń opartych na rolach w celu zabezpieczenia dostępu do danych w postaci list kontroli dostępu. Za każdym razem, gdy użytkownik próbuje zrobić coś, co jest niedozwolone, warstwa oprogramowania otrzyma kod błędu lub wyjątek „odmowa dostępu”. Widząc, jak nasi klienci reagują na takie komunikaty o odmowie dostępu, a co za tym idzie, ich negatywne wrażenie na naszym oprogramowaniu, zastanawiałem się, jak zmodyfikować tę wiadomość, aby była mniej stresująca. Rozumiem, że najlepszym sposobem na zmniejszenie takiej frustracji jest po prostu ukrycie działań interfejsu użytkownika, do wykonywania których użytkownik nie jest upoważniony. Jednak nasz interfejs użytkownika jest bardzo bogaty w funkcje i nie zawsze można przewidzieć, czy działanie interfejsu użytkownika spowoduje błąd odmowy dostępu. Z punktu widzenia użytkownika byłoby miło, gdyby można mu było powiedzieć „co poszło nie tak”, tj. wyjaśnić w taki sam sposób, w jaki wyjaśniłby to ludzki administrator IT. Moje pytanie * Z punktu widzenia przyjazności dla użytkownika, jaki jest najlepszy sposób na przedstawienie wiadomości o odmowie dostępu bez obrażania lub przerażania użytkownika? * Z punktu widzenia projektowania oprogramowania, jakie metodologie projektowania można zastosować, aby zmniejszyć prawdopodobieństwo, że użytkownik zobaczy sytuację z odmową dostępu? * * * Kilka przemyśleń * Jeśli istnieje reguła bezpieczeństwa, która mówi, że komuś zabrania się przeglądania danych, wówczas: * Jeśli użytkownik ma niskie zaufanie (np. ogół społeczeństwa), nie należy podawać wyjaśnienia „odmowa dostępu” ponieważ wszelkie częściowe informacje mogą zostać wykorzystane przeciwko bezpieczeństwu. * Jeśli użytkownik ma częściowe zaufanie (np. pracownik w organizacji klienta, którego ranga nie jest wystarczająco wysoka lub pracuje w innym dziale), być może można podać użytkownikowi pewne wyjaśnienie, aby użytkownik wiedział, jaka reguła bezpieczeństwa jest egzekwowana ? * Jednak czasami niektóre ustawienia zabezpieczeń są oparte na „domyślnie odmowa”, co oznacza, że w przypadku braku reguły _udzielania_ dostępu, nikt nie ma dostępu do niczego. * W takim przypadku systemowi o wiele trudniej jest wyjaśnić użytkownikowi, dlaczego wystąpiła „odmowa dostępu”. Może to błąd konfiguracji (błąd człowieka)? Może rzeczywiście egzekwowana jest reguła bezpieczeństwa w postaci braku „reguły przyznawania dostępu”? * * * Powiązane: Metodologie zarządzania użytkownikami i dostępem?


title: Jaki jest dobry sposób na wyjaśnienie potrzeby wskazywania wskaźnika?

text: Zrozumienie, czym jest wskaźnik (adres), jest dość łatwe i jedenastolatek może to zrozumieć. Ale jak wyrazić, dlaczego potrzebujemy wskaźnika do wskaźnika? jaki jest bardzo pedagogiczny przykład? Czy obejmuje wskazanie wskaźnika na wskaźnik (i/lub dalej)? ## Przykładowy problem > T[][] nie rozpada się na T** ## Przykładowy problem 2 brainfuck polecenie odpowiednik C (Start programu) char array[30000]; char *ptr=tablica; > ++ptr; < --ptr; + ++*pkt; - --*ptr; . putchar(*ptr); , *ptr=getchar(); [ podczas (*ptr) { ] }


title: Czy termin „frontend” jest ogólnym terminem, czy jest używany tylko w projektowaniu stron internetowych?

text: Kiedy czytam o frontendach, zawsze wspomina się o stronach internetowych. Czy może być używany w różnych kontekstach, np. aplikacje komputerowe?


title: Napisana przeze mnie aplikacja jest wymieniona jako złośliwe oprogramowanie. Jak to naprawić?

text: Mam program, który napisałem w Delphi. Program jest dostępny do pobrania, ale niektóre programy antywirusowe, takie jak Norton, wykrywają go jako złośliwe oprogramowanie, podczas gdy inne programy antywirusowe, takie jak AVG, nie mają z nim żadnych problemów. Co więcej, Google Chrome wyświetla również ostrzeżenie o złośliwym oprogramowaniu, gdy chcesz pobrać program z mojej witryny. Czy jest jakiś sposób, aby temu zapobiec, poza umieszczeniem pliku EXE w pliku ZIP?


title: Skąd wzięła się koncepcja „składania faworyzowania nad dziedziczeniem”?

text: W ciągu ostatnich kilku miesięcy mantra „kompozycja faworyzowania nad dziedziczeniem” pojawiła się znikąd i stała się niemal jakimś memem w społeczności programistów. I za każdym razem, gdy to widzę, jestem trochę zdumiony. To tak, jakby ktoś powiedział „preferuj wiertarki zamiast młotów”. Z mojego doświadczenia wynika, że kompozycja i dziedziczenie to dwa różne narzędzia o różnych przypadkach użycia, a traktowanie ich tak, jakby były wymienne, a jedno było z natury lepsze od drugiego, nie ma sensu. Poza tym nigdy nie widzę prawdziwego wyjaśnienia _dlaczego_ dziedziczenie jest złe, a kompozycja jest dobra, co sprawia, że jestem bardziej podejrzliwy. Czy ma to być po prostu przyjęte na wiarę? Podstawianie Liskov i polimorfizm mają dobrze znane, wyraźne korzyści, a IMO obejmuje cały sens korzystania z programowania obiektowego i nikt nigdy nie wyjaśnia, dlaczego należy je odrzucić na rzecz kompozycji. Czy ktoś wie, skąd pochodzi ta koncepcja i jakie jest jej uzasadnienie?


title: Zapach kodu: nadużywanie dziedziczenia

text: W społeczności OO panowało powszechne przekonanie, że należy „preferować kompozycję nad dziedziczenie”. Z drugiej strony dziedziczenie zapewnia zarówno polimorfizm, jak i prosty, zwięzły sposób delegowania wszystkiego do klasy bazowej, chyba że zostanie jawnie nadpisany, a zatem jest niezwykle wygodny i użyteczny. Delegowanie może często (choć nie zawsze) być gadatliwe i kruche. Najbardziej oczywistą i najpewniejszą oznaką nadużycia dziedziczenia według IMHO jest naruszenie zasady substytucji Liskov. Jakie są inne oznaki tego, że dziedziczenie jest złym narzędziem pracy, nawet jeśli wydaje się to wygodne?


title: Ponowne użycie kodu przez dziedziczenie

text: Mam zestaw klas, które zajmują się niektórymi powiązanymi zadaniami. Te zadania mają różne wejścia i wyjścia. Powoduje to, że wykonywanie zadań za pośrednictwem współdzielonego kodu staje się niemożliwe bez posiadania tego kodu jako stosu instrukcji if-else obsługujących wszystkie różne przypadki. Teraz ktoś zrefaktoryzował ten kod, aby użyć dziedziczenia - istnieje teraz abstrakcyjna klasa bazowa, która przechowuje metody dla każdej z których jest używana przez niektóre klasy pochodne, z których niektóre są nadpisywane lub unieważniane, a niektóre z nich są zawsze wywoływane nie zawsze ma zastosowanie do klasy pochodnej. Ponadto dziedziczenie w ogóle nie jest używane do polimorfizmu, a jedynie do ponownego użycia kodu. Trochę się skuliłem, gdy zauważyłem, że ta refaktoryzacja została wykonana i że szczęśliwie przeszła przez przegląd kodu. Baza kodu, z którą pracuję, istnieje od dłuższego czasu i jest pełna tego rodzaju rzeczy, a większość ludzi nie rozumie problemów. Dlatego szukam dobrego przeglądu tego, dlaczego dziedziczenie nie powinno być nadużywane w ten sposób, szczególnie uwzględniając wszystkie problemy, które powoduje.


title: Kiedy warto korzystać z dziedziczenia?

text: Niedawno miałem mały „spór” o dziedziczenie z przyjacielem. Myślę, że ludzie często go nadużywają. Intuicja podpowiada mi, że jedynym dobrym powodem dziedziczenia klas jest polimorfizm - gdy istnieje przypadek, że chcesz traktować jednoznacznie obiekt różnych, ale powiązanych klas. Nasz argument dotyczył posiadania klasy BaseEntity dla Entity Framework, która ma tylko właściwość Id. Mój znajomy mówi, że to dobrze, bo może wtedy mieć ogólne repozytoria. Nie zgadzamy się z nim. 1. Zwykle nie ma czegoś takiego jak ogólne repozytorium, skończysz z zapachem "Refused bequest". 2. Po co traktować, powiedzmy, użytkownika i fakturę, jednoznacznie? To są dwie zupełnie różne rzeczy. Niestety nie udało mi się wysunąć żadnych dobrych uwag, mimo że „to nie ma sensu”. :) Po pewnym czasie zdałem sobie również sprawę, że odszedłem od samego dziedziczenia i teraz zamiast tego używam interfejsów. Właściwie w moim ostatnim projekcie internetowym (całkiem dużym) nie przypominam sobie żadnego dziedziczenia. Teraz nie jestem już pewien, kiedy jest to właściwa technika. Więc chłopaki, pomóżcie mi tutaj. 1. Co myślisz o tym, co napisałem? 2. Czy możesz znaleźć jakieś argumenty, których mogę użyć przeciwko mojemu przyjacielowi? 3. Kiedy naprawdę warto korzystać z dziedziczenia? (Proszę być konkretne i podać kilka przykładów) Proszę nie próbować mi wyjaśniać, o co chodzi w dziedziczeniu. Dobrze się z tym znam i często go używałem. Jak wspomniałem powyżej, z czasem po prostu od tego odszedłem, ponieważ nie mogłem znaleźć dla niego odpowiedniego zastosowania. Po prostu interfejsy wydają się być dla mnie lepszym podejściem w większości przypadków.


title: Zademonstrować klientowi zły kod?

text: Klient poprosił mnie o przeprojektowanie jego witryny internetowej, aplikacji ASP.NET Webforms opracowanej przez innego konsultanta. Wydawało się to stosunkowo prostą pracą, ale po przyjrzeniu się kodowi jasne jest, że tak nie jest. Ta aplikacja nie została dobrze napisana. W ogóle. Jest niezwykle podatny na ataki typu SQL injection, logika biznesowa jest rozproszona po całej aplikacji, występuje wiele duplikacji i ślepy zaułek kodu, który nic nie robi. Co więcej, ciągle zgłasza wyjątki, które są tłumione, więc witryna wydaje się działać płynnie. Moim zadaniem jest po prostu aktualizowanie HTML i CSS, ale większość HTML jest generowana w logice biznesowej i byłoby koszmarem do uporządkowania. Moje szacunki dotyczące przeprojektowania są dłuższe niż oczekiwał klient. Pytają, dlaczego tak długo. Jak wyjaśnić klientowi, jak zły jest ten kod? W ich mniemaniu aplikacja działa świetnie, a przeprojektowanie powinno być szybkie i jednorazowe. To moje słowo przeciwko byłemu konsultantowi. Jak mogę podać proste, konkretne przykłady, które zrozumie klient nietechniczny? **Aktualizacja** Dziękujemy za wszystkie odpowiedzi. Demonstracja ataku SQL injection ma sens i zademonstruję to w środowisku testowym. To tylko jeden z wielu problemów w tej aplikacji. Szukałem sposobów na wyjaśnienie, dlaczego inne części (takie jak html generowany w warstwie danych) musiałyby zostać zastąpione lepszymi praktykami, aby nastąpiła aktualizacja html i css. Jest tu wiele dobrych sugestii, które zsumuję podczas rozmowy z moim klientem.


title: Paski przewijania niestandardowe a natywne dla przeglądarki

text: Włączenie dostosowywalnych pasków przewijania opartych na JavaScript (i ogólnie funkcji przewijania, tj. Powiązania kontrolki z kółkiem przewijania myszy) w aplikacji internetowej może być wielką pokusą. Jednak wszystkie rozwiązania, jakie udało mi się znaleźć, zostały opracowane przez jednostki (co może oznaczać brak wsparcia formalnego lub przyszłego). Poza tym nie pamiętam żadnej witryny z głównego nurtu, która z nich korzystała. W moim konkretnym przypadku środowiska bez JavaScript lub IE6/nieparzyste przeglądarki nie mają być obsługiwane. Czy w dzisiejszych czasach należy unikać niestandardowych pasków przewijania? Jeśli nie, jaka jest najlepsza opcja do wyboru?


title: Determinizm funkcji przy użyciu PRNG w Clojure i językach funkcjonalnych

text: Trochę dziwi mnie zdanie z książki _"Programowanie w Clojure"_ (wydanie 1 [i dopiero jak to piszę!?]), strona 78: > Powinno być oczywiste, że nie da się deterministycznie przetestować > funkcja zależna od generatora liczb losowych Cóż, dla mnie to wcale nie jest oczywiste. Po pierwsze w kontekście, książka zdecydowanie mówi o PRNG (to zdanie następuje po wzmiance o _java.util.Random_ , który jest PRNG), a nie o prawdziwym losowym źródle. Widzisz, że języki funkcyjne, które obsługują funkcje wyższego rzędu, mogą być, cóż, funkcjami przekazanymi... Dlaczego po prostu nie przekazać funkcji generatora losowego do funkcji, którą chcesz deterministycznie przetestować? Jeśli mam coś takiego jak poniższa funkcja (to tylko przykład) i sam PRNG jest deterministyczny, dlaczego nie byłoby możliwe deterministyczne przetestowanie następującej funkcji: (defn shuffle-deck [deck last-generated-number prngf] . ..) Zdaję sobie sprawę, że zamiast utrzymywać (globalne?) Odniesienie do swojego losowego generatora, musisz zachować odniesienie do ostatnio wygenerowanej liczby (i odpowiednio ją zaktualizować), ale to w zasadzie to. Następnie możesz przetestować/odtworzyć zachowanie dowolnej funkcji za pomocą PRNG, o ile zdasz PRNG i 'losową liczbę, na której aktualnie się znajdujesz'. Nie różni się to od deterministycznych silników gier (takich jak Warcraft III Blizzarda), w których powtórki zawierają tylko dane wejściowe gracza, czas, w którym się wydarzyły, i ogólne zalążki PRNG. Zasadniczo jestem trochę zdezorientowany: zawsze widziałem PRNG jako coś, co nie jest „prawdziwą losowością” i mam wrażenie, że języki funkcjonalne akceptujące funkcje wyższego rzędu sprawiają, że szczególnie _łatwe_ jest odtworzenie zachowania funkcji w zależności od PRNG . Czy to zdanie książki (którą znalazłem świetną książkę przy okazji) jest kompletną bzdurą? Na pewno nie uważam tego za "oczywiste"...


title: Jakie są osobiste korzyści z napisania biblioteki boost

text: Wśród powodów, dla których programista publikuje samodzielnie napisaną bibliotekę jako bibliotekę open source, zdecydowanie jest sława. Teraz, jeśli chodzi o Biblioteki Boost, są one dostępne i promowane w bardzo anonimowej i bezosobowej formie. Nazwisko autora będzie czytelne w dokumentacji i plikach źródłowych, ale bądźmy szczerzy: Ilu z was mogłoby mi podać nazwiska autorów `boost::shared_ptr`, ... bez patrzenia? I nie chodzi tylko o nazwiska. Nawet jeśli nie znasz nazwiska autora czegoś, z czego korzystasz, nadal jakoś identyfikujesz to z „autorem” i innymi rzeczami, które zrobił, a może z jego stroną internetową, na której to znalazłeś. Wszystkie te tożsamości autorów są usuwane przez przyjęcie do Boosta. (W tym miejscu naprawdę chcę podziękować wszystkim autorom boosta za ich bezinteresowne i niezwykle profesjonalne wysiłki.) Wiem, mieli powody, ale co z następującym przypadkiem: Załóżmy, że miałem cudowne i eleganckie rozwiązanie problemu C++, to podsłuchiwało całe pokolenia programistów. Implementacja: \- zgodna ze standardem * Brak użycia makr * bezpieczny dla typów * wymaga od użytkownika napisania minimalnego możliwego kodu wzorcowego bez - powtarzam: NIE - powtarzanie kodu * zerowy ślad pamięci * BRAK narzutu na czas pracy * mieści się w nagłówku plik zawierający około 100 linii kodu. Co powinienem z tym zrobić? Czy powinienem zawracać sobie głowę uciążliwą ścieżką procesu akceptacji Boost? Jeśli tak, co tam dla mnie? Choć brzmi to samolubnie, ostatecznie wszystko, co robisz, powinno mieć pozytywny stosunek kosztów do korzyści.


title: Co należy zrobić, aby umożliwić zespołowi programistycznemu zminimalizowanie trudności w miarę dodawania nowych członków zespołu?

text: Pracuję w małej firmie Web Dev i zajmowałem się wszystkimi PHP/MySQL/etc. przez chwilę. Zamierzam ulepszyć nasze praktyki, aby umożliwić łatwiejszą współpracę w miarę rozwoju. Kilka rzeczy, które mam na myśli to: * Wdrożenie systemu wersjonowania (kontrola źródła) * Standardy kodowania dla zespołu (o ile nie jest to wymagane przez określony framework, itp.) * Wymuszanie wspólnej struktury katalogów dla naszych komputerów stacjonarnych (w celu tworzenia kopii zapasowych itp. ) * Webowa aplikacja do zarządzania zadaniami/projektami/czasami/plikami/hasłami/kontaktami i współpracy (próbowaliśmy kilka; mogę po prostu stworzyć jedną) Co bardziej doświadczeni programiści uważają za niezbędne pierwsze kroki w tej dziedzinie? Czy polecacie jakieś książki? Jedną z rzeczy do rozważenia jest to, że większość naszych codziennych zadań polega na utrzymaniu i dodawaniu drobnych funkcjonalności, a nie na nowych projektach, a wielkość zespołu będzie wynosić od 3 do 5. Właśnie znalazłem powiązane pytanie dotyczące zespołów, które będą rozwijały się od solowego programisty .


title: co to znaczy, że funkcja zagnieżdżona nie jest przypisana do zmiennej var?

text: Odnoszę się do tego linku na temat zamknięć: http://stackoverflow.com/questions/111102/how-do-javascript-closures-work To jest konkretnie o javascript. W drugiej odpowiedzi z 956 głosami Autor zwraca zagnieżdżoną funkcję "sayAlert" po przypisaniu jej do słowa kluczowego var, jak pokazano poniżej. (Przykład 3) function say667() { // Zmienna lokalna, która kończy się w obrębie zamknięcia var num = 666; var powiedzAlert = funkcja () { alert (liczba); } liczba++; powrót sayAlert; } var powiedzNumer = powiedz667(); powiedzNumer(); // alerty 667 Jednak w następnym przykładzie (przykład 4) autor przypisuje następujące funkcje "gAlertNumber", "gIncreaseNumber" i "gSetNumber" bez słowa kluczowego var. Następnie autor może wywołać zagnieżdżone funkcje w następujący sposób. function setupSomeGlobals() { // Zmienna lokalna, która kończy się w obrębie zamknięcia var num = 666; // Przechowuj referencje do funkcji jako zmienne globalne gAlertNumber = function() { alert(num); } gIncreaseNumber = funkcja() { liczba++; } gSetNumber = function(x) { liczba = x; } } setupSomeGlobals(); gZwiększLiczbę(); gAlertNumber(); // 667 gSetNumber(5); gAlertNumber(); // 5 var staryAlarm = gAlertNumber; konfiguracjaNiektóreGlobalne(); gAlertNumber(); // 666 oldAlert() // 5 Próbowałem dodać słowo kluczowe var do wywołania każdej zagnieżdżonej funkcji, ale w mojej konsoli zwraca błąd. Więc zakładam, że jest między nimi różnica. Ale nie wiem, jak nazywa się ta taktyka i dlaczego działa...


title: Jakie aspekty sprawiają, że strony ładują się szybciej?

text: Chcę wiedzieć, jakie aspekty pakietów hostingowych VPS są związane z wydajnością strony internetowej, co przyspieszy jej ładowanie dla użytkowników końcowych. A czy pamięć RAM naprawdę ma znaczenie?


title: Servlet : Użycie klasy Constants.java a parametr kontekstu

text: Zastanawiam się tylko, czy zachować niektóre z moich zmiennych w klasie Constants, czy w web.xml Powiedzmy, chcę zachować zmienną prefiksu interfejsu API wykresu Facebooka lub `api_key`, `client_id` Z mojego zrozumienia, różnica między Constants.java i web.xml to web.xml jest łatwiejszy do przepisania podczas kompilacji za pomocą ant. Możesz więc zastąpić swoje zmienne w web.xml w zależności od środowiska, dla którego tworzysz aplikację. (`client_id` różni się na przykład w zależności od środowiska programistycznego/środowiska produkcyjnego) Jeśli dobrze rozumiem, prefiks Facebook graph API powinien być przechowywany w Constants.java (ponieważ zawsze jest to „https://graph.facebook.com/” ) i `api_key`, `client_id` należy przechowywać w web.xml? Jaki jest właściwy sposób ich używania?


title: Zmienne globalne w javascript

text: Nie uważam się za wysoko wykwalifikowanego programistę JavaScript, ale pomyślałem, że jedno mam rację: nie twórz zmiennych globalnych, chyba że naprawdę musisz. Ostatnio uczyłem się `angularjs` i odkryłem jedną dziwną rzecz, prawie wszędzie w przykładach kodu dla angular można znaleźć konstrukcje takie jak poniżej. „użyj ściśle”; /* Kontrolery */ var phonecatControllers = angular.module('phonecatControllers', []); phonecatControllers.controller('PhoneListCtrl', ['$scope', 'Phone', function($scope, Phone) { $scope.phones = Phone.query(); $scope.orderProp = 'wiek'; }]); Źródło: oficjalna przykładowa aplikacja https://github.com/angular/angular-phonecat/blob/master/app/js/controllers.js Założyłem więc, że czegoś brakuje/nie rozumiem. Jakieś myśli oprócz „skoro to kod demo, to ich to nie obchodzi”?


title: Podział klas i metod na mniejsze jednostki

text: Podczas przeglądów kodu kilku deweloperów poleciło mi podzielić moje metody na mniejsze metody. Ich uzasadnieniem była (1) zwiększona czytelność oraz (2) ślad wsteczny, który wraca z produkcji, pokazujący, że nazwa metody jest bardziej specyficzna dla wiersza kodu, który się nie powiódł. Być może pojawiło się też kilka barwnych słów o programowaniu funkcjonalnym. Dodatkowo wydaje mi się, że jakiś czas temu oblałem rozmowę kwalifikacyjną, ponieważ nie udzieliłem akceptowalnej odpowiedzi na temat tego, kiedy coś zerwać. Mam skłonność do tego, że kiedy widzę kilka metod w klasie lub w wielu plikach, nie jest dla mnie jasne, w jaki sposób łączą się one ze sobą i ile razy każda z nich jest wywoływana. Naprawdę nie mam dobrego wyczucia liniowości tak szybko, gdy tylko przyjrzymy się temu. Inną rzeczą jest to, że wiele osób wydaje się przedkładać organizację nad treść (np. „Spójrz, jak zorganizowana jest moja szuflada na skarpetki!” Ja: „Ogólnie rzecz biorąc, myślę, że mogę szybciej dotrzeć do moich skarpet, jeśli policzysz czas zajęło się ich zorganizowaniem”). Nasze wymagania biznesowe nie są zbyt stabilne. Obawiam się, że jeśli klasy/metody są bardzo szczegółowe, refaktoryzacja do zmian wymagań zajmie więcej czasu. Nie jestem pewien, jaki to powinien mieć znaczenie. W każdym razie informatyka jest po części sztuką/po części nauką, ale nie jestem pewien, na ile odnosi się to do tego zagadnienia. EDYCJA: Sprawdź: Jaka jest idealna długość metody?


title: Jaki byłby dobry sposób, aby poprosić o komentarze?

text: W projekcie/zespole, nad którym pracuję, częstotliwość komentarzy jest trochę niska. Jednym z powodów może być to, że dla długoletnich deweloperów nie jest jasne, które wiersze w kodzie _naprawdę_ wymagają komentarza (każda część projektu ma całkiem stałych deweloperów). Aby to zwiększyć, planujemy umożliwić członkom zespołu przejrzenie kodu i zaewidencjonowanie „prośby o komentarze”, które główny twórca tej części powinien zastąpić przydatnymi komentarzami. * Czy myślisz, że to może zadziałać? * Jeśli „tak”: jakich tagów użyć do oznaczenia? (np. //TODO proszę o komentarz) * Czy możesz wymyślić alternatywy dla tego procesu? Edycja: doceniam Twoje odpowiedzi na temat najlepszych praktyk w komentowaniu i pisaniu kodu i całkowicie się zgadzam. Ale moje pytanie dotyczy przypadków, w których refaktoryzacja nie wchodzi w grę (nie chce zmieniać działającego kodu, nie chce „oskarżać” głównego dewelopera o produkcję kodu, który wymaga refaktoryzacji,...) - więc tylko więcej lub lepsze komentarze są opcją ( przynajmniej na to pytanie).


title: Jakiej wydajności możemy oczekiwać od funkcji c_str() std::string? Zawsze stały czas?

text: Ostatnio robię potrzebne optymalizacje. Jedną z rzeczy, które robiłem, jest zmiana niektórych strumieni ostringowych -> sprintfs. Sprintfuję kilka std::strings do tablicy w stylu c, ala char foo[500]; sprintf(foo, "%s+%s", str1.c_str(), str2.c_str()); Okazuje się, że implementacja Microsoft std::string::c_str() działa w stałym czasie (zwraca tylko wewnętrzny wskaźnik). Wygląda na to, że libstdc++ robi to samo. Zdaję sobie sprawę, że std nie daje żadnych gwarancji dla c_str, ale trudno wyobrazić sobie inny sposób na zrobienie tego. Jeśli, na przykład, skopiowali do pamięci, musieliby przydzielić pamięć na bufor (pozostawiając ją wywołującemu, aby ją zniszczył -- NIE jest częścią umowy STL) LUB musieliby skopiować do wewnętrznego statycznego bufor (prawdopodobnie nie jest bezpieczny wątkowo i nie masz gwarancji na jego żywotność). Tak więc zwykłe zwrócenie wskaźnika do wewnętrznie obsługiwanego łańcucha zakończonego znakiem NULL wydaje się być jedynym realistycznym rozwiązaniem.


title: Jak mam obsługiwać rejestrowanie pomiarów w moim silniku symulacji zdarzeń dyskretnych?

text: Próbuję zbudować bibliotekę symulacji zdarzeń dyskretnych, postępując zgodnie z tym samouczkiem i dopracowując go. **_Jak mam obsłużyć metryki rejestrowania w moim silniku symulacji zdarzeń dyskretnych?_** Jeśli nie chcesz/nie potrzebujesz tła, przejdź do sekcji _Projekt_ lub _Pytanie_ poniżej... **Symulacja** Cel symulacji tego typu jest modelowanie procesu w celu przeprowadzenia jego analizy, która nie byłaby możliwa lub przynajmniej wykonalna w rzeczywistości. Weźmy kanoniczny przykład symulacji tego rodzaju to Bank: * Klienci wchodzą do banku i ustawiają się w linii ze statystycznie rozłożoną częstotliwością * Kasjerzy są dostępni do obsługi klientów z przodu linii pojedynczo z określonym rozkładem * W miarę jak linia się wydłuża, liczba dostępnych kasjerów może być zwiększana w oparciu o pewne reguły biznesowe. Możesz podzielić to na ogólne obiekty: * Entity: To byliby klienci * Generator: Ten obiekt generuje encje zgodnie z rozkładem * Kolejka: Ten obiekt reprezentuje linię w banku. Znajdują wiele zastosowań w świecie rzeczywistym, działając jako bufor między klientami i ograniczoną usługą. * Aktywność: Jest to reprezentacja pracy wykonywanej przez kasjera. Na ogół przetwarza jednostki z kolejki **Symulacja zdarzeń dyskretnych** Zamiast ciągłej symulacji tyk za kleszczem, jak w przypadku systemów fizycznych, symulacja „dyskretnego zdarzenia” jest rozpoznaniem, że w wielu systemach tylko krytyczne zdarzenia wymagają procesu i przez resztę czasu nie dzieje się nic ważnego dla stanu systemu. W przypadku Banku zdarzeniami krytycznymi mogą być: wejście klienta na linię, dostępność kasjera, decyzja kierownika o otwarciu nowego okna kasjera itp. W symulacji zdarzeń dyskretnych przepływ czasu jest utrzymywany przez utrzymywanie Priorytetowej Kolejki Zdarzeń zamiast jawnego zegara. Czas jest zwiększany przez usunięcie następnego zdarzenia w porządku chronologicznym (minimalny czas zdarzenia) z kolejki i przetwarzanie w razie potrzeby. **Projekt** Na razie mam zaimplementowaną kolejkę priorytetową jako Min Heap. Aby obiekty symulacji były przetwarzane jako zdarzenia, implementują interfejs ISimulationEvent, który udostępnia właściwość EventTime i metodę Execute. Oznacza to, że kolejka priorytetowa może zaplanować zdarzenia, a następnie wykonać je pojedynczo we właściwej kolejności i odpowiednio zwiększyć zegar symulacji. Silnik symulacji to podstawowa pętla zdarzeń, która wyskakuje następne zdarzenie i wykonuje je, dopóki nie zostanie żadne. Zdarzenie może przełożyć się na ponowne wystąpienie lub pozwolić sobie na bezczynność. Na przykład, gdy Generator jest wykonywany, tworzy jednostkę, a następnie zmienia harmonogram w celu wygenerowania następnego podmiotu w pewnym momencie w przyszłości. **Pytanie** _Jak mam obsługiwać metryki rejestrowania w moim silniku symulacji zdarzeń dyskretnych?_ W trakcie tej symulacji konieczne jest pobranie metryk. Jak długo Jednostki czekają w Kolejce? Ile zasobów Aktywności jest wykorzystywanych w dowolnym momencie? Ile encji zostało wygenerowanych od czasu zarejestrowania ostatnich metryk? Logicznie wynika, że rejestrowanie metryk powinno być zaplanowane jako zdarzenie, które odbywa się co kilka jednostek czasu w symulacji. Trudność polega na tym, że kończy się to problemem przekrojowym: może być konieczne pobranie wskaźników generatorów, kolejek lub działań, a nawet encji. Należy również wziąć pod uwagę, że może być konieczne zastosowanie metryk obliczanych na podstawie pochodnej: np. zmierzyć a, b, c oraz ((a-c)/100) + log(b). Myślę, że jest kilka głównych dróg: 1. Mieć pojedynczy, globalny obiekt Stats, który jest świadomy wszystkich obiektów symulacji. Niech obiekty Generator/Queue/Activity/Entity przechowują swoje właściwości w tablicy asocjacyjnej, aby można było się do nich odwoływać w czasie wykonywania (mój wybrany język nie obsługuje odbicia). W ten sposób statystyki mogą być dołączone w razie potrzeby `Stats.AddStats(Object, Properties)`. To nie obsługuje łatwo obliczanych metryk, chyba że są one w jakiś sposób wbudowane w każdą klasę obiektów jako właściwości. 2. Mieć pojedynczy, globalny obiekt Stats, który jest świadomy wszystkich obiektów symulacji. Utwórz interfejs ISimStats dla klas Generator/Queue/Activity/Entity do zaimplementowania, który zwraca tablicę asocjacyjną ważnych statystyk dla tego konkretnego obiektu. Umożliwiłoby to również załączenie środowiska wykonawczego `Stats.AddStats(ISimStats)`. Obliczone metryki musiałyby być zakodowane na stałe w prostej implementacji tej opcji. 3. Mieć wiele obiektów statystyk, jeden na generator/kolejkę/aktywność/jednostkę jako obiekt podrzędny. Może to ułatwić implementację metryk obliczeniowych specyficznych dla obiektu symulacji, ale trochę zapycha kolejkę priorytetów dodatkowymi rzeczami do zaplanowania. Może to również spowodować mocniejsze połączenie, co jest złe :(. 4. Jakaś kombinacja powyższych lub zupełnie inne rozwiązanie, o którym nie pomyślałem? Daj mi znać, czy mogę podać więcej (lub mniej) szczegółów, aby wyjaśnić moje pytanie! może być w błędzie, używając tagu Aspect-Oriented, ale podejrzewam, że ludzie z tego środowiska mieliby dobrą radę w tej sytuacji.


title: Poprawianie błędu pisowni w nazwie metody

text: Jedną z metod, których często używam w naszej bazie kodu, jest błędna pisownia (i wyprzedziła mnie). To naprawdę mnie irytuje nie tylko dlatego, że jest błędnie napisane, ale co ważniejsze, sprawia, że ZAWSZE pomylę nazwę za pierwszym razem, gdy ją wpisuję (a potem muszę pamiętać „Och, racja, powinna być błędnie napisana…”) Wprowadzam kilka zmian wokół oryginalnej metody. Czy powinienem skorzystać z okazji, aby po prostu zmienić nazwę tej cholernej metody?


title: Dobre książki do nauki przetwarzania rozproszonego

text: Czy są jakieś dobre książki do nauki o przetwarzaniu rozproszonym? Pracuję nad aplikacjami Java na dużą skalę. Ostatnio moi koledzy zaczęli rozmawiać o takich rzeczach jak rozproszona pamięć podręczna, równoważenie obciążenia, BigMemory (rzecz z terakoty), przetwarzanie równoległe itp. Czy jest jakaś dobra książka, która wprowadza do tych pojęć.


title: Ograniczanie typów obiektów, które można dodawać do siebie za pomocą wzorca złożonego

text: **_Sytuacja** :_ Buduję niestandardowe ramy aplikacji PHP. Zaimplementowałem wzorzec złożony, dzięki czemu mogę zbudować drzewo obiektów reprezentujące stronę, która ma być renderowana. Przykład: klasa abstrakcyjna \Block\BlockAbstract { protected _blocks = array(); funkcja publiczna __construct($properties); funkcja publiczna getBlocks(); funkcja publiczna addBlock($blok); ... funkcja publiczna render(); } Wszystkie moje obiekty "blokowe" dziedziczą po tej klasie abstrakcyjnej, która działa świetnie, a renderowanie było bardzo proste z pomocą małej rekurencji. **_Problem** :_ Potrzebuję sposobu na sprawdzenie, jakie klasy bloków można dodać do innych bloków. Na przykład mam 4 różne typy bloków, które muszę wziąć pod uwagę. Należy pamiętać, że WSZYSTKIE bloki dziedziczą z pojedynczego abstraktu bloku, są to klasyfikacje zachowania konkretnych klas, których nie należy mylić z dodatkowymi abstraktami: * Generic - Generic może mieć dodany dowolny inny typ bloku * Final - Nie może mieć wszelkie dodane do niego bloki podrzędne. * Rodzic — blok nadrzędny, do którego można dodać tylko określony typ dziecka, ale można go dodać do dowolnego Ogólnego * Dziecko — można dodać tylko do określonego rodzica. Ten blok może również dzielić właściwości Ogólnego, Nadrzędnego lub Końcowego **Podsumowując cel:** Mając nazwę klasy konkretnego bloku, wygeneruj listę wszystkich klas konkretnego bloku, które można do niego dodać. **_Rozwiązania zaproponowane do tej pory** :_ _Dodaj właściwość o nazwie „blockClassification” do streszczenia bloku, która definiuje go jako ogólny, końcowy, nadrzędny lub podrzędny, a następnie zakoduj logikę na stałe w funkcji sprawdzania poprawności, która jest wywoływana w module addBlock ($block) method._ Nie podoba mi się to rozwiązanie z wielu powodów, ale głównie nadal nie daje mi jasnej ścieżki do zdefiniowania, jacy konkretni rodzice i dzieci mogą być dozwolone. Na przykład mam konkretną klasę _\Block\Tabs_, która jest rodzicem. Można do niego dodać tylko bloki _\Block\Tabs\Panel_, a _\Block\Tabs\Panel_ można dodać tylko do _\Block\Tabs_. Aby zbudować te relacje, należałoby dodać dodatkowe właściwości, a te właściwości można by zbadać w celu uzyskania „klasyfikacji blokowej”, co czyni to podejście niepraktycznym. _Dodaj właściwość allowChildTypes do bloku definiującego listę konkretnych klas, które można dodać. Dla ułatwienia użytkowania 2 wartości mają określone znaczenie, * reprezentujący wszystkie typy bloków i wartość NULL, która oznacza, że nie można dodać żadnych bloków. We wszystkich innych przypadkach dostarczany jest ciąg nazw klas oddzielonych przecinkami i dozwolone są tylko te klasy lub klasy, które po nich dziedziczą_ Skłaniam się w tym kierunku, ponieważ PHP daje mi operator InstaceOf. Mogę użyć tego do sprawdzenia, kiedy mam nowe konkretne klasy, które rozszerzają zestaw bazowy, to sprawdzenie zwróci te same wyniki, co jego klasa nadrzędna. Moje jedyne wahanie polega na tym, że chociaż ta metoda zdecydowanie rozwiązuje problem „Podając nazwę klasy konkretnego bloku, wygeneruj listę”, czuję, że ogranicza mnie w przyszłości, ponieważ mogę wyszukiwać tylko w dół drzewa, a nie wstecz w górę. Tj. „Mając nazwę klasy bloku podrzędnego, wygeneruj listę bloków nadrzędnych, do których można ją dodać” Jestem pewien, że nie tylko ja napotkałem ten problem, więc moje pytanie do mas brzmi: co jest najlepsze sposób podejścia/rozwiązania tego problemu? **Dodatkowe informacje:** Jeśli zastanawiasz się, jak w pierwszej kolejności otrzymuję listę wszystkich klas, framework implementuje PSR-0, więc skanuję drzewo katalogów, aby uzyskać wszystkie nazwy klas, a następnie dynamicznie tworzenie ich instancji. $allClassNames = scanDirectories(); // Zwraca tablicę ciągów np: array('\Block\Classname1','\Block\Classname2'); foreach($allClassNames as $className){ $object = new $className(); }


title: Projektowanie zorientowane obiektowo na małą grę Java

text: ![tutaj podaj opis obrazu](http://i.stack.imgur.com/VBqAi.png) To jest problem, z którym mam do czynienia. Muszę zrobić prostą grę NIM. Uczę się javy przy użyciu książki, do tej pory mam tylko zakodowane programy, które zajmują się 2 klasami. Ten program miałby około 4 klas, w tym klasę główną. Mój problem polega na tym, że mam trudności z projektowaniem klas, jak będą ze sobą współdziałać. Naprawdę chcę myśleć i używać podejścia obiektowego. Więc pierwszą rzeczą, którą zrobiłem, było zaprojektowanie Pile CLASS, ponieważ wydawało mi się to najłatwiejsze i najbardziej sensowne pod względem stosowanych w nim metod. Oto, co mam do tej pory w klasie Pile. pakiet Nim; import java.util.Losowo; public class Pile { private int InitialSize; public Pile(){ } Random rand = new Random(); public void setPile(){ InitialSize = (rand.nextInt(100-10)+10); } public void zmniejszyćPile(int x){RozmiarPoczątkowy =RozmiarPoczątkowy - x; } public int getPile(){ return rozmiar początkowy; } public boolean hasStick(){ if(initialSize>0){ return true; } else { return false; } } } Teraz potrzebuję pomocy w projektowaniu klasy Player. Mam na myśli to, że nie proszę nikogo o napisanie kodu dla mnie, ponieważ jest to sprzeczne z celem uczenia się. Po prostu zastanawiałem się, jak zaprojektować klasę odtwarzacza i co by się z nią działo. Domyślam się, że klasa gracza zawierałaby metodę wyboru ruchu dla komputera, a także otrzymywanie ruchu wykonanego przez użytkownika. Wreszcie, zgaduję, że w klasie Game zgaduję, że tury będą obsługiwane. Jestem teraz naprawdę zagubiony, więc zastanawiałem się, czy ktoś może mi pomóc przemyśleć ten problem, byłoby wspaniale. Przydałoby się zacząć od klasy gracza. Wiem, że istnieje kilka rozwiązań tego problemu w Internecie, ale odmawiam patrzenia, ponieważ chcę opracować własne podejście do takich problemów i jestem pewien, że jeśli uda mi się rozwiązać ten problem, mogę rozwiązać inne problemy. Przepraszam, jeśli to pytanie jest trochę ubogie, ale konkretnie potrzebuję pomocy w zaprojektowaniu klasy Player.


title: Jak odejść od szkoły myślenia „for-loop”?

text: To raczej pytanie koncepcyjne, ale miałem nadzieję, że uda mi się uzyskać dobrą radę w tej sprawie. Wiele z programowania, które wykonuję, opiera się na tablicach (NumPy); Często muszę dopasowywać elementy w dwóch lub więcej tablicach o różnych rozmiarach, a pierwszą rzeczą, do której przechodzę, jest pętla for lub, co gorsza, zagnieżdżona pętla for. Chcę jak najbardziej unikać pętli for, ponieważ są one powolne (przynajmniej w Pythonie). Wiem, że w przypadku wielu rzeczy związanych z NumPy istnieją predefiniowane polecenia, które po prostu muszę zbadać, ale czy wy (jako bardziej doświadczeni programiści) macie **ogólny proces myślowy, który przychodzi do głowy, gdy trzeba coś powtórzyć? ** Więc często mam coś takiego, co jest okropne i chcę tego uniknąć: mała_tablica = np.array(["jeden", "dwa"]) duża_tablica = np.array(["jeden", "dwa" , "trzy", "jeden"]) for i in range(len(small_array)): for p in range(len(big_array)): if small_array[i] == big_array[p]: print "Ta pozycja jest dopasowana : ", small_array[i] Wiem, że jest wiele różnych sposobów, aby to osiągnąć w szczególności, ale interesuje mnie ogólna metoda myślenia, jeśli taka istnieje.


title: Na jakim etapie kompilacji "typedef" jest rozwiązywany przez kompilator?

text: Istnieją różne etapy kompilacji, takie jak * Etap przetwarzania wstępnego * Analiza składni * Analiza semantyczna * Generowanie kodu pośredniego * Generowanie kodu maszynowego * Optymalizacja * Łączenie Moje pytanie dotyczy tego, na którym etapie kompilacji _"typedef"_ jest rozwiązywany.


title: Wejście do programu bez argumentów wiersza poleceń

text: Załóżmy, że nie ma argumentów wiersza poleceń. Jak przekazujesz dane wejściowe do programu? Myślę, że napisałbyś dane wejściowe do pliku o określonej nazwie, tak aby program wiedział, że ma go otworzyć i odczytać jako dane wejściowe. Jak jednak odkryć nazwę tego pliku? Zwykle uruchomienie programu wiersza poleceń bez argumentów lub z jakimś standardowym argumentem pomocy (np. `\?`) daje jakąś instrukcję, jak go używać. Ale w środowisku bez argumentów wiersza poleceń, jak można odkryć, jak obsługiwać program?


title: Usługa systemu Windows czy Harmonogram zadań systemu Windows?

text: Planuję stworzyć narzędzie, które będzie przeszukiwać bazę danych i przechowywać niektóre informacje (w innej tabeli w bazie danych). Jest to narzędzie wielowątkowe i wymaga uruchomienia co 5 lub 10 minut/później może być trzy razy dziennie. Widzę dwie możliwości osiągnięcia tego w programowaniu C#/DotNet. * tworzenie serwisu Windows z wbudowanym zegarem. * program konsoli i zaplanuj go za pomocą harmonogramu zadań systemu Windows. Który wolisz i dlaczego?


title: Czy istnieją dowody na to, że programiści pracujący zdalnie są mniej wydajni niż podczas pracy na miejscu?

text: Rozmawiałem więc kilka dni temu z jednym z ludzi, z którymi tu pracuję, i narzekali, że ich firma nie pozwala już pracownikom na pracę zdalną ze względu na spadek wydajności. Jako ktoś, kto usłyszał tę wymówkę, aby uzasadnić zatrudnianie tylko na miejscu w moich poszukiwaniach odległych możliwości, zastanawiam się, czy istnieją jakiekolwiek dowody empiryczne, które to potwierdzają, czy też mi i innym, których znam w branży, opowiada się historię .


title: Jakie jest najlepsze podejście do projektowania bazy danych z dużą ilością kolumn?

text: Piszę aplikację finansową opartą na zapytaniach. Pozwala użytkownikowi pisać skomplikowane równania (podobnie jak część zapytania SQL WHERE) i znajdować firmy spełniające te kryteria. W przypadku powyższego mam obecnie ponad 500 kolumn w tabeli bazy danych (każda kolumna reprezentuje pole finansowe). Przykładowe kolumny to: nazwa_firmy, sprzedaż_roczna_00, sprzedaż_roczna_01, sprzedaż_roczna_02, sprzedaż_roczna_03, sprzedaż_roczna_04, zysk_roczna_00, zysk_roczna1...(ponad 500 takich kolumn). Liczba wierszy to około 5000. Idąc dalej, chciałbym jeszcze bardziej zwiększyć liczbę kolumn/pól-finansowych. W przypadku powyższego chciałbym uzyskać pomoc w zakresie: 1) Jakie jest najlepsze podejście do projektowania baz danych? Czy można mieć tak wiele kolumn? 2) Jak można to znormalizować? (Użytkownik może użyć dowolnego z tych pól w kryteriach wyszukiwania). 3) Czy można trzymać się MySQL, czy też nowoczesne bazy danych oparte na dokumentach, takie jak MongoDB, powinny być do tego lepsze? PS (Aktualizacja): Używam MySQL do tej pory, a bieżący przykład użycia znajduje się pod adresem: http://screener.in/companies/89/Formula-- Powyżej znajduje się około 500 pól/kolumn do utworzenia zapytania, jednak staram się zwiększyć tę liczbę do znacznie większej w przyszłości.


title: Dodatkowa klasa do zapisywania danych do jakiegoś backendu?

text: Jaka jest powszechna praktyka pisania klas, które pobierają pewną klasę danych i przechowują ją w jakimś zapleczu? W moim przypadku mam klasy tabeli (kolumny, nagłówki itp.), które są zapisywane w Excelu. Mam więc klasę Table z danymi i klasę ExcelDocument z operacjami dostępu i podstawowym zapisem (komórki, ...). Gdzie umieściłbym kod, który wie, jak radzić sobie z danymi tabeli i wie, jak napisać, że ExcelDocument? Oba mogą w pewnym momencie podlegać refaktoryzacji. Czy używam `Table.write_to_excel(excel)` lub `ExcelDocument.write_table(table)` czy nawet potrzebuję klasy pośredniej? Z koncepcją "klasa powinna służyć tylko jednemu celowi" najprawdopodobniej napisałbym klasę pośrednią?


title: Logika raportowania a logika domeny

text: Czy logika raportowania służąca do wyodrębniania danych domeny w określonym formacie powinna znajdować się w obiektach domeny czy oddzielnych obiektach raportowania? Logika raportowania musi: 1. wybrać podmioty/dane, które spełniają kryteria wyboru, np. zakres dat 2. zastosować zasady walidacji danych np. zakres dat, wartości graniczne, braki danych Reguły będą się różnić w zależności od typu obiektu domeny, tj. określony obiekt domeny będzie wymagał dodatkowych reguł lub innej logiki walidacji reguł. W zależności od obiektu domeny liczba pól w danych wyjściowych może się różnić. Projekt rozwiązania 1. Czy powinna istnieć równoległa hierarchia między klasami raportowania a klasami domeny? 2. Klasy raportujące będą współdziałać z klasami domeny za pośrednictwem interfejsu klas domeny 3. Obiekt kontekstu byłby potrzebny do utworzenia obiektów walidatora specyficznych dla obiektu domeny, tak aby generator raportów mógł mieć ogólną logikę Czy to wygląda na dobre podejście, czy podchodzę do niego niepoprawnie ? ![Diagram klas](http://i.stack.imgur.com/QrCSY.png)


title: Jak przekonać kierownictwo do uczynienia naszego projektu open source?

text: Platforma Xamarin 3 została wydana w zeszłym tygodniu z doskonałym nowym dodatkiem: Xamarin.Forms . To zwróciło naszą uwagę, ponieważ używamy takiego systemu już od kilku lat. Opracowaliśmy go sami i wykorzystaliśmy go w kilku projektach. Szukaliśmy sposobu, aby ten projekt był open source, ale nie udało nam się przekonać kierownictwa. Uważają, że nie powinniśmy robić z tego oprogramowania open source, ponieważ nic z nim nie wygramy, a wszystko, co się stanie, to to, że konkurencja będzie mogła szybciej budować aplikacje z naszą biblioteką. Wierzymy, że otwarte pozyskiwanie naszej biblioteki sprawi, że świat stanie się lepszym miejscem, a nasza biblioteka stanie się znacznie bardziej stabilna i kompletna. Więc moje pytanie do was wszystkich ludzi: jak możemy przekonać kierownictwo do otwarcia naszej biblioteki?


title: Czy .NETs Observer<T> był przeznaczony do subskrybowania wielu obiektów obserwowalnych?

text: W .NET istnieją interfejsy IObservable i IObserver (także tutaj i tutaj). Co ciekawe, konkretna implementacja IObserver nie ma bezpośredniego odniesienia do IObservable. Nie wie, kogo subskrybuje. Może wywołać tylko rezygnującego z subskrypcji. „Proszę wyciągnąć pinezkę, aby anulować subskrypcję”. **edit:** Wypisujący się implementuje `IDisposable`. Myślę, że ten schemat został zastosowany, aby zapobiec problemowi wygasłego słuchacza. Jednak dwie rzeczy nie są dla mnie do końca jasne. 1. Czy wewnętrzna klasa Unsubscriber zapewnia zachowanie typu „zapisz się i zapomnij”? Kto (i kiedy dokładnie) wywołuje `IDisposable.Dispose()` na Unsubscriber? Garbage collector (GC) nie jest deterministyczny. [Zastrzeżenie: ogólnie spędziłem więcej czasu z C i C++ niż z C# .] 2. Co powinno się stać, jeśli chcę zasubskrybować obserwatora K do obserwowalnego L1, a obserwator jest już zasubskrybowany do innego obserwowalnego L2? K.Subskrybuj(L1); K.Subskrybuj(L2); K.Anuluj subskrypcję(); L1.Obserwacja publikacji (1003); L2.PublikujObserwację(1004); Kiedy uruchomiłem ten kod testowy na przykładzie MSDN, obserwator pozostał zasubskrybowany do L1. Byłoby to osobliwe w prawdziwym rozwoju. Potencjalnie istnieją 3 sposoby, aby to poprawić: * Jeśli obserwator ma już instancję wypisującą subskrypcję (tj. Jest już zasubskrybowana), po cichu wypisuje się z pierwotnego dostawcy przed subskrybowaniem nowego. Takie podejście ukrywa fakt, że nie jest już subskrybowany u pierwotnego dostawcy, co może później stać się niespodzianką. * Jeśli obserwator ma już instancję wypisującą subskrypcję, zostanie zgłoszony wyjątek. Dobrze zachowujący się kod wywołujący musi jawnie anulować subskrypcję obserwatora. * Observer subskrybuje wielu dostawców. To najbardziej intrygująca opcja, ale czy można ją zaimplementować za pomocą IObservable i IObserver? Zobaczmy. Obserwator może zachować listę obiektów wypisujących się z subskrypcji: po jednym dla każdego źródła. Niestety, `IObserver.OnComplete()` nie zapewnia odwołania do dostawcy, który je wysłał. Tak więc implementacja IObserver z wieloma dostawcami nie byłaby w stanie określić, z którego z nich zrezygnować. 3. Czy IObserver .NET był przeznaczony do subskrybowania wielu IObservables? Czy podręcznikowa definicja wzorca obserwatora wymaga, aby jeden obserwator mógł subskrybować wielu dostawców? Czy jest to opcjonalne i zależne od implementacji?


title: Utwórz bazę danych w celu dopasowania danych w porównaniu z dopasowaniem danych do bazy danych

text: Jestem nowicjuszem w programowaniu i chciałbym wiedzieć, co ludzie uznali za najbardziej akceptowalną opcję, a raczej, co ludzie uważają za bardziej zrozumiałe. Jestem jedyną osobą, która pisze kod w mojej firmie, ale stopniowo przekażę to komuś innemu w przyszłości. **Projekt** Projekt, nad którym pracuję, analizuje ogromny plik tekstowy, który pojawia się raz dziennie. Plik danych wykorzystuje plik danych z poprzedniego dnia jako odniesienie, więc każdy plik danych opiera się na poprzednim pliku danych. Korzystając z dokumentacji jestem w stanie przeanalizować plik tekstowy i zapełnić bazę danych MySQL. Po odczytaniu pliku tekstowego dane w bazie danych są manipulowane, a następnie zrzucane do wielu skoroszytów programu Excel. Plik tekstowy zawiera ogromną ilość danych i potrzebuję tylko ich ułamka do skoroszytów programu Excel. **Moje pytanie** Moje pytanie brzmi: jaka jest właściwa struktura tego programu? Widzę, że mam dwie opcje. 1. Czy lepiej jest zbudować bazę danych, która pasuje do danych. Więc stwórz bazę danych z większą liczbą tabel i pól, niż jest to rzeczywiście potrzebne i prawdopodobnie trochę zagadkową w jej układzie. 2. Czy lepiej jest manipulować danymi podczas ich analizowania i umieszczać je w bardziej czytelnej, ludzkiej bazie danych? **Co zrobiłem do tej pory** Kiedy pisałem pierwszą wersję tego programu, wybrałem opcję 2. Ponieważ nie wiedziałem wtedy zbyt wiele o relacyjnych bazach danych i chciałem, aby było to dla mnie łatwe do zrozumienia, wizualizować itp. Jednak teraz, gdy chcę rozszerzyć dane, które analizuję z pliku tekstowego, a ponieważ każdy plik danych opiera się na pliku danych z poprzedniego dnia, skłaniam się ku opcji 1, więc później w dół linii nie musi spędzić dnia na rekonstrukcji bazy danych. Czy to ma sens? Proszę o komentarz, jeśli nie. Każda pomoc byłaby bardzo mile widziana. dzięki, Justin **Aktualizacja** Zacznę od stwierdzenia, że dotychczasowe odpowiedzi były bardzo pomocne. Dziękuję Ci. Po przeczytaniu kilku komentarzy stwierdzam, że moje pytanie było trochę niejasne. Postaram się być nieco jaśniejszy. Zajmuję się danymi finansowymi klientów. Każde konto ma własny skoroszyt programu Excel, który jest używany przez doradców finansowych do tworzenia prognoz i decyzji inwestycyjnych. Dodatkowe arkusze w skoroszycie służą do wyświetlania klientowi zasobów konta i przewidywanej przyszłości. Dane, które otrzymuję w każdym pliku danych, są oddzielone rekordem. Każdy rekord ma swój typ... jest około 13 różnych typów rekordów. Każdy typ rekordu jest oznaczony konkretną literą lub cyfrą. Następnie po tej literze lub cyfrze jest określona liczba znaków reprezentujących ten konkretny rekord. Układ rekordów różni się w zależności od typu rekordu, a między typami rekordów występują nadmiarowe informacje, co dodatkowo pogarsza sytuację. Inną kwestią sporną jest to, że jeśli doradca finansowy kupi nowy papier wartościowy, którego nie kupił przed upływem następnego dnia roboczego, tylko w pliku danych z tego dnia pojawią się informacje o zabezpieczeniach (takie jak nazwa, typ zabezpieczenia itp.), a nie ponownie, chyba że nastąpi zmiana w tym zabezpieczeniu. Więc jeśli kiedykolwiek będę musiał przebudować bazę danych, musiałbym zacząć od pierwszego dnia. Więc biorę ten plik danych, parsuję go i zapisuję w bazie danych MySQL, podzielonej na około cztery tabele. Używam EF6 do pracy z bazą danych i dlatego zacząłem od prostych, czytelnych pól i tabel. Mam nadzieję, że to rozszerzone wyjaśnienie pomoże.


title: Praktyczne limity rozmiaru DataTable w c#

text: Muszę wysłać zapytanie do dużego zestawu danych (~500 MB) za pomocą sqlDataReader, ale muszę zapisać dane w trzech różnych formatach. Zamiast trzykrotnie przeszukiwać bazę danych, zastanawiam się nad zapisaniem danych w tabeli w pamięci, a następnie zapisaniem danych stamtąd. Czy istnieje praktyczny limit rozmiaru tabeli w pamięci? Jakieś pomysły na lepsze podejście? Dziękuję!


title: Ogólnie rzecz biorąc, co jest lepsze: siatki zagnieżdżone czy siatki zawierające kontrolki za pomocą rozpiętości kolumn/wierszy?

text: To pytanie było w mojej głowie, odkąd zacząłem z WPF i Silverlight. **Ogólnie rzecz biorąc, czy lepiej jest używać zagnieżdżonych siatek, czy po prostu ustawić właściwości Rozpiętość kolumn/wierszy w jednej siatce?** Lepsze wyniki można zmierzyć na wiele sposobów (nie ograniczających się do nich): * Łatwiejsze do odczytania * Łatwiejsze do utrzymuj i/lub rozszerzaj * Lepsza wydajność * Szybsze wdrażanie/wpisywanie Rozważmy na przykład, że chcę podzielić mój widok na trzy regiony. Jeden region obejmuje szerokość górnej połowy strony. Pozostałe dwa regiony zajmują połowę dolnej części strony. Spróbuję narysować to w tekście: --------- | 1 | --------- | 2 | 3 | --------- Sedno pytania brzmi: "które z tych dwóch rozwiązań na przykładzie jest lepsze i dlaczego?" Rozwiązanie 1: <Grid> <Grid.RowDefinitions> <RowDefinition /> <RowDefinition /> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition /> <ColumnDefinition /> </Grid.ColumnDefinitions> <TextBlock Grid.Row= "0" Grid.Column="0" Grid.ColumnSpan="2">1</TextBlock> <TextBlock Grid.Row="1" Grid.Column="0">2</TextBlock> <TextBlock Grid.Row ="1" Grid.Column="1">3</TextBlock> </Grid> Rozwiązanie 2: <Grid> <Grid.RowDefinitions> <RowDefinition /> <RowDefinition /> </Grid.RowDefinitions> <TextBlock Grid. Row="0">1</TextBlock> <Grid Grid.Row="1"> <Grid.ColumnDefinitions> <ColumnDefinition /> <ColumnDefinition /> </Grid.ColumnDefinitions> <TextBlock Grid.Column="0"> 2</TextBlock> <TextBlock Grid.Column="1">3</TextBlock> </Grid> </Grid> Zdaję sobie sprawę, że prawdopodobnie nie ma "poprawnej" odpowiedzi. Oba rozwiązania działają i nie różnią się zbytnio. Mam nadzieję, że zmierzę, który z nich jest częściej wykonywany w całej społeczności. Jeśli istnieje konwencja, do której często się stosuje, mam nadzieję, że się jej nauczę.


title: Czy to w porządku, jeśli jako UUID użyjemy dowolnego ciągu?

text: Znalazłem ** tutorial dotyczący klienta (Android) i serwera (PC) bluetooth** tutaj. Ale moje pytanie dotyczy **o UUID.** **Czy to w porządku, jeśli zdefiniujemy go losowo bez odpowiedniego formatu**? Ponieważ słyszałem, że UUID jest generalnie dla identyfikatora dla każdego urządzenia, tak jak używany adres IP, prawda? Na przykład w ten sposób, zamiast następującego kodu: UUID.fromString("00001101-0000-1000-8000-00805f9b34fb"); Definiuję swój własny UUID UUID.fromString("mojaNazwaUrządzenia009"); Czy to w porządku? Chodzi mi o to, czy jeśli testowałem na obu urządzeniach z Androidem przy użyciu powyższego kodu, mogliby się ze sobą komunikować?


title: Czy koncepcja ViewModel istniała przed MVVM?

text: Dzisiaj rozmawiałem z kolegą, że ViewModel jest ogólną koncepcją i istniał przed wzorcem MVVM. Uważam, że termin ViewModel jest używany za każdym razem, gdy tworzysz klasę z właściwościami typu Model do wyświetlania w widoku, który obsługuje wiązanie danych, takie jak w ASP.NET, a nawet w WinForms. Czy jest odwrotnie? Czy Microsoft nazwał go po raz pierwszy za pomocą MVVM?


title: równoważność w callback i non-callback javascript

text: Jestem prawie pewien, że poniższe dwa fragmenty są równoważne, ale chciałem dokładnie sprawdzić: **CALLBACK STYLE** function foo(input, callback) { // zrób coś z input callback(); } function bar(input, callback) { // zrób coś z input callback(); } foo("cześć", bar("bye", function() { // zrób coś fajnego })); _Zauważ, że wywołania zwrotne nie przyjmują żadnych argumentów._ **PLAIN STYLE** function foo(input) { // zrób coś z wejściem } function bar(input) { // zrób coś z wejściem } foo("cześć"); bar("żegnaj"); (function() { // zrób coś fajnego })(); Oczywiście, jeśli są równoważne, sensowne byłoby użycie **PLAIN STYLE**, ponieważ jest prostszy i czystszy. Zdaję sobie sprawę, że zakres funkcji anonimowej (kto robi coś fajnego) jest inny w obu przypadkach. Nie interesuje mnie ten aspekt „równoważności”. **AKTUALIZACJA** Pracuję nad starszym kodem i wydaje mi się, że jest on dość mylący. To jest oryginalny kod, który wywołał to pytanie. W szczególności zanotowane 6 lub więcej linijek kodu. var CoolNamespace = (function () { var element_kontenera, keyLength = 0; // // JESZCZE JESZCZE CIEKAWY KOLEJNYCH 6 WIERSZY // _createCoolObject(function (coolObject) { _appendFrameToContainer(coolObject, function () { / / Post form _sendForm(function (formularz) { container_element.appendChild(form); form.submit(); }); }); }); function _sendForm (callback) { // Wysyła dane klienta pocztą.if (keysLength ! = 0) { var form = _createForm(); } else { wyrzuć nowy Error("odcinek komunikatu o błędzie"); } callback(formularz); } function _appendFrameToContainer (ramka, wywołanie zwrotne) { if (typeof container_element != "undefined") { element_kontenera.appendChild(ramka); } else { wyrzuć nowy Error("krótki komunikat o błędzie"); }             oddzwonić(); } function _createCoolObject (wywołanie zwrotne) { var coolObject = { level: "bardzo fajny" }; callback(coolObject); } function _handleMessage (event) { // tak naprawdę nie chodzi o tę funkcję } function _createForm() { // tak naprawdę nie chodzi o tę funkcję var form; formularz zwrotu; } })(); Podczas przechodzenia przez kod wydawało się, że ciało `_createCoolObject` zostało wywołane _przed_ argumentem (który jest funkcją). Myślę, że moje zamieszanie polegało na tym, że argumentem `_createCoolObject` jest literał funkcji, który oblicza funkcję, ale ta funkcja _nie jest sama oceniana_ aż do wiersza `callback(coolObject)`. Dziękuję za wyjaśnienie!!


title: Czy wdrożenie ClickOnce jest przestarzałe?

text: Jeden z moich wewnętrznych użytkowników ma problem z aplikacją zbudowaną przez jednego z naszych długoletnich programistów. Aplikacja działa dobrze na Windows XP, ale w Windows 7 jest z nią problem. Aplikacja została pierwotnie opracowana jako aplikacja ClickOnce w .NET 2.0, o czym ani ja, ani żaden z naszych obecnych deweloperów nic nie wiemy. Pytanie brzmi, czy powinniśmy próbować nadal utrzymywać tę aplikację jako ClickOnce, czy też została w jakiś sposób przestarzała? Najwyraźniej aplikacje ClickOnce można nadal rozwijać w VS2013, więc jest to wykonalne. Ale CZY POWINNIŚMY to zrobić? Wolałbym zrobić z tego aplikację internetową i umieścić ją w naszym intranecie.


Który algorytm mieszający jest najlepszy pod względem wyjątkowości i szybkości? Przykładowe (dobre) zastosowania obejmują słowniki haszujące. Wiem, że są takie rzeczy jak SHA-256 i tym podobne, ale te algorytmy są **zaprojektowane** jako **bezpieczne** , co zwykle oznacza, że są wolniejsze niż algorytmy, które są mniej _unikalne_. Chcę, aby algorytm mieszający był szybki, a jednocześnie pozostawał dość unikalny, aby uniknąć kolizji.


title: Znalezienie duplikatów plików?

text: Będę rozwijał program, który wykrywa duplikaty plików i zastanawiałem się, jaka byłaby najlepsza/najszybsza metoda, aby to zrobić? Bardziej interesuje mnie, jaki byłby najlepszy algorytm mieszający, aby to zrobić? Na przykład myślałem o tym, aby uzyskać hash zawartości każdego pliku, a następnie pogrupować te same skróty. Ponadto, czy powinien istnieć limit maksymalnego rozmiaru pliku, czy też istnieje skrót odpowiedni dla dużych plików?


title: Styl opcji wiersza poleceń - POSIX czy co?

text: Gdzieś widziałem rant przeciwko java/javac rzekomo używający mieszanki stylów Windows i Unix, takich jak java -classpath ... -ea ... Coś IMHO, to nie jest mieszanka, to tak, jak `find` też działa, jest' nie? AFAIK, zgodnie z POSIX, składnia powinna wyglądać jak java --classpath ... --ea ... Coś i `-abcdef` oznaczałoby podanie 6 krótkich opcji na raz. Zastanawiam się, która wersja prowadzi ogólnie do mniejszej ilości pisania i mniejszej liczby błędów. Piszę małe narzędzie w Javie iw żadnym wypadku nie będę używał stylu Windows `/a /b`, ponieważ interesuje mnie przede wszystkim Unix. Jaki styl wybrać?


title: Co należy zrobić, aby stać się lepszym jako grupa programistyczna

text: Jakie są niektóre rzeczy, które zespół powinien zrobić, aby stać się lepszym jako grupa programistyczna? Grupa jest zaangażowana w rozwój intranetu/ogólne wsparcie dla różnych grup wewnętrznych w firmie?


title: Jak czytać dokumentację API?

text: Próbowałem przeczytać RoR API, aby dowiedzieć się rzeczy, które pominął samouczek, i nie byłem w stanie go w ogóle śledzić. Dokumentację czytałem tylko wtedy, gdy musiałem sprawdzić moduł Pythona i było to łatwe do zrozumienia, ale nie mogę zrozumieć dokumentacji dla Rails. Jak czytać dokumentację API?


title: Własność intelektualna do budowy domu

text: Moja firma jest podwykonawcą dużego kontraktu rządowego. Przez ostatnie 5 lat rozwijaliśmy własne aplikacje wspierające naszą firmę i usprawniające naszą pracę. Podobno w 2008 roku nasz ówczesny prezes firmy podpisał kontynuację umowy o świadczenie usług z firmą, której podwykonawcom powierzyliśmy ten projekt. W nowelizacji umowy omówiono różne rzeczy, takie jak własność intelektualna oraz tworzenie nowych i istniejących narzędzi. Umowa stanowi, że wszystkie narzędzia/skrypty/itp. podwykonawcy stają się własnością intelektualną głównego wykonawcy. W zasadzie wszystkie narzędzia, które powstały w celu wsparcia projektu, nad którym pracujemy, nie są już wyłącznie nasze i mają do nich prawa. Moja firma tak naprawdę nie zajmuje się tworzeniem oprogramowania specjalnie, ale dzięki tej umowie narzędzia te ogromnie pomogły w naszej codziennej pracy. Czy moja firma ma jakieś środki odwoławcze lub działania, które pomogą zachować nasze narzędzia? Mój zespół programistów był całkowicie nieświadomy tych negocjacji i do niedawna nie wiedział o zawartych umowach. Czy jako programiści mamy jakiekolwiek prawa do oprogramowania? Ponieważ nasza firma nie jest sklepem programistycznym, stworzyliśmy wszystkie te narzędzia bez jakichkolwiek umów lub umów wewnątrz firmy stwierdzających, że dajemy naszej firmie pełne prawa do naszych dzieł? Czytałem artykuł Joela Spolsky'ego na ten temat i zastanawiałem się, czy jest jakaś rada, która mogłaby nam pomóc? Dziękuję Artykuł Joela Spolsky'ego


title: Uprawnienia dynamiczne dla ról w ASP.NET MVC

text: Tworzymy aplikację webową w ASP.NET MVC. Mamy scenariusze, w których wiele akcji na stronie zależy od roli konkretnego użytkownika. Na przykład strona z notatkami zawiera akcje edycji, przekazywania, zatwierdzania, oflagowania itp. Te akcje są przyznawane różnym rolom i mogą zostać odwołane na pewnym późniejszym etapie. Jakie jest najlepsze podejście do realizacji takich scenariuszy?


title: Czy ktoś zna prosty (bezpłatny?) system śledzenia żądań funkcji, którego moglibyśmy użyć wewnętrznie dla sprzedawców?

text: Czasami słyszę o problemach klientów korzystających z naszej aplikacji od sprzedawców, ale tak naprawdę nie ma dla nas dobrego sposobu, aby obecnie je śledzić. Miałem zamiar sam napisać, ale pomyślałem, że najpierw zapytam. Myślałem o czymś tak prostym, że dosłownie byłby to mały formularz do dodawania nowej funkcji, a następnie pojawiłby się na liście, jak pytania dotyczące wymiany stosu. Następnie użytkownicy mogą je przegłosować, a nawet rejestrować za każdym razem, gdy użytkownik skarży się na coś związanego z żądaniem, abyśmy mogli uporządkować je w kolejności na podstawie rzeczywistych danych. Wtedy spokojnie mogę co kilka dni zaglądać i sprawdzać, co się dzieje. To naprawdę to, nic bardziej skomplikowanego. Wiesz coś?


title: Co sprawia, że indeksowanie sieci Web jest legalne?

text: * Co czyni to legalnym, gdy Google, Bing lub Yahoo indeksują treści z witryn internetowych? Czy istnieje publiczny rejestr tylko dozwolonych robotów? * Co sprawia, że ich wysiłki są legalne, gdy badacze przeszukują Deep Web? * Kiedy testerzy automatyzują swoje testy za pomocą Selenium lub JMeter i wielokrotnie trafiają na tę samą stronę, co sprawia, że ich wysiłek jest nielegalny? W każdym z tych przypadków automat zużywa przepustowość Internetu witryny i kopiuje jej zawartość. Ale niektóre są uważane za legalne, a inne nie.


title: „Dobry programista może być 10 razy bardziej produktywny niż przeciętny”

text: Przeczytałem wywiad ze świetnym programistą (nie jest w języku angielskim), w którym powiedział, że „świetny programista może być 10 razy lepszy od przeciętnego”, podając powód, dlaczego dobrzy programiści są bardzo dobrze opłacani i dlaczego firmy programistyczne dają wiele udogodnień dla swoich pracowników. Pomysł polegał na tym, że jest bardzo duże zapotrzebowanie na dobrych programistów z tego powodu i dlatego firmy bardzo dużo płacą za ich sprowadzenie. Czy zgadzasz się z tym stwierdzeniem? Czy znasz jakieś obiektywne fakty, które mogłyby to poprzeć? Edycja: Pytanie nie ma nic wspólnego z doświadczeniem; jeśli mówisz o jednym świetnym programiście z rocznym doświadczeniem, to powinien on być 10 razy bardziej produktywny niż przeciętny programista z rocznym doświadczeniem. Zgadzam się, że od pewnych lat doświadczenia zaczynają się rozpraszać, ale nie to jest celem tego pytania.


title: Jaki jest najłatwiejszy sposób na migrację obecnego środowiska programistycznego do nowego laptopa?

text: Mam laptopa opartego na WinXP z dość podstawową konfiguracją sprzętową według dzisiejszych standardów. Planuję uaktualnić do laptopa opartego na WinXP z dużo lepszym sprzętem. Problem: Mój obecny laptop ma mnóstwo oprogramowania, takiego jak cygwin, perl, ruby itp. Ręczne instalowanie każdego oprogramowania będzie dość kłopotliwe. Nie wspominając o dostosowywaniu pakietów. Czy jest jakieś oprogramowanie (darmowe lub komercyjne, oba w porządku), które może przeprowadzić migrację mojego obecnego środowiska programistycznego przy minimalnym nakładzie pracy?