Примерно 8 месяцев назад я написал на Rust pet-проект, который пытается быть подобием Hibernate в экосистеме Java. Я даже опубликовал его в качестве Open Source, но получил негативный отзыв и удалил его с GitHub.

Сейчас я решил вернуться к этому проекту, но подойти к нему с другой стороны. Я бы хотел услышать идеи по проекту от опытных разработчиков на Rust. Что в моем проекте сделано не в идиоматическом стиле Rust и т.д. и т.п. В общем, хочется получить чек-лист того, что в проекте не так и как это исправить.

Пожалуйста, помогите. Мне очень нужна ваша обратная связь.

Код проекта на GitHub.

Комментарии (14)


  1. Gorthauer87
    25.04.2024 21:59
    +1

    Ну вот сразу не хватает плашек, ведущих на crates.io и docs.rs. Без этого не удобно изучать проект, и нужно его отдельно искать где он опубликован.

    Кстати, а чем sea orm не устроил?


    1. igumnov Автор
      25.04.2024 21:59

      SeaORM меня больше радует чем Diesel ) Но захотелось что-то свое написать, вдруг получиться решение где меньше букв надо писать чем в SeaORM.


  1. feelamee
    25.04.2024 21:59

    мистер

    расскажите, откуда у вас столько времени, чтобы вести все эти опен сорс проекты?

    не думаете ведь вы, что сообщество будет развивать их само по себе, пока вы будете с улыбкой на лице наблюдать, как одна за другой появляются звёздочки на гитхабе?


    1. mxr
      25.04.2024 21:59
      +4

      В том случае, если вопросы финансового характера остро не стоят, у человека появляется уйма свободного времени.

      Есть целый пласт людей, например инди-хакеры, готовых инвестировать свое время в потенциально интересный но не прибыльный проект.

      В моем случае, open source стал отличным способ изучать языки и технологии.


  1. itmind
    25.04.2024 21:59
    +14

    Это не статья, а просто ссылка на Github. Еще и хабы выбраны про программирование, а в статье ни одной строчки кода.

    В статье нужно описать, чем ваше решение лучше аналогов (Diesel, SeaORM, Sqlx), какие походы использовали, с какими трудностями столкнулись, в чем подобие именно Hibernate и т.п.


    1. igumnov Автор
      25.04.2024 21:59

      Вы можете найти это все в моей предыдущей статье: https://habr.com/ru/articles/757070/


    1. Melanchall
      25.04.2024 21:59
      +5

      А кроме того стоит уровень статьи Средний. Уровень это про текст статьи, но в статье (если это вообще статьёй можно назвать) нет ничего требующего навыков отличных от навыка чтения.

      Также замечу, что существует сайт Code Review Stack Exchange, созданный специально с целью помогать ревьювить код и помогать с кодом в плане архитетуры, стиля и всего такого. Я подозреваю, что автору нужно было написать туда.


  1. Dgolubetd
    25.04.2024 21:59
    +2

    На основании примера:

    1. (Не критицизм кода) ORM - никогда их не любил, но как способ попрактиковаться - OK

    2. Почему метод connect почему-то блокирующий, в то время как всё остальное асинхронное?

    3. Prepared statement нет? В примере format и protect - есть гарантии что он корректно всё заэскейпит?

    4. conn.query(query.as_str()) - можно использовать AsRef чтобы можно было передовать строки в разной форме

    5. Очень много клонирования. Можно принимать и ссылки. Ну а лучше разрешить и то и то, опять же с помощью AsRef


    1. igumnov Автор
      25.04.2024 21:59

      1. Оk

      2. Сказать честно, не помню, толи просто сделал толи компилятор ругался так как либа в которой конекция создается выдавало ошибку про Send и Sync - надо перепроверить - спасибо за замечание

      3. Да согласен, prepared statement не хватает вообщем как раз можно перейти на sqlx crate https://github.com/igumnoff/parvati/issues/1

      4. Интересно, а это чуть медленнее работает?

      5. Ну клонирование, точно не быстрое. Вот тут точно AsRef уместно. Надо заняться рефакторингом


  1. domix32
    25.04.2024 21:59
    +2

    ну из нечитаемого

    вот такое
            match value {
                Some(v_opt) => {
                    match v_opt {
                        None => {
                            None
                        }
                        Some(v) => {
                            let r = Z::from_str(v.as_str());
                            match r {
                                Ok(res) => {
                                    Some(res)
                                }
                                Err(_) => {
                                    None
                                }
                            }
                        }
                    }
    
                }
                None => {
                    None
                }
            }

    Должно использовать идиому if let Some(x) / if let Ok(x) .

    Аналогично но с циклом while let Some(x) .

    Две PhantomData в одной структуре выглядит как минимум подозрительно, как максимум бесполезно - лайфтайм у них один и тот же.

    Преобразование ошибок выглядит не очень. Возможно стоит подсмотреть как используют какой-нибудь thiserror/anyhow либо сделать impl Into/From для ваших ошибок.

    Санация ввода определённо требует много тестов и вероятно выделение в собственную сущность или как минимум отдельный трейт с имплементацией для char, str и String , чтобы можно быо делать что-то вроде "praise the sun \0/".orm_escape() .

    Сейчас тестов вроде примерно нисколько. Да и в общем по проекту тестов как-то мало. Отсюда же отсутствие понимания у людей как это будет использоваться в дальнейшем.

    Про сериализацию наверное стоит подсмотреть какой-нибудь miniserde ибо текущий вариант кажется имплементит только какой-то сабсет json спеки. Ввиду отсутвия тестов - непонятно.


  1. aegoroff
    25.04.2024 21:59
    +1

    вот тут https://github.com/igumnoff/parvati/blob/3c3e6ff32872326bbef818192cc3d634962c9381/lib/src/sqlite.rs#L89 у вас прямо SQL инъекция в чистом виде - я вам еще в прошлый раз об этом говорил, но видимо вы не поняли. НЕЛЬЗЯ данные неизвестно откуда использовать в запросах напрямую, пусть даже с санитайзером, ТОЛЬКО передавая их через параметры.


    1. igumnov Автор
      25.04.2024 21:59

      Я понял - поэтому буду переписывать на sqlx с prepare statement
      более того я про preapare statement знал и использовал 25 лет назад когда делал свой высоконогруженый веб сервис обслуживащий более 20 млн пользователей
      а текущая либа это просто на коленке писаный прототип, быстрей - быстрей лишь бы скомпилировалось и работало
      https://github.com/igumnoff/parvati/issues/1

      Но вы молодец, что так упорно гнете свою линию )


      1. aegoroff
        25.04.2024 21:59

        в 99 году сервис обслуживающий более 20 млн.? Это Яндекс, Рамблер, Апорт, Мейлру что-ли? И да, что у вас было за железо? в ту пору диск на 10 Гигов считался огромным, типичный было что-то вроде 4-8 Гб. Тогда наверно в России было ну 2-3 млн. пользователей интренета


        1. igumnov Автор
          25.04.2024 21:59

          сорри, ошибся, погуглите mylivepage проект он чуть позже был )
          просто для меня это было как вчера ) и я плюс минус 5-10 лет не уточняю
          https://igumnoff.com/about
          Хотя мы с вами похожи, вы отвергаете авторитеты как и я, так как они стары как засохшая жвачка под партой в школе )