Projektowanie wzorców w pisaniu oprogramowania numerycznego w C ++

13

Szukam zasobów na temat wzorców projektowych i zasad oprogramowania numerycznego, potencjalnie, ale niekoniecznie, ze szczególnym uwzględnieniem obiektowego podejścia do kodów numerycznych.

Zdaję sobie sprawę z tekstu, Pisanie oprogramowania naukowego: Przewodnik po dobrym stylu , ale wciąż dotyczy to wielu rzeczy, takich jak problemy z liczbą zmiennoprzecinkową, jak i kiedy optymalizować itp.

Szukam informacji o większym obrazie projektowania kodów numerycznych, a nie o czymkolwiek, co dotyczy algorytmów i tym podobnych.

Mam nadzieję, że są na to zasoby i nie pozostało tylko po prostu przeglądać bibliotekę po bibliotece, zwłaszcza, że ​​nie ma przewodnika na temat tego, jak robić rzeczy poprawnie zaprojektowane, oprócz mojej wiedzy o dobrych idiomach i praktykach w C ++.

(To nie jest specyficzne dla języka, ale jeśli jest jakaś treść specyficzna dla języka, wolałbym C ++.)

użytkownik1997744
źródło
Często myślałem o napisaniu takiej książki; ale zakres możliwych podejść jest ogromny (i zależy w dużej mierze od podstawowej techniki numerycznej + dziedziny problemowej), a to, co jest potrzebne, bardziej przypomina encyklopedię. Ponadto żadna osoba nie jest w stanie zrozumieć wszystkich możliwości. Najlepsze, co możesz zrobić, postępując zgodnie z tradycyjną praktyką oprogramowania, mając na uwadze rozwój sprzętu. Jaka jest twoja technika i dziedzina zainteresowań?
Biswajit Banerjee
2
Kolejnym przydatnym odniesieniem, które nie jest do końca celowe, jest „Efektywne obliczenia w fizyce” Anthony'ego Scopatza i Kathryn Huff.
Brian Borchers,
@BrianBorchers Hm, wydaje się, że połowa z nich to wprowadzenie do Pythona, a następnie koncentruje się na narzędziach programistycznych.
user1997744,

Odpowiedzi:

8

Po opracowaniu oprogramowania numerycznego od 20 lat stwierdzam, że prawdopodobnie wykorzystaliśmy większość wzorców projektowych opisanych w Księdze Gangu Czterech ( patrz tutaj ). Pod koniec dnia oprogramowanie numeryczne jest także oprogramowaniem złożonym na dużą skalę, więc nic dziwnego, że obowiązują te same zasady projektowania, co w przypadku innych programów.

Istnieje oczywiście szereg przypadków, które są naprawdę specyficzne dla algorytmów numerycznych (patrz, na przykład tutaj ), ale znajomość „tradycyjnego” zestawu wzorców projektowych jest już naprawdę dobrym początkiem.

Wolfgang Bangerth
źródło
Chciałbym dodać, że do obliczeń numerycznych na nowszym sprzęcie należy dążyć do zminimalizowania pogoni za wskaźnikami (z których korzysta wiele wzorców Gang of Four). Dobrym punktem wyjścia dla projektów w C ++ jest github.com/isocpp/CppCoreGuidelines/blob/master/…
Biswajit Banerjee
@BiswajitBanerjee Tak, podstawowe wytyczne C ++ są podstawową wiedzą dla każdego na temat współczesnego korzystania z C ++. Herb Sutter jest jednym z redaktorów i zawsze możesz zaufać jego radom.
user1997744,
@ user1997744 Czy chodziło Ci o Bjarne? Herb Sutter jest również znany ze swojej idei „zawsze auto”, która prowadzi do kodu tylko do zapisu (nie jestem pewien, jak bardzo ufam jego osądowi). Ponadto podstawowe wytyczne C ++ są dalekie od podstawowej wiedzy. Będziesz zaskoczony.
Biswajit Banerjee
@BiswajitBanerjee Cóż, jeśli nie są, mogę powiedzieć, że nigdy nie pozwoliłbym programistom przejść dalej niż jeden wywiad, gdyby nie byli zaznajomieni z większością wytycznych i korzystaniem z nich (z wyłączeniem przypadków, w których starszy kod może to utrudnić).
user1997744
6

Polecam tego Matthew G. Knepley. Języki programowania dla obliczeń naukowych. prefiks arXiv arXiv: 1209.1711, 2012 ( https://arxiv.org/pdf/1209.1711.pdf )

Radzę również szukać i czytać inne kody, na przykład trójkąt, PETSc, MoAB, deal.II, feniki i wiele innych. Nie wszystkie rozwiązania będą dla Ciebie działać, ale w końcu radzenie sobie i uczenie się od innych (doświadczonych programistów i odnoszących sukcesy kodów) jest najlepszą lekcją projektowania kodu.

Co więcej, myślę, że lepiej jest dołączyć do istniejącego projektu i zostać współpracownikiem lub programistą. Czasami lubisz zaczynać coś nowego, ale musisz mieć solidne argumenty, aby to zrobić.

likask
źródło
Moim argumentem, aby rozpocząć coś nowego, jest doświadczenie uczenia się i poczucie spełnienia :)
user1997744
1
Rozumiem ten argument. Zrobiłem to samo dawno temu. Teraz myślę, że to było przedwczesne. Możliwe, że na początku musimy popełnić te same błędy. Aby nauczyć się chodzić jako pierwszy, musisz upaść. Pisząc własny kod, jeśli jest to pierwszy raz, najprawdopodobniej będziesz jedynym użytkownikiem swojego kodu. Przyczyniając się do rozwoju kodu opracowanego przez społeczność, Twoje prace będą prawdopodobnie wykorzystywane przez innych, a to da ci poczucie osiągnięcia i uznania. Otrzymasz komentarze / recenzje na żądanie ściągnięcia, od których nauczysz się i doskonalisz swoje umiejętności.
likask
Cóż, nie ma biblioteki do ultra-specyficznych obliczeń ezoterycznych, które muszę wykonać, więc w końcu muszę napisać własną, choć oczywiście nie trzeba wszystkiego wymyślać od nowa.
user1997744,
Świetna rada, aby dołączyć do istniejącego projektu typu open source. W ten sposób wciągnąłem się w sieć programistów znacznie lepiej ode mnie.
user14717,