Size: a a a

Rust — русскоговорящее сообществo

2020 September 24

AS

Andrei 🦉 Sergeev in Rust — русскоговорящее сообществo
folex
Конфиги друг друга принимают в конструкторы, или наоборот предоставляют билдеры для низлежащих конфигов
а зачем вам инвертирвоать зависимости конфигурации? у вас из этого и вылазят проблемы
источник

AS

Andrei 🦉 Sergeev in Rust — русскоговорящее сообществo
потому что внезапно Server и узнаёт о том, что есть какой то vm config
источник

f

folex in Rust — русскоговорящее сообществo
Сейчас Server ничего не знает про VmConfig, тк я этого и добивался
источник

AS

Andrei 🦉 Sergeev in Rust — русскоговорящее сообществo
NewServerConfig(work_dir) { NewUnionConfig(work_dir) { NewVMConfig(work_dir) {work_dir}, NewDHTConfig(work_dir) {work_dir} }
источник

f

folex in Rust — русскоговорящее сообществo
folex
Сейчас Server ничего не знает про VmConfig, тк я этого и добивался
ошибся. там никто линию зависимостей не пересекает. Там вот так:

ServerConfig => Union::new(server.a, server.b, server.c) => ( union.vm_config(), union.dht_config() )
источник

AS

Andrei 🦉 Sergeev in Rust — русскоговорящее сообществo
folex
ошибся. там никто линию зависимостей не пересекает. Там вот так:

ServerConfig => Union::new(server.a, server.b, server.c) => ( union.vm_config(), union.dht_config() )
а зачем UnionConfig знать о ServerConfig?
источник

AS

Andrei 🦉 Sergeev in Rust — русскоговорящее сообществo
у вас получается, что нижелажащая абстракция знает реализацию вышестоящей
и если вы вносите изменения в Server, то они потенциально затрагивают и слой Union (а может и глубже)
источник

АГ

Алексей Герасимов... in Rust — русскоговорящее сообществo
Нельзя ли наделать трейтов для каждого типа конфига c геттерами и в конструкторах требовать VmConfig: VmConfigProvider, и потом их все для одного большого типа конфига реализовать? То есть по факту у вас везде будет передаваться весь конфиг, но доступ будет только к отдельным сосотавляющим через геттеры?
источник

AS

Andrei 🦉 Sergeev in Rust — русскоговорящее сообществo
Алексей Герасимов
Нельзя ли наделать трейтов для каждого типа конфига c геттерами и в конструкторах требовать VmConfig: VmConfigProvider, и потом их все для одного большого типа конфига реализовать? То есть по факту у вас везде будет передаваться весь конфиг, но доступ будет только к отдельным сосотавляющим через геттеры?
много работы непонятно ради чего)
источник

f

folex in Rust — русскоговорящее сообществo
Алексей Герасимов
Нельзя ли наделать трейтов для каждого типа конфига c геттерами и в конструкторах требовать VmConfig: VmConfigProvider, и потом их все для одного большого типа конфига реализовать? То есть по факту у вас везде будет передаваться весь конфиг, но доступ будет только к отдельным сосотавляющим через геттеры?
Нет, так еще больше кода выйдет
источник

f

folex in Rust — русскоговорящее сообществo
плюс так как компоненты хочется видеть независимыми, придется иметь несколько реализаций трейта: 1) для главного конфига 2) для component-only конфига
источник

АГ

Алексей Герасимов... in Rust — русскоговорящее сообществo
folex
плюс так как компоненты хочется видеть независимыми, придется иметь несколько реализаций трейта: 1) для главного конфига 2) для component-only конфига
так вам по-факту component-only конфиг как отдельный тип и не нужен становится, вы все из главного вытягиваете там где это надо. То есть либо всегда работаете с конфигом через трэйт либо вытягиваете через этот трэйт составляющие конфига и создаете из них нужный тип, про трэйт забываете
источник

f

folex in Rust — русскоговорящее сообществo
Нужен :) Для тестов, и для реюза компонент
источник

АГ

Алексей Герасимов... in Rust — русскоговорящее сообществo
struct ServerConfig {
   key_pair: Keypair,
   base_dir: PathBuf,
   envs: Vec<String>,
}

trait DHTConfig {
   fn peer_id(&self) -> PeerId;
   fn work_dir(&self) -> PathBuf;
}

trait VMConfig {
   fn envs(&self) -> Vec<String>;
   fn work_dir(&self) -> PathBuf;
}

impl DHTConfig for ServerConfig {
        fn peer_id(&self) -> PeerId { key_pair.public().to_peer_id }
        fn work_dir(&self) -> PathBuf { base_dir.join("something") }
}

вот примерно такое я предлагаю
вам для реюза компонент либо придется писать новую конвертацию из нового конфига, либо реализацию трейта для этого нового конфига
источник

f

folex in Rust — русскоговорящее сообществo
Ага, я понял идею, спасибо! Но мне кажется это всё-таки оверкилл, плюс всё оказывается завязано на ServerConfig. А про него хорошо бы забывать как только покидаешь уровень Server-а
источник

АГ

Алексей Герасимов... in Rust — русскоговорящее сообществo
folex
Ага, я понял идею, спасибо! Но мне кажется это всё-таки оверкилл, плюс всё оказывается завязано на ServerConfig. А про него хорошо бы забывать как только покидаешь уровень Server-а
дак вы и забудете, ниже у вас только trait bounds останутся типа
источник

f

folex in Rust — русскоговорящее сообществo
Плюс появляются impl DhtConfig вместо DhtConfig
источник

АГ

Алексей Герасимов... in Rust — русскоговорящее сообществo
fn new<C: DHTConfig>(config: C)->DHTWhatever { <use DHTConfig trait> }
источник

f

folex in Rust — русскоговорящее сообществo
можно проще fn new(config: impl DhtConfig)
источник

АГ

Алексей Герасимов... in Rust — русскоговорящее сообществo
folex
можно проще fn new(config: impl DhtConfig)
тем более
источник