Разделяет ли вяз объекты или дублирует их? - PullRequest
0 голосов
/ 19 марта 2020

Я работаю над сайтом электронной коммерции с внешним интерфейсом в Elm, и мне интересно, являются ли объекты общими или дублированными. Я почти уверен в ответе, но я просто хочу убедиться.

По сути, у меня есть ProductVariant, содержащий немного Colour. На данный момент ProductVariant как поле colour_ids : List ColourId (это то, что я получил от json), но я думаю заменить идентификатор на сам цвет: colours : List Colour. Я могу сделать это, когда я декодирую JSON, и тогда все готово, мне не нужно искать цвета в словаре colours. Правильно ли я предположить, что каждый Colour будет разделен между различными вариантами, или каждый цвет будет дублирован, что потребует больше памяти.

Ответы [ 2 ]

1 голос
/ 21 марта 2020

следуя советам @kaskelotti, я сделал небольшую программу, извлекающую один и тот же элемент дважды из словаря, и проверял с помощью отладчика JS, если данные были общими.

import Html exposing (text,div)

import Dict
a = {t= "My name is a"}
b = {t= "My name is B"}
d = Dict.fromList [("a", a), ("b", b)]

mytest = List.filterMap (\key -> Dict.get key d) ["a", "b", "a"]

main = 
    let x = mytest
       (y, z)=  case x of
                 [a1,_,a2] -> (a1,a2)
                 _ -> (a,b)

    in div [] (List.map (\o -> text o.t) mytest)

Устанавливая точку останова в main I может проверить, что y и z на самом деле одинаковы (y === z верно). Также измените y.t, измените z.t.

1 голос
/ 21 марта 2020

Я сделал простую программу, чтобы увидеть скомпилированный вывод JS. С кодом Elm

type alias Color = { red: Int, green: Int, blue: Int }

black: Color
black = { red = 255, green = 255, blue = 255 }

white: Color
white = { red = 0, green = 0, blue = 0 }

red: Color
red = { red = 255, green = 0, blue = 0 }

colors: List Color
colors =
  [
    black,
    white,
    red,
    { red = 123, green = 234, blue = 11 },
    black,
    { red = 123, green = 234, blue = 11 },
    red,
    { red = 123, green = 234, blue = 11 }
  ]

Выходной код JS содержит

var author$project$SharedData$colors = _List_fromArray(
    [
        author$project$SharedData$black,
        author$project$SharedData$white,
        author$project$SharedData$red,
        {blue: 11, green: 234, red: 123},
        author$project$SharedData$black,
        {blue: 11, green: 234, red: 123},
        author$project$SharedData$red,
        {blue: 11, green: 234, red: 123}
    ]);

Это показывает, что компилятор может повторно использовать предопределенные цвета черный, белый и красный, но когда при создании новой записи даже с точно такими же данными всегда будет дублирование.

Я не знаю, как организованы ваши данные, но в приведенном выше примере вместо попытки оптимизировать данные структура, я бы просто сохранил цвета в виде шестнадцатеричных строк кода.

Я не уверен на 100%, как движки JS обрабатывают строки, но на многих других платформах в куче одной строки есть только один экземпляр. Для вышеприведенного игрушечного приложения это будет означать использование "7BEA0B" вместо { red: 123, green: 234, blue: 11 }

...