Хороший шрифт для презентаций кода? [закрытый]

Что означает копирование объекта? Есть несколько способов, которыми вы можете копировать объекты - давайте поговорим о 2 видах, на которые вы, скорее всего, ссылаетесь - глубокое копирование и поверхностное копирование.

Так как мы находимся на объектно-ориентированном языке (или, по крайней мере, предполагаем так), допустим, у вас выделена часть памяти. Так как это ОО-язык, мы можем легко ссылаться на фрагменты памяти, которые мы выделяем, потому что они обычно являются примитивными переменными (целыми числами, символами, байтами) или классами, которые мы определили, которые сделаны из наших собственных типов и примитивов. Допустим, у нас есть класс Car следующим образом:

class Car //A very simple class just to demonstrate what these definitions mean.
//It's pseudocode C++/Javaish, I assume strings do not need to be allocated.
{
private String sPrintColor;
private String sModel;
private String sMake;

public changePaint(String newColor)
{
   this.sPrintColor = newColor;
}

public Car(String model, String make, String color) //Constructor
{
   this.sPrintColor = color;
   this.sModel = model;
   this.sMake = make;
}

public ~Car() //Destructor
{
//Because we did not create any custom types, we aren't adding more code.
//Anytime your object goes out of scope / program collects garbage / etc. this guy gets called + all other related destructors.
//Since we did not use anything but strings, we have nothing additional to handle.
//The assumption is being made that the 3 strings will be handled by string's destructor and that it is being called automatically--if this were not the case you would need to do it here.
}

public Car(const Car &other) // Copy Constructor
{
   this.sPrintColor = other.sPrintColor;
   this.sModel = other.sModel;
   this.sMake = other.sMake;
}
public Car &operator =(const Car &other) // Assignment Operator
{
   if(this != &other)
   {
      this.sPrintColor = other.sPrintColor;
      this.sModel = other.sModel;
      this.sMake = other.sMake;
   }
   return *this;
}

}

Глубокая копия - это если мы объявляем объект, а затем создаем совершенно отдельную копию объекта ... в итоге мы получаем 2 объекта в 2 полностью набора памяти.

Car car1 = new Car("mustang", "ford", "red");
Car car2 = car1; //Call the copy constructor
car2.changePaint("green");
//car2 is now green but car1 is still red.

Теперь давайте сделаем что-то странное. Предположим, что car2 либо запрограммирован неправильно, либо намеренно предназначен для разделения фактической памяти, из которой сделан car1. (Как правило, это ошибка, и в классах это, как правило, обсуждаемое одеяло.) Представьте, что каждый раз, когда вы спрашиваете о car2, вы действительно решаете указатель на пространство памяти car1 ... это более или менее то, что мелкая копия есть.

//Shallow copy example
//Assume we're in C++ because it's standard behavior is to shallow copy objects if you do not have a constructor written for an operation.
//Now let's assume I do not have any code for the assignment or copy operations like I do above...with those now gone, C++ will use the default.

 Car car1 = new Car("ford", "mustang", "red"); 
 Car car2 = car1; 
 car2.changePaint("green");//car1 is also now green 
 delete car2;/*I get rid of my car which is also really your car...I told C++ to resolve 
 the address of where car2 exists and delete the memory...which is also
 the memory associated with your car.*/
 car1.changePaint("red");/*program will likely crash because this area is
 no longer allocated to the program.*/

Поэтому, независимо от того, на каком языке вы пишете, будьте очень осторожны с тем, что вы имеете в виду, когда речь идет о копировании объектов, потому что большую часть времени вам нужна глубокая копия.

Что такое конструктор копирования и оператор присваивания копии? Я уже использовал их выше. Конструктор копирования вызывается, когда вы вводите код, такой как Car car2 = car1;. По существу, если вы объявляете переменную и присваиваете ее в одной строке, тогда вызывается конструктор копирования. Оператор присваивания - это то, что происходит, когда вы используете знак равенства - car2 = car1;. Уведомление car2 не объявлено в том же заявлении. Две части кода, которые вы пишете для этих операций, вероятно, очень похожи. На самом деле типичный шаблон проектирования имеет другую функцию, которую вы вызываете, чтобы установить все, как только вы убедитесь, что первоначальное копирование / присвоение является законным - если вы посмотрите на написанный мной от руки код, функции почти идентичны.

1112] Когда мне нужно объявить их самому? Если вы не пишете код, предназначенный для совместного использования или для производства каким-либо образом, вам действительно нужно объявлять их только тогда, когда они вам нужны. Вы должны знать, что делает ваш программный язык, если вы решили использовать его «случайно» и не сделали его - т.е. вы получаете компилятор по умолчанию. Например, я редко использую конструкторы копирования, но переопределения операторов присваивания очень распространены. Знаете ли вы, что вы можете переопределить, что означает сложение, вычитание и т. Д.?

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

70
задан Robert Harvey 30 November 2017 в 15:46
поделиться

8 ответов

Я часто делаю такие презентации и использую Monaco для кода и Chalkboard для текста (в шаблоне, который, в целом, имеет лишь небольшие отличия от шаблона Blackboard, поставляемого с Keynote). Посмотрите на любой из моих PDF-файлов (например, этот ), и вы сможете решить, нравится ли вам эффект.

24
ответ дан 24 November 2019 в 13:22
поделиться

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

Если вы собираетесь распространять свою презентацию, используйте шрифт, который, как вы знаете, есть на всех компьютерах, поскольку использование чего-то еще приведет к тому, что машина все равно вернется к одному из распространенных шрифтов (например, Arial или Times).

Если вы действительно заботитесь о том, чтобы вещи выстраивались в линию, и не распространяете презентацию, подумайте о Консоласе:

alt text

Он очень разборчивый, напоминает Verdana, и моноширинный. Выбор цвета, конечно, дело вкуса.

29
ответ дан 24 November 2019 в 13:22
поделиться

Я предпочитаю Консоли .

68
ответ дан 24 November 2019 в 13:22
поделиться

Мне лично очень нравится Inconsolata

16
ответ дан 24 November 2019 в 13:22
поделиться

Хотите, чтобы люди сосредоточились на содержании и продемонстрировали, что у вас есть вкус и здравый смысл? Оставайся с курьером. Не вводите новшества только потому, что вы можете (иначе почему бы не создать изящную анимацию для каждого перехода между слайдами, с танцующими буквами ...?).

Courier имеет несколько преимуществ:

  1. Отличная читаемость при низком разрешении.
  2. Фиксированная ширина сохраняет отступы.
  3. Шрифты с засечками связывают буквы, позволяя людям понимать слова и идентификаторы в целом (гештальт-восприятие). Неограниченные шрифты следует использовать только для заголовков.
  4. Проверено и верно: люди сразу поймут его код.

Если вы хотите сбросить точку 4, по крайней мере выберите альтернативу, которая сохраняет пункты 1-3. Никогда не позволяйте форме преобладать над функцией.

6
ответ дан 24 November 2019 в 13:22
поделиться

Я использую DejaVu Sans Mono в размере 16.

ОБНОВЛЕНИЕ: Я перешел на Envy Code R для кодирования и Anonymous Pro для терминала

3
ответ дан 24 November 2019 в 13:22
поделиться
  • Консоль Lucida (хорошая, но коротковатая)
  • Пишущая машинка Lucida Sans (более высокая, меньший набор символов)
  • Andale Mono очень четкая

Но здесь есть здесь ответили перед .

3
ответ дан 24 November 2019 в 13:22
поделиться

Мне нравится Калибри.

1
ответ дан 24 November 2019 в 13:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: