为什么 Codewars 是学习新编程语言的最佳方式!
为什么选择 Codewars?
入门 8kyu
回顾一下,通过解决这个问题 我学到了什么?
然后呢?
作为一名程序员,你可能会发现自己不得不学习多种编程语言,无论是为了工作还是仅仅为了兴趣。在这篇博客中,我将分享我个人认为学习一门新语言的最佳方法,前提是你对其中一种编程语言已经相当精通。我将尝试学习 C#,并结合 Java、TypeScript 和 C++ 等面向对象编程语言的先验知识。
所以,每当我们学习一些东西时,大多数人都会去 YouTube、找本书或使用一些学习网站来学习。但对于我们这些已经掌握编程基本原理的程序员来说,观看教程来学习如何执行 if 语句可能会相当费劲。不过,我知道市面上有一些书籍甚至教程是专门为那些已经掌握编程基本原理的人准备的,但我想分享一种对我来说很有效的替代方法。
为什么选择 Codewars?
因为他们赞助了我。开个玩笑🤣,我跟Codewars没有任何关系,虽然我真的很想跟他们有关系。
https://codewars.com/是一个出色的网站,它有社区制作的编程挑战,称为Katas,根据难度进行划分。
他们还有一个非常棒的升级系统!
如果您还没有听说过,我建议您去看看,因为我的描述很简短!
入门 8kyu
在 Codewars 中,最简单的问题类型是 8Kyu,我学习新语言时总是从这里开始。
我敢肯定,大多数人在看 kata 时都会认为它太简单了,可能会浪费时间,但这种方法的美妙之处在于它迫使你提出问题,而这些问题对于塑造你对语言的心理模型至关重要。
设置环境
Codewars 有自己的内置编辑器,但对于我们来说,我们希望使用自己的编辑器,这样我们就可以使用调试器等工具深入研究该语言并设置我们自己的测试!
**********内心独白用斜体写成**********
那么,我对 C# 了解多少呢?我知道它运行在一个叫做 .NET 框架的神奇东西上,所以我猜我得下载它?
经过一番谷歌搜索,我发现 .NET Core 是一个可以在 Windows、Linux 和 macOS 上运行的框架,所以我想我应该从它开始。我下载了.NET core SDK。
我假设只要有了这个框架,就能使用任何编辑器吗?我知道大多数 C# 开发人员都使用 Visual Studio,但我看看能不能在 VSCode 中实现。
项目结构:
8Kyu
├── src
│ └── ReverseWords
└── test
└── ReverseWords.Test
使用 .NET,你可以使用命令行创建项目,所以我将 cd 到 ReverseWords 文件夹dotnet new console
(这里将使用控制台应用程序完成这项工作)。现在我的 ReverseWords 文件夹包含:
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 27/07/2019 13:53 obj
-a---- 27/07/2019 13:53 194 Program.cs
-a---- 27/07/2019 13:53 178 ReverseWords.csproj
这些到底是什么?我猜 .cs 是 CSharp 文件,这样说应该没问题,而 csproj 可能包含一些创建项目的元数据?Obj 文件呢?只有天知道了。
所以我没有走太远,.cs 确实包含简单的 hello world 程序:
using System;
namespace ReverseWords
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
}
}
}
.csproj文件包含有关项目中使用的项目程序集中包含的文件、项目GUID和项目版本等的信息。
我认为这是您在项目中指定所需包的地方?
是的,我的假设是正确的,您可以通过 .NET cli 添加您的nuget包:
add package NETCore.Encrypt --version 2.0.7
``` or plonking in the package reference directly.
"The obj/ folder is used to store temporary object files and other files used in order to create the final binary during the compilation process." -[splattne](https://stackoverflow.com/questions/233081/whats-the-obj-directory-for-in-net)
## Running the thing ##
Just playing around with the `dotnet` command there is a `dotnet run` command. Let's give that a shot:
``PS \8kyu\src\ReverseWords> dotnet run
Hello World!``
Brilliant stuff, let's actually try and solve this kata then. Let's grab the function they have for us to solve.
```csharp
public static string ReverseWords(string str)
{
return "";
}
现在添加示例测试,我当前的测试文件夹是空的,如何创建测试项目?
经过一些研究,似乎很多人都使用 xunit:dotnet new xunit
Xunit 不是 .NET Core 的一部分,查看我的 .csproj,这进一步巩固了我之前关于引用 nuget 包的发现!
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.0.1" />
<PackageReference Include="xunit" Version="2.4.0" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.0" />
</ItemGroup>
现在让我们将测试示例添加到我们的新测试项目中。
namespace ReverseWords.Test
{
public class UnitTest1
{
[Fact]
public void Test1()
{
Assert.Equal("world! hello", ReverseWords.Program.ReverseWords("hello world!"));
Assert.Equal("this like speak doesn't yoda", ReverseWords.Program.ReverseWords("yoda doesn't speak like this"));
Assert.Equal("foobar", ReverseWords.Program.ReverseWords("foobar"));
Assert.Equal("kata editor", ReverseWords.Program.ReverseWords("editor kata"));
Assert.Equal("boat your row row row", ReverseWords.Program.ReverseWords("row row row your boat"));
}
}
}
我似乎无法引用我们的实际程序,我该怎么办?
dotnet add reference ..\..\src\ReverseWords\ReverseWords.csproj
现在我收到一个编译时错误,说这个类的保护级别是错误的,好的,我从其他面向对象语言中知道这一点,我怀疑它没有被设置为公共
我是对的,我将这个类公开了,现在当我运行所有测试时它们都失败了,是时候编写代码了!
public static string ReverseWords(string str)
{
StringBuilder sb = new StringBuilder();
string[] words = str.Split(' ');
foreach(var word in words)
{
sb.Insert(0, word + " ");
}
return sb.ToString().Trim();
}
好的,我已经了解了 StringBuilder,它与 Java 非常相似,foreach 语句非常不同,而且我喜欢隐式类型!
这是一个非常简单的解决方案,但它通过了所有的示例测试。
现在,当我提交我的代码时,我可以查看其他人的解决方案并看看我的解决方案如何,幸运的是,通常更好的解决方案位于顶部,因为 Codewars 有特殊标签来表示解决方案是聪明的还是最佳实践!
最佳解决方案如下:
public static string ReverseWords(string str)
{
string[] words = str.Split(' ');
Array.Reverse(words);
return string.Join(" ", words);
}
回顾一下,通过解决这个问题 我学到了什么?
- 什么是 .NET core
- 命令就有力量
dotnet
! - .cs 是什么
- obj/ 文件夹是什么
- csproj 是什么
- Nuget 包是什么以及如何引用它们
- 如何建立一个简单的项目
- 如何设置测试项目
- 如何从另一个项目引用一个项目
- 什么是 xunit 以及如何使用它
- 如何添加测试
- 类型系统、值类型和引用类型
- 字符串生成器
- Array 类充满了有用的静态方法
- string 类也有静态方法
远远超过我从观看视频中学到的知识,而且所花的时间要短得多!
然后呢?
好吧,我们程序员喜欢好的循环,这正是我们在这里所做的,如果你在 8ku 上遇到困难,那么坚持做其他 8kyus,直到你有信心,然后移动到 7kyu、6kyu 等等。我可以做另一个挑战,但你明白我的意思😃
我真的希望有些人在学习新语言时采用这种策略,我很想听听人们对它或其他替代标准方法的看法!
谢谢,如果你喜欢我的漫谈,请访问我的个人博客网站https://codeheir.com/
文章来源:https://dev.to/lukegarrigan/why-codewars-is-the-best-way-to-learn-a-new-programming-language-4216