Sobes.tech
Middle

სისტემასთან მუშაობისთვის სტანდარტული ბიბლიოთეკები გამოიყენეთ თუ საკუთარი გადაწყვეტილებები შექმენით?

sobes.tech AI

პასუხი AI-სგან

Կոդավորում ստանդարտ գրադարանների և սեփական լուծումների, նախագծի և պահանջների վրա հիմնված:

Ստանդարտ գրադարաններ՝

  • Sockets API (BSD Sockets): Ներքևի մակարդակի API TCP/IP-ի հետ աշխատելու համար: Օգտագործվում է socket-ների ստեղծման, կապերի հաստատման, տվյալների ուղարկման և ստացման համար:
  • Boost.Asio: Կրոսպլատֆորմային գրադարան՝ ասինխրոն մուտք/ելք համար, հաճախ օգտագործվում է ցանցային աշխատանքների համար socketների, ժամացույցների և այլ ցանցային օբյեկտների աջակցությամբ:
  • libcurl: Հաճախորդային գրադարան՝ տվյալների փոխանցման համար տարբեր պրոտոկոլներով (HTTP, HTTPS, FTP և այլն):

Ինքնուրույն լուծումներ՝

Դիզայնել սեփական գրադարաններ և կոմպոնենտներ այն դեպքերում, երբ ստանդարտ լուծումները չեն բավարարում նախագծի հատուկ պահանջները, ինչպիսիք են՝

  • Բարձր կատարողականություն և ցածր լատենտություն:
  • Անհրաժեշտություն իրականացնել ոչ ստանդարտ պրոտոկոլներ:
  • Խիստ ինտեգրում այլ համակարգային կոմպոնենտների հետ:
  • Պահանջներ կայունության և մասշտաբայնության համար, որոնք գերազանցում են ստանդարտ գրադարանների օգտագործման սովորական սցենարները:

Օրինակ՝ սեփական լուծում օգտագործելով ասինխրոն TCP սերվերի համար:

// Պարզեցված ասինխրոն TCP սերվերի օրինակ՝ սեփական լուծմամբ
#include <iostream>
#include <vector>
#include <asio.hpp> // Օգտագործվում է որպես հիմք հոսքերի պուլների կամ ասինխրոն օպերացիաների համար

class TcpServer {
public:
    TcpServer(asio::io_context& io_context, short port)
        : acceptor_(io_context, asio::ip::tcp::endpoint(asio::ip::tcp::v4(), port)) {
        start_accept();
    }

private:
    void start_accept() {
        auto new_connection = std::make_shared<TcpConnection>(acceptor_.get_executor());
        acceptor_.async_accept(new_connection->socket(),
            [this, new_connection](const asio::error_code& error) {
            if (!error) {
                new_connection->start();
            }
            start_accept();
        });
    }

    asio::ip::tcp::acceptor acceptor_;
};

class TcpConnection : public std::enable_shared_from_this<TcpConnection> {
public:
    TcpConnection(asio::executor ex) : socket_(ex) {}

    asio::ip::tcp::socket& socket() { return socket_; }

    void start() {
        do_read();
    }

private:
    void do_read() {
        auto self(shared_from_this());
        socket_.async_read_some(asio::buffer(data_, max_length),
            [self](const asio::error_code& error, size_t bytes_transferred) {
            if (!error) {
                self->do_write(bytes_transferred);
            }
        });
    }

    void do_write(size_t length) {
        auto self(shared_from_this());
        asio::async_write(socket_, asio::buffer(data_, length),
            [self](const asio::error_code& error, size_t /*bytes_transferred*/) {
            if (!error) {
                self->do_read();
            }
        });
    }

    asio::ip::tcp::socket socket_;
    enum { max_length = 1024 };
    char data_[max_length];
};

// int main() {
//     try {
//         asio::io_context io_context;
//         TcpServer server(io_context, 8080);
//         io_context.run();
//     } catch (std::exception& e) {
//         std::cerr << "Exception: " << e.what() << "\n";
//     }
//     return 0;
// }

Համեմատական աղյուսակ մոտեցումների:

Մոտեցում Առավելություններ Թերություններ Օգտագործում
Ստանդարտ գրադարաններ Արագ զարգացում, փորձարկված, լավ փաստաթղթավորում, աջակցություն. Սահմանափակ ճկունություն, հնարավոր է ավելորդություն. Բազմաթիվ տիպային ցանցային խնդիրների համար.
Ինքնուրույն լուծումներ Լրիվ վերահսկողություն, բարձր ճկունություն, օպտիմալացում կոնկրետ խնդիրների համար. Բարձր արժեքներ զարգացման և սպասարկման համար, սխալների ռիսկ, թեստավորման անհրաժեշտություն. Հատուկ պահանջներ, ոչ ստանդարտ պրոտոկոլներ, խիստ ինտեգրացիա.

Ընդհանուր առմամբ, մոտեցումը կախված էր կոնկրետ նախագծից, դրա նպատակներից և սահմանափակումներից: Փորձել եմ գտնել լավագույն հավասարակշռությունը պատրաստի լուծումների և սեփական լուծումների միջև, որտեղ դա արդարացված էր։