#c #coding-style #code-readability
#c #стиль кодирования #удобочитаемость кода
Вопрос:
Я искал этот сайт, и люди говорят, что вам следует избегать использования using namespace std
. Я полностью согласен. Однако, как насчет using std::cin
and using std::string
? Следует ли этого избегать или поощрять?
Я знаю, что always type std::cin
— самый безопасный выбор, но вводить их снова и снова очень утомительно.
Однако, когда вы вводите using std::cin
etc в начале файла, это кажется очень скученным. Например, эта простая программа считывает и вычисляет оценку ученика, перед ней слишком много using std::
, это выглядит очень неудобно.
#include <iostream>
#include <ios>
#include <iomanip>
#include <stdexcept>
#include <vector>
using std::cin; using std::cout;
using std::istream; using std::vector;
using std::setprecision; using std::domain_error;
using std::string; using std::getline;
using std::streamsize;
istreamamp; read_hw(istreamamp; in, vector<double>amp; homework);
double grade(double mid_exam, double final_exam,
const vector<double>amp; homework);
int main() {
std::string name;
std::getline(std::cin, name);
std::cout << "Hello, " name "!" << std::endl;
double mid_exam, final_exam;
std::cin >> mid_exam >> final_exam;
std::vector<double> homework;
read_hw(std::cin, homework);
try {
double final_grade = grade(mid_exam, final_exam, homework);
std::streamsize prec = std::cout.precision();
std::cout << "your final grade is:" << std::setprecision(3)
<< final_grade << std::setprecision(prec) << std::endl;
}
catch(std::domain_error) {
std::cout << std::endl << "No homework entered!" << std::endl;
return 1;
}
return 0;
}
std::istreamamp; read_hw(std::istreamamp; in, std::vector<double>amp; homework) {
if(in) {
homework.clear();
double x;
while(in >> x) {
homework.push_back(x);
}
}
in.clear();
return in;
}
double grade(double mid_exam, double final_exam,
const std::vector<double>amp; homework) {
std::vector<double>::size_type i, size;
size = homework.size();
if(size ==0) {
throw std::domain_error("no homework grade entered!");
}
double sum = 0;
double average = 0;
for(i = 0; i < size; i) {
sum = homework[i];
}
average = sum/size;
return mid_exam*0.3 final_exam*0.3 average*0.4;
}
В руководстве по python говорится:
Помните, что в использовании нет ничего плохого
from Package import
! На самом деле, это рекомендуемая нотация, если только импортирующему модулю не нужно использовать подмодули с одинаковыми именами из разных пакетов.
specific_submodule
Я хочу знать, что я должен делать в программах на c .
Комментарии:
1. Лично я бы рекомендовал вам всегда использовать
std::string
и тому подобное, если вы не ограничиваете операторы using областью действия функции. Даже тогда мне нравится просто использовать std:: быть явным.2. Я заметил, что у вас есть
using std::vector
, но затем вы ссылаетесь наstd::vector
в коде. Наличие обоих не может быть правильным.3. Кроме того, это продолжение строки для аргументов
grade
является ненужным / нежелательным4. Наконец, вы не восстанавливаете точность при записи выходных данных.
5. @MartinBonner У меня нет времени удалять их
std::
в программе…
Ответ №1:
Никогда не используйте using namespace std;
или подобные в заголовочном файле, поскольку это может вызвать всевозможные проблемы неоднозначности, возникающие из-за загрязнения пространства имен. Если вы будете соблюдать это правило, то люди, которые должны включать ваши заголовки, будут благодарны вам за это. Я бы также избегал любых using std::...
заголовков in по аналогичным причинам. Научитесь любить более подробные std::
обозначения.
То, что вы получаете в исходном файле, в значительной степени зависит от вас. Любые рекомендации здесь в основном основаны на мнениях, но лично я никогда не использую using
только для экономии ввода, а скорее, когда это неизбежно, например, при возврате затененных функций обратно в пространство имен и при метапрограммировании шаблонов.
Комментарии:
1. Вы должны проголосовать за закрытие как POB, если все, что получит OP, — это мнения.
2. Я считаю, что первый абзац не основан на мнениях.
3. если вы пишете простую программу типа hello world или учебника, это помогает использовать пространство имен std , если ни одна другая библиотека не имеет cin или cout в качестве типов. Не нужно усложнять учебные пособия с помощью std::this std::that ….
4. Спасибо за ваш совет, я думаю, мне следует с самого начала выработать хорошую привычку.
5. @DrDeo: Я не мог не согласиться больше. Я думаю, что причиной этого является тот факт, что учебники, похоже, презирают написание
std::
. Он внедряет этот стиль в умы всех наших начинающих программистов!
Ответ №2:
Имхо, этот вопрос скорее основан на мнениях. Тем не менее, это мое мнение:
Не используйте:
using std::cin;
using std::cout;
using std::string;
или тому подобное. Мой аргумент довольно прост и лучше демонстрируется с помощью
using std::sort;
using std::vector;
Представьте, что у вас есть код, содержащий ошибку, и теперь вы должны ее найти. Любой используемый объект или функция, std::
перед которыми есть a, вряд ли содержит ошибку. Таким образом, я всегда предпочитаю видеть
std::vector<double> x;
std::sort(x);
вместо
vector<double> x;
sort(x);
потому что последнее требует от меня поиска того vector
, sort
что на самом деле есть и (помните, что мы говорим о C , т. Е. Это может быть буквально что угодно), просто чтобы выяснить, что это std::vector
и std::sort
. Вывод: время, которое я трачу на написание std::
каждый раз, экономит мне вдвое или более времени на отладку.
Чтобы сделать это немного менее основанным на мнениях: определенный компромисс, который вы должны сделать, — это удобочитаемость по сравнению с меньшим набором текста. Мнение, основанное на мнении, — это то, что вы цените больше….
Комментарии:
1. Я думаю
coding-style
, что все вопросы основаны на мнениях, однако есть хорошие и плохие. Кроме того, почти весь код основан на мнениях, потому что код — это путь к ответу, однако есть много способов.2. @buzhidao как я уже сказал, imho не основывается на мнениях, так это преимущества и недостатки одного подхода по сравнению с другим. Какой из них вы выбираете, зависит исключительно от мнения