Страницы

Поиск по вопросам

Показаны сообщения с ярлыком оформление. Показать все сообщения
Показаны сообщения с ярлыком оформление. Показать все сообщения

суббота, 4 января 2020 г.

Как продублировать символ с помощью printf

#c #printf #оформление


printf ("%c", 196);


Как мне сделать так, что символ был напечатан не 1 раз, а допустим 5 раз, чтобы избежать
таких строк

printf ("%c%c%c%c%c, 196, 196, 196, 196, 196);


Сторонние библиотеки юзать нельзя, тольк 
    


Ответы

Ответ 1



Так не устроит? for(int i = 0; i < 5; ++i) putchar(196); Ну, или for(int i = 0; i < 5; ++i) printf("%c",196); P.S. Если бы работать в C++, то там символ-заполнитель можно указать - char k = 'a'; cout << setfill(k) << setw(5) << k << endl; Но это так, досужие рассуждения, так как вопрос именно о C...

понедельник, 30 декабря 2019 г.

Java - вынос реализации из описания класса

#java #интерфейс #оформление


На C++ привык оформлять классы следующим образом

(в заголовочном файле)


class MyClass
{
public:
    MyClass();
    void Method1();
    void Method2();
private:
    ...
}


Саму реализацию при этом выношу в .cpp или (в случае с header-only библиотеками)
объявляю как inline и выношу ниже по тексту, отделив комментарием типа:

/*****************************/
/* Реализация класса MyClass */
/*****************************/


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

Однако, начав изучать Java, аналогичной возможности не нашёл, и очень не хватает
способа написания классов с удобно обозреваемой функциональностью. Лучшее, что посоветовали
знакомые - описывать отдельно интерфейс и реализовывать его, но для классов, используемых
однократно это, IMHO, overkill. Есть ли в Java способ описывать простые классы читабельно,
с разнесённым объявлением и реализацией?

Update1: из комментариев стало ясно, что в Java транслятор такой возможности не предоставляет,
но аналогичную функцию выполняет javadoc: либо в заголовке файла в Documentation Comments
(преимущество: это первое, что видит человек, читающий код), либо после каждой сигнатуры
функции (пока не понял, перед телом или после него. Преимущество: документация привязана
к описанию функции). Поэтому пока непонятными остаются два момента:


Как заставить IDE (Intellij IDEA) генерировать документацию для функций с подстановкой
параметров, аналогично тому, как это делает Eclipse?
Как заставить javadoc (или javadoc-plugin) отслеживать соответствие документации
и кода чтобы, к примеру, при компиляции после изменения списка параметров функции выдалось
хотя бы предупреждение?


Update2: 


/ **перед объявлением функции работает и в IDEA.
Javadoc отслеживает только комментарии, поэтому соответствие документации коду он
проверить не может. Возможно, это умеют какие-либо плагины к IDE, но пока что в комментариях
такой плагин не упоминался. Поэтому следить за тем, чтобы комментарии соответствовали
актуальной версии кода, (и обновлялись при его изменении) приходится вручную.
Обзор структуры класса частично позволяет охватить класс беглым взглядом, особенно
когда IDE умеет "подсасывать" из javadoc описание функции. Возможности распечатать
окошко структуры класса (как в C++ можно распечатать .h-файл для отдельного изучения)
нет (точнее, я не нашёл), поэтому основной упор всё-таки надо делать на комментарии.

    


Ответы

Ответ 1



В java такой возможности нет. Вы можете облегчить чтение своего кода, если будете придерживаться соглашений. Например, Java Code Convention В Java рекомендуют делать компактные классы и методы, чтобы их было удобно читать. Немаловажный фактор, облегчающий чтение кода, - это именование. По названию сущности должно быть понятно, что она делает и как с ней работать. Я с вами согласен, что создавать интерфейс для однократно используемого класса - это чересчур, но обычно такие классы получаются небольшими и если выбрать правильно имена, то их будет несложно понять.

Ответ 2



Сам по себе язык Java такой возможности не дает, и это, конечно, создает определенное неудобство. Однако современные IDE практически сводят это неудобство на нет. Вот как выглядит, например, фрагмент кода при работе в Eclipse: Тела методов свернуты, видны лишь их заголовки и первая строчка комментария. При нажатии по плюсику слева от текста тело метода (или комментарий) разворачивается, можно его прочитать или отредактировать и свернуть обратно. В тексте при наведении курсора на имя метода или поля всплывает хинт, в котором показано описание этого метода, которое берется из JavaDoc к этому методу. Заготовка для комментария (JavaDoc) со списком параметров формируется автоматически при вводе начальных символов (/**). Кроме того, в левой панели (Package explorer) показана структура класса -- ее можно настроить, чтобы там были показаны, например, только публичные методы. Всё это вместе взятое дает наглядную и удобную для работы картину класса и необходимость в разделении описания интерфейса и реализации совершенно отпадает.

воскресенье, 22 декабря 2019 г.

Где объявлять вспомогательные функции?

#cpp #ооп #code_style #стиль #оформление


К примеру, у меня есть класс, который делает WMI запросы, там часто надо преобразовывать
QString к BSTR, поэтому я хочу написать функции преобразования.
Где мне их лучше объявлять, в этом же классе, если да, то private или public? Создать
namespace с двумя функциями только для этого класса? Создать общий namespace для всех
функций преобразования, и, пока что, записать туда только две эти функции? Объявить
их глобально в хедере этого класса?
    


Ответы

Ответ 1



Как пишет Скотт Мейерс в своей книге «Эффективное использование C++»: Предпочитайте функциям-членам функции, не являющиеся ни членами, ни друзьями класса. Это повышает степень инкапсуляции и расширяемость, а также гибкость упаковки функциональности. Если хотите ознакомиться с этим правилом детальнее - см. стр. 105 вышеупомянутой книги. Если Ваши функции выполняют преобразование и не требуют доступа к закрытам данным-членам или методам Вашего класса - пользуйтесь этим советом, поскольку, если свободная функция способна обеспечить ту же функциональность, что и метод класса, то предпочтительней является свободная функция, поскольку она увеличивает степень инкапсуляции данных. А это уже одна из особенностей, ожидаемых от ООП программ. Идея использовать namespace, в который Вы поместите свой класс и эти функции преобразования, хорошая, явно лучше, чем подвесить их в глобальной области видимости.

понедельник, 28 января 2019 г.

Как продублировать символ с помощью printf

printf ("%c", 196);
Как мне сделать так, что символ был напечатан не 1 раз, а допустим 5 раз, чтобы избежать таких строк
printf ("%c%c%c%c%c, 196, 196, 196, 196, 196);
Сторонние библиотеки юзать нельзя, тольк


Ответ

Так не устроит?
for(int i = 0; i < 5; ++i) putchar(196);
Ну, или
for(int i = 0; i < 5; ++i) printf("%c",196);
P.S. Если бы работать в C++, то там символ-заполнитель можно указать -
char k = 'a'; cout << setfill(k) << setw(5) << k << endl;
Но это так, досужие рассуждения, так как вопрос именно о C...

среда, 14 ноября 2018 г.

Где объявлять вспомогательные функции?

К примеру, у меня есть класс, который делает WMI запросы, там часто надо преобразовывать QString к BSTR, поэтому я хочу написать функции преобразования. Где мне их лучше объявлять, в этом же классе, если да, то private или public? Создать namespace с двумя функциями только для этого класса? Создать общий namespace для всех функций преобразования, и, пока что, записать туда только две эти функции? Объявить их глобально в хедере этого класса?


Ответ

Как пишет Скотт Мейерс в своей книге «Эффективное использование C++»:
Предпочитайте функциям-членам функции, не являющиеся ни членами, ни друзьями класса. Это повышает степень инкапсуляции и расширяемость, а также гибкость упаковки функциональности.
Если хотите ознакомиться с этим правилом детальнее - см. стр. 105 вышеупомянутой книги.
Если Ваши функции выполняют преобразование и не требуют доступа к закрытам данным-членам или методам Вашего класса - пользуйтесь этим советом, поскольку, если свободная функция способна обеспечить ту же функциональность, что и метод класса, то предпочтительней является свободная функция, поскольку она увеличивает степень инкапсуляции данных. А это уже одна из особенностей, ожидаемых от ООП программ.
Идея использовать namespace, в который Вы поместите свой класс и эти функции преобразования, хорошая, явно лучше, чем подвесить их в глобальной области видимости.

среда, 17 октября 2018 г.

Грамотное оформление документации в Python

Правильно оформлена документация данного примера класса? class Example: def __init__(self, label="", icon=None, menu=None, quit=True): """ :param label: подпись трея
:type icon: str :param icon: путь к иконке
:type menu: list :param menu: [("Подпись кнопки", пользовательская функция))]
:param quit: если True - будет создан пункт "Quit" с функцией выхода
""" Если нет, подскажите, как это сделать грамотно, чтобы не было стыдно за свой код.


Ответ

Раз уж Вы задались подобным вопросом, советую вам почитать перевод статей про оформление кода на языке Python отсюда. Хоть определенного (единого) стандарта на этот счет и нет, однако, окружать аргумент с 2-х сторон - это, по-моему, лишнее. Достаточно ставить один знак , например, так: param label: Подпись трея Подробенее см. ссылку.