面向对象的演化过程和解决问题
面向对象的演化过程和解决问题
前言:
相信大家对面向对象这个概念已经很熟悉了,如果你是使用Java入门编程的,一定会被大量灌输:类,继承,多态的概念,但我们真的理解它们吗?一切就好像自然而然,写代码不就应该是这样吗?但事实上这些概念,只是我们脑海中的一个毫无意义的符号,当我们写一个类时,我们只是按照被教导的方式编写。好比现在最多的Web开发,业务是用户的增删改查,我们想到用户会有:name,age,gender属性。于是我们创建一个实体:
class User {
String name;
Integer age;
Integer gender;
}
然后按部就班的写出Mapper(或Dao)层,Service层,Controller层,这就是MVC结构,它是如此的好用,让我们编写简单业务时十分顺手。但是当业务逐渐复杂时,我们在Service,Controller层中添加了大量的外部依赖,各种依赖注入,大量重复的代码堆砌在各个角落,一个变量被各个函数引用修改,当出现问题时,我们不得不到各个函数中查看,到底哪里出了问题,面向对象中的概念已抛到脑后。而且 ...
前端问题解惑
前端问题解惑 如今前端发展的太快了,让我们这些只会基础HTML + CSS + JS的人无所适从,大量的组件,大量的工具,让人不知道到底干嘛的,所以这里写下最近的学习所得,强烈推荐资源:theodinproject 和 modern-javascript-explained-for-dinosaurs。
前后端渲染后端渲染 如果你用过Java编写过Web项目,应该听说过Servlet 和 JSP这玩意儿,Servlet可以处理HTTP请求并生成响应,JSP是简化版的Servlet,用户通过访问Servlet,获取服务端的HTML页面,通过JSP可以在HTML中嵌入Java的代码,比如条件判断,循环,数据访问等等,增强页面展示和动态性。你可能会疑惑,为什么那时候不用Js啊,因为那时候的Js只能做一些简单的动态效果,表单验证之类的功能。
一切看起来不错,但有一些问题存在:
占用服务器资源多,所有计算在服务器完成。
每请求一次,都要从服务器上获取完整的HTML,比如我就想更新页面上一小部分,却需要下载整个页面(这里就引出了后面的ajax)。
...
如何测试驱动开发
前言
最近在读《匠艺整洁之道-程序员的职业修养》这本书,作者鲍勃大叔开篇就用了大量的示例来讨论与演示为什么需要和如何操作测试驱动开发。我是之前写过测试,但从不知道测试如何驱动开发,大部分情况下也只是先写生产代码,写好后再测试,看看是否能调通,再修改代码中隐藏的问题。 而测试驱动开发会扭转这种思维方式,是先写测试,再写对应的生产代码。这一开始让人会觉得很奇怪,感觉并且很麻烦,但当你尝试一下,就会发现这事儿挺有趣,且神奇。 温馨提示:Clean Craftsmanship: Disciplines, Standards, and Ethics (Companion Videos),这个是该书示例操作的视频说明,非常非常非常有用!!! 第一篇是讲述如何通过测试驱动开发来写一个栈结构。我严重怀疑大叔是不是一边写代码一边喝啤酒。整个过程伴随大叔魔性的笑声和宛如魔法般的操作,就好像他在不停调戏编译器。你会通过这个视频感受到如何从零开始,进行测试驱动开发。 下面将讲讲一些基础知识。
为什么需要测试驱动开发?
就我目前的现状,我能感受到重构代码时的痛 ...
发布自己的GEM
生成基础文件结构bundler gem your_gem创建一个基础文件结构第一次使用时,需要配置一些默认值:
测试Creating gem 'demo_gem'...
Do you want to generate tests with your gem?
Future `bundle gem` calls will use your choice. This setting can be changed anytime with `bundle config gem.test`.
Enter a test framework. rspec/minitest/test-unit/(none)
CIDo you want to set up continuous integration for your gem? Supported services:
* CircleCI: https://circleci.com/
* GitHub Actions: https://github.com/features/actions
* GitLab CI: https: ...
RubyConf China所想
时隔三年Ruby China大会在上海再次举行,也趁着这个机会去上海逛了两天,收获许多。
Ruby在如今中国已经是一个非常小众的语言了,大家都在争先恐后的学习:
Java
Go
Python
我能想到的原因就是大部分的公司在用这些语言,大部分人在用这些语言,如果这时候你选择学习一门小众且岗位极少的语言,也就意味着你在偏离"主流",在浪费时间。当你进入一家使用小众语言的公司,你也会担心这是否会影响今后长远的发展。而当你顺应追随"主流"时,你会想我选择了一个最保险的选择,公司都在招聘它。而当所有人都这么想时,主流中便涌入大量的人力,尤其是在中国。而数量的上升,与岗位的减少,让大家只能提高自己的质量,或想想其他出路。
而主流的人越多,支流的人也就越少,小众语言的公司负责人也会因为招人难而担心后续的发展,进而选择技术转型,甚至是在最初决策时,就转向使用人数最多的语言,而不是最适合场景的语言。这也就导致了一个恶性循环,最终主流上的人更多,支流上的人更少。
在我最初学习Ruby时,是因为看了《码农翻身》《程序员修炼之道》时,作者都在提及这个优雅的语言,让 ...
Turbo Rails Tutorial-第十一章
Adding a quote total with Turbo Frames本章节中,我们将添加一个包含quote总价格的sticky bar,每当我们创建,修改,删除一个line item,总价都会被更新。
What we will build in this chapter总价格会在下面的情况中更新:
一个line item被创建,修改,删除
一个line item date被删除,而一个line item date中可能有多个items
下面的草图,将会展示我们的quote编辑器长什么样子:
现在需求明确了,敲代码吧。
**Note: **现在我们已经体验过很多次Turbo Frames了,让我们来讨论一下什么时候使用<turbo-frame> 或是 <div>
当我们需要使用Turbo去拦截点击链接或者表单提交时,我们必须使用Turbo Frame比如line_items/_line_item.html.erb局部页面的内容必须被嵌套到Turbo Frame中,因为当我们点击line item的”Edit”按钮时,我们希望Turbo ...
Turbo Rails Tutorial-第十章
Nested Turbo Frames这一章,我们为line items构建最后的增删改查代码,而line items是嵌入到line items dates中的,为此我们需要使用Turbo Frames去解决一些有趣的挑战。
What we will build in this chapter本章中,我们会大致敲定quote编辑器,通过增加line item到line item date中,每一个line item都拥有名称,可选的描述,单价,数量。
这一章的的挑战是我们将会有大量的嵌套Turbo Frames,我们将讨论如何在操作LineItemDate and LineItem增删改查时,并Quotes#show页面的状态。
在敲代码前,我们在看一下线上的示例:final quote editor,让我们创建一个quote并且进入对应的Quotes#show页面,让每位创建几个 line item dates and line items,来对我们最终的产品有一个确定的概念。
当我们清楚了最终产品的样子,我们就开始吧,我们会先不用Turbo Frames and Tu ...
Turbo Rails Tutorial-第九章
Another CRUD controller with Turbo Rails本章节中,我们将构建quotes中的日期数据的增删改查,这是一个很好的机会去练习我们之前学习的内容。
What we will build in the following three chapters现在用户可以创建,修改,删除quotes数据,是时候让我们的quotes编辑器做一些更有用的事儿。
接下来三章,我们将在Quotes#show页面中构建,当本章结束时,我们的用户可以为每个quotes添加多个日期,而每个日期里有多个条目,每个条目拥有名称,可选的描述信息,数量,单价。
在动手之前,我们可以再在线上实例中体验一下:quote editor on hotrails.dev,创建一个quote,进入Quotes#show页面,我们可以创建多个日期,并在日期里添加多个条目,当我们创建,修改,删除条目时,quote的总额也会被更新。
What we will build in this chapter我们还是在不使用Turbo Frames和Turbo Streams的前提下构建日期数据的增 ...
Turbo Rails Tutorial-第八章
Two ways to handle empty states with Hotwire本章节中,我们将会学习两种方式去使用Turbo控制空状态页,第一种使用Turbo Frames and Turbo Streams,第二种使用 the only-child CSS pseudo-class.
Adding empty states to our Ruby on Rails applications空状态页是我们系统中最重要的一部分,当我们第一次访问页面时,页面上没有任何提示让我们知道这个页面能干嘛。所以如果当一个新用户访问我们系统时,显示一点儿图片或者几句话可以更好的表达页面可以操作什么。
如果我们删除了所有的quotes数据,我们的页面也就只剩下标题和按钮了,所以当数据为空时,使用空状态页也会是一个好的选择。让我们开始吧
Empty states with Turbo Frames and Turbo Streams在敲代码之前,让我们花点儿时间,用草图描述一下将要干嘛。当一个用户没有数据时,我们想展示包含提示信息的空状态
如果用户点击header中的New qu ...
Turbo Rails Tutorial-第七章
Flash messages with Hotwire 本章节,我们将学习如何添加 flash messages 通过Turbo,并且如何通过Stimulus做出好看的动画效果。
Adding flash messages to our CRUD controller现在我们Quote模型的增删改查已经正常运转了,现在我们想添加flash message去提高系统的可用性。
在使用Turbo增加flash message之前,我们需要先来用不使用Turbo的版本,也就是Rails7之前的方式,而为了做到这一点,我们需要禁用Turbo在整个项目中。
// app/javascript/application.js
import "./controllers"
// The two following lines disable Turbo on the whole application
import { Turbo } from "@hotwired/turbo-rails"
Turbo.session.drive = false
这样我们 ...

