Расчета Linux на основе восьмеричной разрешение файла


Я подаю заявку на должность среднего уровня окислителем.

Для того, чтобы прогрессировать на 2-м интервью, вы должны пройти техническую проверку. Один из вопросов был написать функцию для работы из Linux, основанный восьмеричной разрешения файла.

Как бы вы улучшить это, и почему?

using System;
using System.Collections;
using System.Linq;

public class ReadWriteExecute
{
    public static int CalculatePermissionSum(string permString)
    {
        int octalPerm = 0;

        foreach (char permission in permString.ToArray())
        {
            switch (permission)
            {
                case 'r':
                    octalPerm += 4;
                    break;
                case 'w':
                    octalPerm += 2;
                    break;
                case 'x':
                    octalPerm += 1;
                    break;
                case '-':
                    octalPerm += 0;
                    break;
            }
        }
        return octalPerm;
    }

    public static string SymbolicToOctal(string permString)
    {
        string octalPerm = string.Empty;      
        for(int x=0; x<=6;x+=3)
        {

            octalPerm += CalculatePermissionSum(new string(permString.Skip(x).Take(3).ToArray())).ToString();
        }
        return octalPerm;
    }

    public static void Main(string[] args)
    {
        // Should write 752
        Console.WriteLine(ReadWriteExecute.SymbolicToOctal("rwx-x--r-"));
    }
}


373
4
задан 7 февраля 2018 в 12:02 Источник Поделиться
Комментарии
3 ответа

Меня в общем ваша реализация-это хорошее начало, потому что она отделяет разделение строки на пакеты из расчета восьмеричное значение. Вы не делаете это в одном методе.

С помощью switch тоже не такая уж и плохая идея, но тут не хватает случае-нечувствительность, которые должны быть достигнуты с char.ToUpperInvariant


Если ваше приложение не зависит от текущей культуры и зависит от регистра символа меняется предсказуемым образом, использование метода ToUpperInvariant. Метод ToUpperInvariant эквивалентно ToUpper(Чара, свойство CultureInfo.Языка и региона существует).


Вы можете нажать разделение немного дальше и извлечь здесь два служебных метода.

Первое расширение, которое разделяет набор на группы:

public static IEnumerable<IList<T>> Split<T>(this IEnumerable<T> source, int batchLength)
{
var batch = new List<T>();
foreach (var item in source)
{
batch.Add(item);
if (batch.Count == batchLength)
{
yield return batch;
batch = new List<T>();
}
}
}

а второй можно было бы преобразовать char в его восьмеричное значение:

public static int ToOctal(this char value)
{
switch (char.ToUpperInvariant(value))
{
case 'R': return 4;
case 'W': return 2;
case 'X': return 1;
case '-': return 0;
default: throw new ArgumentOutOfRangeException(paramName: nameof(value), message: "Value must be: R, W, X or -");
}
}

Теперь у вас есть два специализированных методов, которые можно легко проверить.


Вы достижения конечного результата путем объединения двух методов и LINQ в третий:

public static IEnumerable<int> CalcPermissions(this string value)
{
const int batchLength = 3;

if (value.Length % batchLength != 0)
{
throw new ArgumentException(paramName: nameof(value), message: $"Value length must be divisible by {batchLength}.");
}

return
from tripple in value.Split(batchLength)
select tripple.Select(c => c.ToOctal()).Sum();
}


Три метода-это то, что я ожидал в качестве ответа на это интервью-вопрос. Должны ли вы использовать switch, словарь, выражения или массива индексация-это совсем другая тема, которая потребуется правильное ориентиры - если исполнение должно быть учтено.

Для меня самое главное, что вы можете разделить большую проблему на меньшие и тестирования из них. На данный момент это не имеет значения, как вы реализуете Split или ToOctal. Пока это отдельные методы, которые можно проверить позже других реализаций, не меняя конечного результата, и, не беспокоясь о нарушении других функций, потому что есть только один за раз вы работаете.

3
ответ дан 8 февраля 2018 в 08:02 Источник Поделиться

Мои мысли по улучшению:


  1. Вам не нужно запускать методом toArray() на строку, чтобы петля через него. Плюс, похоже CalculatePermissionSum() ожидает разрешение одну строку, как "права доступа rwx" или "р-х", так и в фиксированной длины в такой ситуации (где флаги также в определенном порядке), не заморачиваться с петлей.

    int octalPerm = 0;
    octalPerm += (permString[0] == 'r') ? 4 : 0;
    octalPerm += (permString[1] == 'w') ? 2 : 0;
    octalPerm += (permString[2] == 'x') ? 1 : 0;
    return octalPerm;

  2. SymbolicToOctal не учитывает представления разрешения, где первый символ-это флаг разрешения, как каталог "drwx-х-р-"

  3. Нет проверки на ошибки в случае неожиданный стоимость доходит до конца. Если я побежал SymbolicToOctal("Здравствуй, мир!"), я должен действительно сделать исключение какой-то.

  4. Я не согласен с предыдущим комментарием об использовании регулярных выражений для проверки ввода. Проверки это хорошо, но регулярные выражения бы добавить (относительно) огромным количеством накладных для такой простой проверки. Код, который работает на разрешения файла, скорее всего, не должен быть запущен несколько раз здесь и там - это скорее всего, будет использоваться как часть чего-то, что может работать много, поэтому каждый неэффективности будут суммироваться. Если вы проверить, просто проверить длину и ожидаемое отдельных символов. Это может быть больше кода по сравнению с регулярного выражения, но это будет работать намного быстрее.

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

2
ответ дан 8 февраля 2018 в 06:02 Источник Поделиться

Я бы не был впечатлен этим представлением. Вот некоторые из моих заметок:


  • Слишком много тип данных разговоров. Вы преобразование из строки в массив и обратно несколько раз.

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

  • Так как вы будете проверка с помощью регулярных выражений, вы можете избавиться от skip(x) take(3) вещи. Просто использовать Substring().

  • Я не могу выбить эту точку для задач собеседование, но я был бы более впечатлен отдельный класс работе со строками разрешение файла:

    PermissionString permissionString = new PermissionString(permString);
    return permissionString.ToOctal();

1
ответ дан 8 февраля 2018 в 01:02 Источник Поделиться