karlosos / intive_js_calculator

Calculator written in JavaScript for interview.
1 stars 0 forks source link

Zadanie 2 #2

Open makeros opened 4 years ago

makeros commented 4 years ago

Hej. Zapraszamy do zadania nr 2 https://gist.github.com/makeros/30bcd431291e34dc0c6dd3b9c8dfe888

karlosos commented 4 years ago

Cześć @makeros,

czy dozwolone jest używanie zewnętrznych bibliotek w projektach?

makeros commented 4 years ago

Hej @karlosos Można używać. Pytanie czy czasami ma to sens ;) Czasami lepiej użyć natywnego rozwiązania ale prosto niż źle użyć zewnętrznej biblioteki ale działa ;) A czego chciałbyś użyć?

karlosos commented 4 years ago

Chodzi o drugi problem z kolejnością wykonywania działań. Mam taką wizję, że użytkownik będzie wprowadzać dane, np. 2+2/2^3*2√5 i ten ciąg znaków będzie trzeba sparsować na działania.

Mógłbym użyć biblioteki https://mathjs.org/docs/expressions/expression_trees.html i przerobić moje wyrażenie na 2+2/2^3*5^(1/5) i takiego stringa przekazać do math.eval('2+2/2^3*5^(1/5)') co da mi od razu wynik.

W przeciwnym razie musiałbym użyć tego algorytmu https://en.wikipedia.org/wiki/Shunting-yard_algorithm#Detailed_example na danych wejściowych 2+2/2^3*2√5.

Trzecią możliwością jaką widzę jest to sparsowanie do postaci odpowiedniej dla eval: eval('2+2/Math.pow(2, 3)*Math.pow(2, 1/5'). To byłoby najprostsze rozwiązanie, ale zarazem niebezpieczne. W dokumentacji mdn nie przekonują do używania https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval#Never_use_eval! 😬

karlosos commented 4 years ago

Chociaż po krótkim namyśle jednak zdecyduję się na rozwiązanie z eval. Przetestowałem i działa :). W razie potrzeby zawsze będzie można podłączyć bibliotekę mathjs.

makeros commented 4 years ago

W sumie możesz użyć biblioteki.

Eval jest zły ale jak się go używa w specyficznych przypadkach. Np. gdy evalem wykonujemy u użytkownika kod pochodzący od osoby trzeciej.

Nie mniej jednak sam eval powinien wystarczyć.

Ale analizowanie całego zapisu użytkownika (bez używania evala) po kliknięciu '=' nie powinno być specjalnie skomplikowane ;)

Zawsze najlepiej wybrać najprostsze działające rozwiązanie :)